1. 问题描述
使用kubectl访问k8s集群,报错证书过期:
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-09-26T01:33:25-04:00 is after 2022-09-26T03:45:02Z
2. 解决思路
1、确认证书过期
2、更新证书
3、更新相关配置
参考文档:
3. 具体操作
3.1. 确认证书过期
1、登录证书过期集群的任意master节点
2、查看证书过期时间
1 | kubeadm certs check-expiration |
看到 RESIDUAL TIME 为 <invalid>
,表明证书已经过期。
3.2. 更新证书
注意:更新证书时,所有master节点都需要操作
1、备份k8s配置
1 | cp -r /etc/kubernetes{,.old} |
2、更新证书
1 | kubeadm certs renew all |
更新成功后,会提示重启一些pod:
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
3、重启kubelet和容器
1 | systemctl restart kubelet |
4、验证
1 | cd /etc/kubernetes/pki |
3.3. 更新kubectl配置
1、更新kubeconfig配置
1 | cp /etc/kubernetes/admin.conf .kube/config |
2、测试
1 | kubectl get nodes |
3.4. 更新kubesphere配置
以上,k8s集群的证书过期问题已经解决。但是,使用通过kubesphere的管理页面访问k8s集群时,会报错:
会话超时或此帐户在其它地方登录,请重新登录
ks官方给的解决方案是在页面上更新 kubeconfig,但是这个方案只适用于v3.3以上的版本(页面上会提示kubeconfig已过期),详情参考更新 Kubeconfig
如果是v3.2或者更低版本,可以通过kubectl修改CRD clusters.cluster.kubesphere.io,详情参考member节点证书到期,续约证书后,kubesphere如何更新kubeconfig?
为方便描述,假设证书过期的k8s集群名称为 dev
。证书更新后,在kubesphere主集群执行如下操作:
1、查看所有集群配置
1 | kubectl get clusters.cluster.kubesphere.io -n kubesphere-system |
2、备份dev集群配置
1 | kubectl get clusters.cluster.kubesphere.io/dev -n kubesphere-system -o yaml > dev.yaml |
3、base64加密新的dev集群的kubeconfig
1 | cat .kube/config | base64 | tr -d '\n' |
4、更新dev集群配置
1 | kubectl edit clusters.cluster.kubesphere.io/dev -n kubesphere-system |
1 | spec: |
把 kubeconfig 的value替换为base64加密后的kubeconfig内容。
5、验证
通过ks的管理页面再次访问k8s集群,已经可以正常访问。
3.5. 更新argocd配置
查看argocd和k8s dev集群的连接,发现CONNECTION STATUS已经失联。
参考Argocd cluster add,通过--upsert
参数更新集群配置。
注意:更新集群配置时,集群的名称一定要和现有名称保持一致。
假设:
- argocd所在k8s集群为manager
- manager的master节点上包含dev集群的新的kubeconfig,路径为
~/.kube/newconfig
dev
集群在argocd中的名称为dev(开发)
- argo-cd-argocd-server pod ip为
10.x.x.x
那么,在manager集群的master节点上执行如下操作。
1 | kubectl get pod -n argocd -owide |
如果master节点没有argocd client,可以登录到argo-cd-argocd-server pod中进行操作。