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 握手错误的主要内容,如果未能解决你的问题,请参考以下文章

Go TLS 握手错误

Websocket++ 错误:handle_transport_init 收到错误:TLS 握手失败

net/http:使用 KOPS 的 TLS 握手超时

SSL/TLS 握手中出现问题

找不到合适的服务器(`serverSelectionTryOnce` set):[TLS握手失败:错误:14090086:SSL例程:ssl3_get_server_certificate confi

Kubernetes仪表板-尝试生成管理员令牌时出现ansible任务错误