我有一个 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"}
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不幸的是不支持它。
如果您想找到有效的 Kubernetes 服务,请立即参考:https://bizflycloud.vn/kubernetes-engine