You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)中:

  1. 备份原证书:
    cp /etc/kubernetes/pki/apiserver.{crt,key} /etc/kubernetes/pki/apiserver.{crt,key}.bak
    
  2. 创建证书签名请求配置文件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
    
  3. 生成新证书:
    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
    
  4. 重启kube-apiserver容器:
    crictl restart $(crictl ps | grep kube-apiserver | awk '{print $1}')
    
  5. 更新/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依赖:

  1. 申请动态域名服务,将虚拟机IP与域名绑定,IP变更时自动更新域名解析。
  2. 重新生成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
    
  3. 按照临时方案的步骤重新生成证书并重启kube-apiserver。
  4. 修改/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:42:13