Azure VM上的K8s集群执行kubectl命令时出现TLS握手错误求助
嗨,我看到你在Azure VM上运行K8s集群时遇到了这个棘手的TLS握手问题,虽然你已经确认了kubeconfig的正确性、公网IP配置以及证书完整性,但执行kubectl get pods -A还是抛出了下面的错误:
E0617 18:44:33.767685 2601946 memcache.go:265] couldn't get current server API group list: Get "https://SERVER_IP_AND_PORT/api?timeout=32s": tls: first record does not look like a TLS handshake
E0617 18:44:33.780378 2601946 memcache.go:265] couldn't get current server API group list: Get "https://SERVER_IP_AND_PORT/api?timeout=32s": tls: first record does not look like a TLS handshake
E0617 18:44:33.792515 2601946 memcache.go:265] couldn't get current server API group list: Get "https://SERVER_IP_AND_PORT/api?timeout=32s": tls: first record does not look like a TLS handshake
E0617 18:44:33.804779 2601946 memcache.go:265] couldn't ge...
这种错误通常意味着你的kubectl客户端尝试用TLS协议连接,但目标端口返回的并不是TLS格式的响应,我给你几个具体的排查方向,你可以逐一试试:
核对API Server的端口与协议匹配性:你的kubeconfig里用的是
https://前缀,但有可能API Server实际在监听HTTP端口,或者端口映射出了问题。你可以登录到Azure VM的控制平面节点,直接执行curl http://localhost:6443/api(默认API Server端口是6443,如果你的端口不同请替换),如果能返回JSON格式的API响应,说明API Server没启用TLS,或者你kubeconfig里的协议应该改成http://;如果是HTTPS的话,用curl -k https://localhost:6443/api跳过证书验证测试连通性。再次确认证书的SAN字段一致性:虽然你已经检查过证书,但TLS握手失败常和证书的SAN(Subject Alternative Name)不匹配有关。
- 本地执行
openssl x509 -in ~/.kube/config -text -noout(如果kubeconfig在其他路径请调整),查看客户端证书的SAN字段是否包含你访问的API Server公网IP; - 登录到Azure VM上,查看API Server的服务端证书(通常路径是
/etc/kubernetes/pki/apiserver.crt),执行openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout,确认SAN字段里同样包含这个公网IP,同时检查证书是否过期。
- 本地执行
排查网络端口转发与连通性:如果你的API Server公网IP是通过Azure的负载均衡器、NAT规则映射的,可能存在端口转发错误,比如把6443端口转发到了非TLS的端口。你可以在本地用
nc -zv SERVER_IP 6443测试端口是否能连通,之后尝试发送一个简单的HTTP请求:echo -e "GET /api HTTP/1.1\r\nHost: SERVER_IP\r\n\r\n" | nc SERVER_IP 6443,如果返回的是HTML页面或者非TLS相关的内容,说明端口背后的服务不是TLS服务。检查kube-apiserver的启动参数:登录到控制平面节点,执行
ps aux | grep kube-apiserver查看API Server的启动参数,确认:- 是否配置了
--tls-cert-file和--tls-private-key-file,且指向的是正确的证书文件路径; - 是否启用了
--insecure-port参数,如果启用了,可能流量被意外导向了这个不安全端口,导致TLS握手失败。
- 是否配置了
希望这些步骤能帮你定位到问题所在,如果排查过程中发现新的细节,也可以补充出来,我们再进一步分析~
备注:内容来源于stack exchange,提问作者vayuprog

