Kubernetes v1.9.4环境下kubectl exec报TLS握手错误求助
你好,结合你的环境(Kubernetes v1.9.4 + Docker v1.12.5,1个master节点+3个worker节点)和报错信息,这个TLS握手失败的问题大概率和代理配置或集群网络/证书有关,我整理了几个排查方向和解决方法:
1. 优先检查代理的no_proxy配置
虽然你已经设置了http_proxy和https_proxy,但如果没把Kubernetes集群内部的地址加入到不走代理的列表里,kubectl访问API Server时会走代理,而代理通常无法正确处理集群内部的TLS流量,就会触发这个错误。
先查看当前的代理环境变量:
echo $http_proxy $https_proxy $no_proxy
如果no_proxy里没有包含API Server的IP(10.184.154.321)、集群的Pod CIDR、Service CIDR这些内部地址,赶紧加进去:
# 替换成你的集群实际内部IP段,比如这里添加API Server IP和10.180开头的网段 export no_proxy=$no_proxy,10.184.154.321,10.180.0.0/16
之后再试kubectl exec -it host -- /bin/bash。如果要永久生效,把这条命令加到~/.bashrc或者/etc/profile里就行。
2. 验证API Server的TLS证书和kubeconfig配置
这个错误也可能是API Server的TLS证书有问题,或者你本地的kubeconfig文件配置不对。
先看一下当前kubeconfig的关键配置:
kubectl config view --minify确认
server字段是正确的API Server地址,certificate-authority-data对应的证书是有效的,或者如果集群允许不安全连接的话,insecure-skip-tls-verify是否设置正确。直接测试API Server的TLS连接是否正常:
openssl s_client -connect 10.184.154.321:6443如果这个命令连不上或者报错,说明master节点上的API Server证书配置有问题,得去检查API Server的启动参数和证书文件。
3. 检查集群网络连通性
确保你执行kubectl的机器能直接访问API Server的6443端口,没有被防火墙、安全组或者集群网络策略拦截。用nc或者telnet测一下:
nc -zv 10.184.154.321 6443
如果连接失败,先开放这个端口的访问权限,再重试exec命令。
4. 确认kubectl和集群版本兼容性
虽然你的kubectl版本应该和集群版本一致(v1.9.4),但还是确认一下:
kubectl version
Kubernetes要求client和server版本差不能超过1个小版本,版本不兼容也可能导致这类奇怪的连接问题。
内容的提问来源于stack exchange,提问作者Raj Dosi

