VM IP频繁变更致kubectl无法连接K8s集群的证书问题解决
解决K8s集群IP频繁变更后的连接问题
临时应急方案(快速恢复连接)
方法1:跳过证书验证(仅限测试环境)
编辑/root/.kube/config,在集群配置块中添加insecure-skip-tls-verify: true,示例如下:
clusters: - cluster: certificate-authority-data: xxxxxxx server: https://10.160.194.67:6443 insecure-skip-tls-verify: true # 新增该行,跳过证书IP验证 name: kubernetes
修改后直接执行kubectl get pods即可恢复连接,此方法不安全,仅用于测试场景。
方法2:临时更新kube-apiserver证书SAN
如果需要保留证书验证,可临时将新IP添加到证书的主题备用名称(SAN)中:
- 备份原证书:
cp /etc/kubernetes/pki/apiserver.{crt,key} /etc/kubernetes/pki/apiserver.{crt,key}.bak - 创建证书签名请求配置文件
apiserver-new-ip.cnf:[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local IP.1 = 10.96.0.1 IP.2 = 192.168.1.75 IP.3 = 10.160.194.67 # 替换为你的新IP - 生成新证书:
openssl x509 -req -in /etc/kubernetes/pki/apiserver.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/apiserver.crt -days 365 -extensions v3_req -extfile apiserver-new-ip.cnf - 重启kube-apiserver容器:
crictl restart $(crictl ps | grep kube-apiserver | awk '{print $1}') - 更新
/root/.kube/config中的server字段为新IP,即可正常使用kubectl。
长期适配方案(IP频繁变更场景)
方案1:控制节点本地用回环地址连接
如果kubectl是在集群控制节点(虚拟机本身)上操作,直接修改/root/.kube/config中的server地址为https://127.0.0.1:6443,无需关注外部IP变化,因为回环地址默认会被包含在kube-apiserver的证书SAN中(若未包含,可临时添加到证书SAN或跳过验证)。
方案2:动态DNS+域名证书
适合需要远程连接集群的场景,彻底摆脱IP依赖:
- 申请动态域名服务,将虚拟机IP与域名绑定,IP变更时自动更新域名解析。
- 重新生成kube-apiserver证书,将动态域名加入SAN:
创建配置文件apiserver-domain.cnf:[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local DNS.5 = your-dynamic-domain.com # 替换为你的动态域名 IP.1 = 10.96.0.1 IP.2 = 127.0.0.1 - 按照临时方案的步骤重新生成证书并重启kube-apiserver。
- 修改
/root/.kube/config中的server地址为https://your-dynamic-domain.com:6443,后续IP变更时,DDNS自动更新解析即可,无需修改证书和kubeconfig。
方案3:自动化脚本适配(测试环境)
写一个简单脚本,每次IP变更后自动更新kubeconfig并跳过验证:
#!/bin/bash # 自动获取当前虚拟机IP NEW_IP=$(hostname -I | awk '{print $1}') # 更新kubeconfig中的server地址 kubectl config set-cluster kubernetes --server=https://$NEW_IP:6443 # 开启跳过证书验证 kubectl config set-cluster kubernetes --insecure-skip-tls-verify=true
保存为update-kubeconfig.sh,赋予执行权限chmod +x update-kubeconfig.sh,每次IP变更后运行即可。
内容的提问来源于stack exchange,提问作者myquest6 sh
相关产品推荐
相关产品推荐

