外网通过 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
安全注意事项
- 证书安全:kubeconfig 文件包含证书信息,请妥善保管
- 网络限制:建议通过白名单 IP 限制 API Server 的访问来源
- TLS 版本:确保使用 TLS 1.2+,禁用低版本 TLS
- 定期轮换:证书有有效期,需定期执行
kubeadm certs renew
总结
通过重签 API Server 证书加入公网 IP 的 SAN,可以安全地在外网通过 kubeconfig 管理内网 K8s 集群。如果有负载均衡器或多 Master 场景,只需在 --apiserver-cert-extra-sans 中一并加入即可。如果需要更灵活的网络方案,也可以考虑 Nginx 反向代理或者 VPN 连接。
Comments | 0条评论