Kubernetes通过自定义域名访问报x509证书不匹配问题如何解决?
问题根因
你遇到的报错本质是Kubernetes API Server的服务端TLS证书未包含自定义域名my_domain.com作为使用者可选名称(SAN),和你为用户Bob生成的客户端认证证书无关,你给客户端证书添加SAN的操作对解决这个问题没有作用。
解决方案
方案1:生产可用正式配置(推荐)
以kubeadm部署的集群为例,二进制部署集群可对应调整操作:
- 步骤1:更新kubeadm配置的证书SAN列表
执行命令导出现有集群配置:
kubeadm config view > kubeadm-config.yaml
编辑yaml文件,在apiServer字段下新增/修改certSANs配置,原有IP、域名不要删除,仅新增你的自定义域名即可:
apiServer: certSANs: - control-plane # 原有保留域名 - my_domain.com # 新增你的自定义域名 # 原有其他IP、域名全部保留即可
- 步骤2:重新生成API Server服务端证书
先备份原有旧证书避免故障:
mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.bak mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.bak
基于更新后的配置重新生成证书:
kubeadm init phase certs apiserver --config kubeadm-config.yaml
- 步骤3:重启API Server生效
kubeadm部署的API Server默认是静态Pod,删除Pod后kubelet会自动用新证书重建:
kubectl delete pod -n kube-system kube-apiserver-<控制平面节点主机名>
也可以直接重启kubelet服务触发重建:
systemctl restart kubelet
- 步骤4:本地验证访问
等待API Server启动完成后,在本地执行kubectl cluster-info即可验证通过my_domain.com正常访问集群。
如果是非kubeadm二进制部署的集群,核心逻辑一致:重新用集群根CA签发包含my_domain.com作为SAN的API Server服务端证书,替换原有证书后重启API Server即可。
方案2:临时测试方案(生产禁用)
如果仅做临时测试不想修改服务端配置,可以在本地kubeconfig的cluster配置中添加跳过TLS校验参数,忽略证书域名不匹配问题:
clusters: - cluster: certificate-authority-data: <..Q0FURS0tLS0tCk..> server: https://my_domain.com:<port> insecure-skip-tls-verify: true # 新增这一行 name: bob
注意该配置会跳过服务端证书校验,存在中间人攻击风险,仅可用于临时测试场景。
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

