Kubernetes 仪表板:TLS 握手错误
Posted
技术标签:
【中文标题】Kubernetes 仪表板:TLS 握手错误【英文标题】:Kubernetes dashboard: TLS handshake error 【发布时间】:2021-06-16 08:52:36 【问题描述】:我有一个 EKS 1.18 集群。当我尝试部署 k8s 仪表板时,它失败并出现以下错误。
另外,我的仪表板 svc 使用 loadBalancer。
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
annotations:
external-dns.alpha.kubernetes.io/hostname: "test.xxx.net"
service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
请告诉我TLS handshake error
是什么意思?我应该怎么做才能修复这个错误?
日志:
2021/03/18 22:03:08 http: TLS handshake error from xx.xxx.x.x:8279: EOF
2021/03/18 22:03:08 http: TLS handshake error from xx.xxx.x.x:34935: EOF
2021/03/18 22:03:08 http: TLS handshake error from xx.xxx.x.x:24437: EOF
2021/03/18 22:03:08 http: TLS handshake error from xx.xxx.x.x:64552: EOF
2021/03/18 22:03:10 http: TLS handshake error from xx.xxx.x.x:5481: EOF
代码:
https://github.com/kubernetes/dashboard/releases/tag/v2.0.3
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
kubectl version
+ kubectl version Client Version: version.InfoMajor:"1", Minor:"16", GitVersion:"v1.16.1", GitCommit:"d647ddbd755faf07169599a625faf302ffc34458", GitTreeState:"clean", BuildDate:"2019-10-02T23:49:20Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64" Server Version: version.InfoMajor:"1", Minor:"18+", GitVersion:"v1.18.9-eks-d1db3c", GitCommit:"d1db3c46e55f95d6a7d3e5578689371318f95ff9", GitTreeState:"clean", BuildDate:"2020-10-20T22:18:07Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"
【问题讨论】:
您的入口可能不理解仪表板会自行终止 tls 并尝试在那里发送裸 http 请求。因此,无论您使用什么来入口/负载平衡应用程序的流量 - 都应该配置为通过 tls 连接。 您究竟是如何访问仪表板的?使用负载均衡器的 IP 地址或某个域?您是否还配置了任何入口资源? 使用域名,没有配置任何入口 "没有配置任何入口" ---好吧,连接到它的人会在没有 tls 的情况下执行 http 【参考方案1】:说明:
zerkms 已经在他的评论中阐明了您的问题的原因:
您的入口可能不理解仪表板终止 tls 本身并尝试在那里发送裸 http 请求。所以,不管 您用来入口/负载平衡应用程序的流量 - 应该是 配置为通过 tls 连接。 – zerkms 3 月 19 日 2:55
您还告诉我们,没有配置任何入口,但您用于连接域名,指向您的 LoadBalancer 的 IP。这很好,但请记住,当您在 EKS 集群上创建 LoadBalancer
类型的 Service
时,默认情况下会创建 Classic Load Balancer。它适用于 OSI 模型的第 7 层,因此它可以识别 https 流量,终止 TLS 连接,然后将裸 http 请求发送到您的后端 pod。正如zerkms 已经解释的那样,您的后端不准备处理此类连接,因为它会终止 TLS 本身。
解决方案:
正如我已经提到的,默认情况下,当您创建LoadBalancer
服务时,会创建经典负载均衡器。但是,您可以通过在您的 Service
中添加 here 中提到的以下注释来更改此默认行为:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
由于网络负载均衡器在 OSI 模型的第 4 层上运行,它只是将 TCP 数据包传递到您的后端 pod,而无需检查其内容、终止 TLS 等,并期待 https 流量。
或者,您可以设置一些 ingress 控制器,而 is configured to support SSL-passthrough 就像 ngix-ingress 作为 AWS 的 ALB 不幸的是没有支持一下。
【讨论】:
以上是关于Kubernetes 仪表板:TLS 握手错误的主要内容,如果未能解决你的问题,请参考以下文章
Websocket++ 错误:handle_transport_init 收到错误:TLS 握手失败
找不到合适的服务器(`serverSelectionTryOnce` set):[TLS握手失败:错误:14090086:SSL例程:ssl3_get_server_certificate confi