Kubernetes 仪表板:TLS 握手错误

问题描述 投票:0回答:2

我有一个 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.Info{Major:"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.Info{Major:"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"}
kubernetes amazon-eks kubernetes-pod kubernetes-dashboard
2个回答
0
投票

说明:

zerkms 已经在他的评论中阐明了问题的原因:

您的入口可能不理解仪表板终止 tls 本身并尝试在那里发送裸露的 http 请求。所以,无论如何 您用于将流量引入/负载平衡到应用程序 - 应该是 配置为通过 tls 连接。 – zerkms 3 月 19 日 2:55

您还告诉我们,没有配置任何入口,但您使用域名来连接,指向您的LoadBalancer的IP。这没问题,但请记住,当您在 EKS 集群上创建

Service
类型的
LoadBalancer
时,默认情况下会创建 Classic Load Balancer。它工作在 OSI 模型的第 7 层,因此它可以识别 https 流量,终止 TLS 连接,然后向后端 pod 发送裸露的 http 请求。正如 zerkms 已经解释的那样,您的后端不准备处理此类连接,因为它会终止 TLS 本身。

解决方案:

正如我已经提到的,默认情况下,当您创建

LoadBalancer
服务时,会创建 Classic Load Balancer。但是,您可以通过在
Service
中添加以下注释来更改此默认行为,如此处所述:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

由于网络负载均衡器在 OSI 模型的第 4 层上运行,它只是将 TCP 数据包传递到后端 Pod,而无需检查其内容、终止 TLS 等并期望 https 流量。

或者,您可以设置一些入口控制器,其配置为支持SSL-passthrough,例如ngix-ingress,因为AWS的ALB不幸的是不支持它。


-1
投票

如果您想找到有效的 Kubernetes 服务,请立即参考:https://bizflycloud.vn/kubernetes-engine

© www.soinside.com 2019 - 2024. All rights reserved.