Kops部署的AWS Kubernetes集群更换Server URL后kubectl证书问题解决
解决kops部署Kubernetes集群更换Server URL后的证书验证问题
这个问题的核心是Kubernetes API Server的TLS证书不包含你的新域名——证书里的SAN(Subject Alternative Names)列表只包含旧域名和集群内部域名,所以用新域名访问时会触发x509验证失败。用kops可以很平滑地更新证书,而且最小化对集群的影响,不需要重建整个集群。
以下是具体操作步骤:
1. 更新kops集群配置,添加新域名到API Server证书SAN
首先需要修改集群的kops配置,把新域名加入API Server的证书允许列表:
kops edit cluster <你的集群名称> --state <你的state存储路径,比如s3://my-kops-state>
在打开的YAML编辑器中,找到spec.kubeAPIServer节点(如果没有就新增),添加或更新certSANs字段,同时保留旧域名和原有内部域名(避免中断现有访问):
spec: kubeAPIServer: certSANs: - old-server-url.com - internal.old-server-url.com - new-server-url.com - kubernetes - kubernetes.default - kubernetes.default.svc - kubernetes.default.svc.cluster.local
保存并退出编辑器。
2. 应用配置更新并生成新证书
执行kops更新命令,让配置生效并生成包含新域名的API Server证书:
kops update cluster <你的集群名称> --state <你的state存储路径> --yes
这个命令会对比当前集群状态和修改后的配置,自动生成新的API Server证书并存储到你的state存储中。
3. 滚动重启Master节点,让新证书生效
为了让新证书被API Server加载,需要滚动重启Master节点(只重启Master,不影响Worker节点,最小化业务影响):
kops rolling-update cluster <你的集群名称> --state <你的state存储路径> --instance-group master --yes
kops会逐个重启Master节点,在重启期间其他Master节点会继续处理请求,所以集群不会出现 downtime。
4. 更新kubeconfig并验证访问
最后,把kubeconfig中的Server URL切换为新域名:
kubectl config set-cluster <你的集群名称> --server=https://new-server-url.com
现在执行kubectl get pods应该就能正常访问集群,不会再出现x509证书错误了。
额外注意事项
- 暂时不要删除旧域名的SAN条目,直到确认所有客户端(比如CI/CD工具、其他运维脚本)都切换到新域名,避免旧访问方式失效。
- 可以用以下命令验证新证书是否包含你的新域名:
输出中应该能看到openssl s_client -connect new-server-url.com:443 | openssl x509 -noout -text | grep -A 10 "Subject Alternative Name"DNS:new-server-url.com的条目。
内容的提问来源于stack exchange,提问作者rahim
相关产品推荐
相关产品推荐

