WSの小屋

外网通过 kubeconfig 访问内网下 K8s 集群

在公有云上组建 K8s 集群时,通常使用绑定在节点网卡上的私网 IP(如 192.168.x.x)来部署。但我们可能在本地电脑上使用 kubeconfig 文件远程管理集群,这时就会遇到证书 IP 校验的问题。

问题现象

将 kubeconfig 文件中 server 地址改为 Master 的公网 IP 后,执行 kubectl 命令报错:

Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 192.168.0.x, not x.x.x.x

原因分析:K8s 的 API Server 证书只签发了内网 IP,不包含公网 IP,所以客户端使用公网 IP 连接时证书校验失败。

解决方案:重签 API Server 证书

以下以 kubeadm 部署的集群 为例,其他部署方式原理相同,文件路径可能略有差异。

第一步:备份当前配置

cp -r /etc/kubernetes /etc/kubernetes.bak

第二步:删除旧证书

rm /etc/kubernetes/pki/apiserver.*

第三步:重新生成证书

kubeadm init phase certs apiserver \
  --apiserver-advertise-address ${原来的内网 IP} \
  --apiserver-cert-extra-sans ${Master 的外网 IP}

参数说明:

  • --apiserver-advertise-address:填写 Master 的内网 IP(即最初部署时使用的 IP)
  • --apiserver-cert-extra-sans:额外添加的 SAN(Subject Alternative Name),可以添加公网 IP 或多个域名

支持多个 SAN

kubeadm init phase certs apiserver \
  --apiserver-advertise-address 192.168.0.100 \
  --apiserver-cert-extra-sans 123.123.123.123,k8s.example.com,other-domain.com

第四步:刷新 admin.conf

cd /etc/kubernetes/pki
kubeadm certs renew admin.conf

第五步:替换 kubeconfig 中的 IP

# 将 admin.conf 中的内网 IP 替换为公网 IP
sed -i 's/192.168.0.100/123.123.123.123/g' /etc/kubernetes/admin.conf

# 复制到本机 kubeconfig
cp /etc/kubernetes/admin.conf ~/.kube/config

第六步:重启 API Server

kubectl -n kube-system delete pod -l component=kube-apiserver

API Server 会自动重新创建,此时新的证书就会生效。

替代方案:Nginx 反向代理

如果不想动证书,也可以通过 Nginx 做四层代理转发:

服务端配置

# 在带有公网的机器上部署
stream {
    upstream k8s-apiserver {
        server 192.168.0.100:6443;
    }

    server {
        listen 6443;
        proxy_pass k8s-apiserver;
    }
}

客户端配置

kubeconfig 中的 server 地址改为代理服务器的公网 IP:

clusters:
- cluster:
    server: https://123.123.123.123:6443
    certificate-authority-data: <ca证书>
  name: kubernetes

优点:无需重签证书 缺点:需要额外维护一台代理服务器

多 Master 场景

如果你的集群有多个 Master 节点,建议使用负载均衡器:

# 生成证书时添加负载均衡器的 VIP 或域名
kubeadm init phase certs apiserver \
  --apiserver-advertise-address 192.168.0.100 \
  --apiserver-cert-extra-sans 123.123.123.123,lb.k8s.example.com

验证结果

# 复制 kubeconfig 到本地,测试连接
kubectl cluster-info
kubectl get nodes
kubectl get pods --all-namespaces

安全注意事项

  1. 证书安全:kubeconfig 文件包含证书信息,请妥善保管
  2. 网络限制:建议通过白名单 IP 限制 API Server 的访问来源
  3. TLS 版本:确保使用 TLS 1.2+,禁用低版本 TLS
  4. 定期轮换:证书有有效期,需定期执行 kubeadm certs renew

总结

通过重签 API Server 证书加入公网 IP 的 SAN,可以安全地在外网通过 kubeconfig 管理内网 K8s 集群。如果有负载均衡器或多 Master 场景,只需在 --apiserver-cert-extra-sans 中一并加入即可。如果需要更灵活的网络方案,也可以考虑 Nginx 反向代理或者 VPN 连接。

Comments | 0条评论