问题描述
在执行 kubectl get nodes 命令后,产生如下错误:
# kubectl get nodes Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 172.16.187.21, not 170.34.184.65
我们出现该问题的场景:将远程节点的 .kube/config 复制到本地,并修改 clusters.cluster.server 来使用 170.34.184.65 地址连接 apiserver,以试图从本地来连接(管理)远程服务器;
原因分析
初始化集群的 CA 并未包含 170.34.184.65 地址,所以在连接集群时会产生该错误;
使用如下命令查看 CA 的 SAN 信息:
# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text ... X509v3 Subject Alternative Name: DNS:k8scp-01, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:k8scp-endpoint.k4nz.com, IP Address:10.96.0.1, IP Address:172.16.187.21 ...
根据命令输出(省略部分无关内容),字段 X509v3 Subject Alternative Name 显示仅能够连接 apiserver 的 DNS 及 IP Address 信息;
解决方案
很多解决方案:
1)在我们的环境中,我们调整 DNS 解析设置:内网 DNS 请求,返回 172.16.187.21 地址;外网 DNS 请求,返回 170.34.184.65 地址。或者,修改 HOSTS 文件(手动绑定)
2)更复杂一点,需要重新签发 apiserver 证书,参考 Manage TLS Certificates in a Cluster | Kubernetes 文档;
参考文献