为K3s/Kubernetes集群TLS证书添加额外浮动IP以解决kubectl SSL连接验证失败问题
K3s/Kubernetes集群TLS证书添加额外浮动IP以解决kubectl SSL连接验证失败问题
我完全懂你遇到的困扰——用Keepalived给K3s集群配了浮动IP,但kubectl连这个IP时一直报TLS证书验证失败,本质就是集群API Server的证书里没把这个浮动IP加进去。别担心,咱们一步步搞定它:
解决步骤
1. 先备份证书(重中之重!)
操作前先把现有证书目录备份一份,防止失误搞崩集群:
cp -r /var/lib/rancher/k3s/server/tls /var/lib/rancher/k3s/server/tls.bak
提示:所有control-plane节点都要执行这个备份操作哦
2. 把浮动IP加入证书的SAN列表
K3s自带--tls-san参数,专门用来给证书添加额外的IP或域名(也就是Subject Alternative Names),咱们把浮动IP加进去就行,根据你的K3s启动方式选对应的配置方法:
方式一:修改systemd服务配置(如果用systemd管理K3s)
编辑K3s的systemd服务文件:
vi /etc/systemd/system/k3s.service
找到ExecStart那一行,在末尾追加--tls-san 192.168.2.80,修改后大概是这样:
ExecStart=/usr/local/bin/k3s server \ --tls-san 192.168.2.80 \ # 这里保留你原来的其他参数
保存退出后,重载systemd并重启K3s:
systemctl daemon-reload systemctl restart k3s
方式二:用K3s配置文件(更持久的方式)
如果你的K3s是通过配置文件启动的(默认路径/etc/rancher/k3s/config.yaml),直接在文件里加一行:
tls-san: 192.168.2.80
然后重启K3s服务:
systemctl restart k3s
注意:所有control-plane节点都要做这个配置修改和重启,因为Keepalived可能把浮动IP切到任意节点,每个节点的API Server证书都得包含这个IP
3. 更新kubectl的配置
把kubectl指向的集群地址改成浮动IP:
kubectl config set-cluster default --server=https://192.168.2.80:6443
或者直接编辑你的kubeconfig文件(一般在~/.kube/config),找到clusters下的server字段,替换成浮动IP就行。
4. 验证连接是否正常
现在跑个命令测试下:
kubectl get nodes
要是能正常返回节点列表,那问题就彻底解决啦!
额外小提示
- 如果你的浮动IP是域名而非IP,同样可以用
--tls-san参数添加,比如--tls-san k8s.mycluster.com - 重启K3s后会自动重新生成包含浮动IP的证书,不用手动折腾证书生成
- 后续加新的control-plane节点时,记得给新节点也加上这个
--tls-san配置
备注:内容来源于stack exchange,提问作者Marc




