为kubeadm部署的K8s API Server添加备用IP解决x509报错
kubeadm部署K8s公网访问x509证书校验错误解决方案
问题本质
kubeadm初始化集群时生成的API Server TLS证书,仅覆盖初始化配置时指定的网络地址(集群内部IP 172.26.2.101、集群核心服务网段IP 10.96.0.1),未将主节点的AWS Lightsail公网IP加入证书的*主题备用名称(SAN)*列表,因此本地客户端使用公网IP发起TLS连接时,会因证书有效范围不匹配触发校验失败。
推荐解决方案:为API Server证书补充公网IP SAN
该方式为kubeadm官方支持的标准操作,无安全风险,步骤如下:
- 登录K8s主节点,导出当前集群的kubeadm配置:
kubeadm config view > cluster-config.yaml - 打开
cluster-config.yaml配置文件,定位到apiServer配置段落,在certSANs字段下追加主节点的公网IP(无该字段则手动新增),示例格式:apiServer: certSANs: - 10.96.0.1 - 172.26.2.101 - <对应主节点的AWS Lightsail公网IP> - 基于更新后的配置重新签发API Server证书:
kubeadm certs renew apiserver --config cluster-config.yaml - 等待kubelet自动重启kube-apiserver静态Pod加载新证书:可执行
kubectl -n kube-system delete pod kube-apiserver-<主节点主机名>加速重启过程,10秒左右组件即可完成恢复。 - 证书更新完成后,直接使用本地已替换为公网IP的kubeconfig发起连接即可,无需额外调整客户端证书配置。
临时测试方案:跳过客户端证书校验(存在安全风险,不推荐生产环境使用)
如果仅做临时调试,不想改动集群侧配置,可通过修改本地客户端配置跳过服务端证书校验:
- 单次命令生效:执行kubectl命令时追加参数
--insecure-skip-tls-verify,例如kubectl --insecure-skip-tls-verify get nodes - 长期配置生效:打开本地
.kube/config文件,找到对应集群配置段,删除certificate-authority-data字段,新增配置项insecure-skip-tls-verify: true
风险提示:该配置下客户端不会校验API Server的身份,存在中间人攻击风险,严禁在生产环境开启。
配套排查注意事项
完成证书调整后如果仍无法连接,优先检查以下常见配置问题:
- AWS Lightsail主节点的实例防火墙规则,需放开6443端口的入站访问权限,匹配本地客户端的公网IP来源
- 主节点操作系统内部的防火墙(如ufw、firewalld),需同步放开6443端口,避免被系统层规则拦截
- 若后续主节点公网IP发生变动,只需重复上述证书更新步骤,将新公网IP追加到certSANs列表重新签发证书即可
内容的提问来源于stack exchange,提问作者Nurhun
相关产品推荐
相关产品推荐

