「Kubernetes Debugging」- Unable to connect to the server: x509: certificate is valid for …, not …

  CREATED BY JENKINSBOT

问题描述

在执行 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 文档。

参考文献

Henry Xie ‘s blog: Kubectl: Unable to connect to the server: x509: certificate is valid for ….. , not ….. in K8S