kubernetes-证书过期,重建证书

kubernetes 版本:1.9.x,安装方式,使用二进制文件,手工安装(参考:https://github.com/opsnull/follow-me-install-kubernetes-cluster/tree/v1.6.2);

由于当初安装kubernetes,制作证书的时候,设置了证书的有效期只有1年。到一年后,所有节点都变为noready状态。检查kubelet服务的日志,提示认证master api错误,再查询证书,发现证书的期效已经过期了。

mac-temp:~ my$ kubectl get all
error: {batch  cronjobs} matches multiple kinds [batch/v1beta1, Kind=CronJob batch/v2alpha1, Kind=CronJob]

1.ca
创建证书:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
把ca和ca-config 分发到master和node节点
cp ca*.pem /etc/kubernetes/ssl/
cp ca-config.json /etc/kubernetes/ssl/ 

2.etcd :
# journalctl -xe -u etcd
6月 22 20:18:57 etcd-host0 etcd[1999]: 7cdce46dc25233db is starting a new election at term 14888
6月 22 20:18:57 etcd-host0 etcd[1999]: 7cdce46dc25233db became candidate at term 14889
6月 22 20:18:57 etcd-host0 etcd[1999]: 7cdce46dc25233db received MsgVoteResp from 7cdce46dc25233db at term 14889
6月 22 20:18:57 etcd-host0 etcd[1999]: 7cdce46dc25233db [logterm: 9666, index: 2786386] sent MsgVote request to e89e3672c1e28683 at term 14889
6月 22 20:18:57 etcd-host0 etcd[1999]: 7cdce46dc25233db [logterm: 9666, index: 2786386] sent MsgVote request to 9fab81cb90be4c1e at term 14889
6月 22 20:18:57 etcd-host0 etcd[1999]: failed to write 9fab81cb90be4c1e on pipeline (x509: certificate has expired or is not yet valid)
6月 22 20:18:57 etcd-host0 etcd[1999]: failed to write e89e3672c1e28683 on pipeline (x509: certificate has expired or is not yet valid)
6月 22 20:18:57 etcd-host0

<think>我们正在讨论KubeSphere API证书过期后的更新方法。根据引用[2]的内容,我们知道证书的路径需要根据实际情况填写,并且更新后需要重启kube-apiserver服务。同时,引用[4]提到在安装过程中可能遇到镜像拉取问题,但这里我们关注的是证书更新。 在Kubernetes集群中,KubeSphere的API证书通常依赖于Kubernetes API Server的证书。因此,当证书过期时,我们需要更新Kubernetes API Server的证书。 步骤: 1. 使用kubeadm更新证书: ```bash kubeadm certs renew apiserver ``` 这条命令会更新API Server的证书和密钥。 2. 重启API Server服务: 由于API Server是以静态Pod的形式运行,我们可以通过删除其Pod来触发重启(kubelet会自动重新创建)。首先,确定API Server Pod的名称: ```bash kubectl get pods -n kube-system | grep kube-apiserver ``` 然后删除该Pod(注意:这将导致API Server短暂不可用,请确保在维护窗口操作): ```bash kubectl delete pod <apiserver-pod-name> -n kube-system ``` 或者,如果集群是使用系统服务(如systemd)管理的,则可以通过重启kubelet服务来触发(但通常静态Pod的删除和重建kubelet自动完成,所以直接删除Pod即可): ```bash systemctl daemon-reload && systemctl restart kube-apiserver ``` 但是注意,在kubeadm部署的集群中,API Server通常作为静态Pod运行,因此重启kubelet也会导致所有静态Pod重启,但这样影响较大。所以更推荐直接删除API Server的Pod。 3. 验证证书是否更新: ```bash openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not ``` 检查输出的开始和结束时间,确保证书已更新。 4. 更新kubeconfig文件(如果需要): 有时,客户端kubeconfig文件中的证书也可能过期。我们可以使用以下命令更新: ```bash kubeadm init phase kubeconfig admin --config /etc/kubernetes/kubeadm-config.yaml mv /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config ``` 然后重新设置kubectl的上下文。 5. 在KubeSphere中,如果使用了自定义的证书,也需要确保这些证书得到更新。KubeSphere控制台可能使用自己的证书,但通常它复用Kubernetes证书。 注意:在更新证书后,KubeSphere控制台可能因为证书缓存而出现短暂的问题,可以尝试清除浏览器缓存或重启浏览器。 如果KubeSphere组件(如ks-apiserver)也使用了相同的证书,那么它们可能不需要单独更新,因为它们使用的是Kubernetes的API Server证书。但是,如果KubeSphere有自己的证书(例如,通过Ingress暴露控制台时使用的证书),那么需要单独更新Ingress的证书。 对于KubeSphere控制台通过Ingress暴露的情况,更新证书的方法: 1. 将新的证书和密钥保存为Secret: ```bash kubectl create secret tls ks-console-secret --cert=新的证书文件 --key=新的密钥文件 -n kubesphere-system --dry-run=client -o yaml | kubectl apply -f - ``` 2. 更新Ingress资源以引用新的Secret(如果之前没有引用,或者需要更新): ```bash kubectl edit ingress ks-console -n kubesphere-system ``` 在TLS部分,指定新的Secret名称。 3. 等待Ingress控制器重新加载配置。 以上步骤应该能够解决KubeSphere API证书过期的问题。 注意:在操作前,请备份重要数据,并确保在维护窗口进行。 如果用户遇到问题,可以参考KubeSphere社区双周报[^1]中的贡献者经验,或者查看社区是否有类似问题的解决方案。 相关问题: 1. 如何检查Kubernetes集群中的证书过期时间? 2. KubeSphere控制台无法访问,如何排查证书问题? 3. 如何为KubeSphere配置自定义域名和证书? 4. 在KubeSphere中更新证书后,为什么控制台仍然显示不安全? 5. 如何更新Kubernetes集群中其他组件的证书(如etcd)?</think>### KubeSphere API 证书过期更新方法 当 KubeSphere API 证书过期时,可按以下步骤更新(**操作需在集群 master 节点执行**): --- #### 1. **证书续期** ```bash # 续期所有 Kubernetes 控制平面证书 sudo kubeadm certs renew all # 单独续期 API Server 证书 sudo kubeadm certs renew apiserver ``` > 证书默认位置:`/etc/kubernetes/pki/apiserver.{crt,key}`[^2] --- #### 2. **重启 API Server** ```bash # 重启 API Server 服务 sudo systemctl daemon-reload && sudo systemctl restart kube-apiserver # 验证服务状态 sudo systemctl status kube-apiserver ``` > 重启后新证书生效[^2] --- #### 3. **更新 Kubeconfig** ```bash # 更新管理员 kubeconfig sudo kubeadm init phase kubeconfig admin --config /etc/kubernetes/kubeadm-config.yaml # 覆盖旧配置 mkdir -p $HOME/.kube sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` --- #### 4. **验证证书状态** ```bash # 检查证书有效期 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates # 验证 API 连通性 kubectl cluster-info ``` --- #### 5. **KubeSphere 控制台更新** 如果控制台证书过期(非 Kubernetes API 证书): ```bash # 更新控制台证书 Secret kubectl create secret tls ks-console-secret \ --cert=新的证书文件 \ --key=新的密钥文件 \ -n kubesphere-system \ --dry-run=client -o yaml | kubectl apply -f - # 重启控制台服务 kubectl rollout restart deployment ks-console -n kubesphere-system ``` > **注意**:操作前务必备份 `/etc/kubernetes/pki` 目录。若遇到问题可通过 `kubectl logs -n kubesphere-system` 查看组件日志[^4] --- ### 相关问题 1. 如何检查 Kubernetes 集群所有证书过期时间? 2. 更新证书后 KubeSphere 控制台仍提示不安全如何解决? 3. 如何为 KubeSphere API 配置自定义 CA 证书? 4. 证书更新导致 `kubectl` 命令失败应如何恢复? 5. 多节点集群中如何同步更新所有 master 节点的证书
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值