kubeadm join报无法验证API Server身份x509证书错误修复方案
问题原因
kubeadm join预检阶段报x509证书校验错误,核心原因是kube-apiserver签发的TLS证书SAN(主体备用名称)列表未包含你使用的外部IPXXX.XXX.XXX.XXX。kubeadm初始化集群时,默认只会将控制平面节点内网IP、kubernetes服务集群IP(即报错中的10.96.0.1)、默认内置域名加入证书信任列表,不会自动添加公网/额外外部IP,因此用外部IP访问API Server时会触发证书合法性校验失败。
报错中提到的missing optional cgroups: blkio为非阻断警告,不影响节点加入流程,无需额外处理。
修复方案
根据集群当前状态二选一操作即可:
方案一:集群未部署业务,可重新初始化(操作最简单)
- 在控制平面节点执行
kubeadm reset清理原有集群配置,执行前确认节点上无需要保留的业务数据。 - 新建kubeadm初始化配置文件,将外部IP加入apiserver的证书SAN列表,示例配置如下,注意替换成你实际的版本、网段参数:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: "v1.27.3" # 替换为实际部署的Kubernetes版本 controlPlaneEndpoint: "XXX.XXX.XXX.XXX:6443" # 填写用于节点接入的外部IP apiServer: certSANs: - "10.96.0.1" - "10.0.0.71" - "XXX.XXX.XXX.XXX" # 新增需要加入的外部IP - "kubernetes" - "kubernetes.default" - "kubernetes.default.svc" - "kubernetes.default.svc.cluster.local" networking: podSubnet: "10.244.0.0/16" # 替换为实际使用的Pod网段,flannel默认用该网段 serviceSubnet: "10.96.0.0/12"
- 执行初始化命令:
kubeadm init --config=kubeadm-config.yaml - 初始化完成后,按照输出提示重新生成join命令,到工作节点执行即可正常接入。
方案二:集群已运行业务,无法重新初始化(在线更新证书,无业务中断)
- 登录控制平面节点,先备份原有证书目录,防止操作失误导致集群故障:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
注意:该备份操作必须执行,若证书更新失败可通过回滚备份文件快速恢复集群 - 导出当前集群的kubeadm配置文件:
kubectl get configmap kubeadm-config -n kube-system -o yaml > kubeadm-config.yaml - 编辑导出的
kubeadm-config.yaml文件,找到ClusterConfiguration配置块,在apiServer字段下新增certSANs列表,保留原有已存在的IP、域名条目,新增外部IPXXX.XXX.XXX.XXX。 - 执行命令重新生成apiserver证书:
kubeadm init phase certs apiserver --config kubeadm-config.yaml - 重启kubelet加载新证书:
systemctl restart kubelet - 等待30-60秒待apiserver恢复正常后,验证证书是否已添加目标外部IP:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A 10 "Subject Alternative Name"
输出结果中能看到你添加的外部IP,即代表证书更新成功。 - 回到待接入的工作节点,重新执行原kubeadm join命令即可完成接入。
修复验证
在待接入节点执行以下命令测试API Server连通性,无证书报错即代表修复完成:curl -k https://XXX.XXX.XXX.XXX:6443/version
正常情况下会返回Kubernetes版本信息的JSON串。
内容的提问来源于stack exchange,提问作者Stas Ivanov
相关产品推荐
相关产品推荐

