如何向X509证书添加公网IP以访问Kubernetes API Server
解决kubeadm部署Kubernetes集群apiserver公网访问证书校验失败问题
报错本质:kubeadm生成apiserver证书时默认仅加入集群服务IP、节点内网IP等SAN字段,未包含公网IP/域名,因此公网访问时x509校验不通过。
操作步骤(所有操作均在Master节点执行)
- 第一步:备份现有证书,避免操作异常可回滚
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
- 第二步:导出当前集群的kubeadm配置文件
kubectl get configmap kubeadm-config -n kube-system -o jsonpath={.data.ClusterConfiguration} > kubeadm-config.yaml
- 第三步:修改kubeadm配置文件,新增公网IP和域名到证书SAN列表
打开kubeadm-config.yaml,找到apiServer配置段,新增certSANs配置(已存在则直接追加条目):
apiServer: certSANs: - 10.96.0.1 # 原有集群服务IP - 172.29.217.209 # 原有节点内网IP - 107.124.83.31 # 新增你的公网IP - api.your-domain.com # 新增你要使用的公网域名,没有可省略 extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s
- 第四步:删除旧的apiserver证书,触发kubeadm生成新证书
rm /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.key
- 第五步:基于修改后的配置生成新的apiserver证书
kubeadm init phase certs apiserver --config kubeadm-config.yaml
- 第六步:验证证书是否已包含新增的公网IP/域名
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A 10 "Alternative Name"
输出中可以看到你新增的公网IP和域名即代表配置生效。
- 第七步:重启apiserver加载新证书
kubeadm部署的apiserver为静态Pod,直接移动静态Pod清单触发重启即可:
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ sleep 20 mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
等待1-2分钟后apiserver即可加载新证书启动完成。
- 第八步:更新访问用kubeconfig
将Master节点上/etc/kubernetes/admin.conf文件拷贝到本地访问设备的~/.kube/config路径,替换文件内server地址为你的公网IP或域名即可正常访问。
注意事项
- 多Master集群需要在每台Master节点上依次执行上述证书生成、重启apiserver操作
- 需确认公网安全组/防火墙已放开6443端口的入站访问规则
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

