一个计算机技术爱好者与学习者

0%

好好学K8S:kubeadm安装的K8S集群证书过期问题

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
2
cp -r /etc/kubernetes{,.old}
#cp -r /var/lib/etcd{,.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
2
systemctl restart kubelet
docker ps | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

4、验证

1
2
3
cd /etc/kubernetes/pki
ll
kubeadm certs check-expiration

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
2
3
spec:
connection:
kubeconfig: xxx

把 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
2
3
4
kubectl get pod -n argocd -owide
argocd login 10.x.x.x:8080 --grpc-web
argocd cluster list
argocd cluster add kubernetes-admin@kubernetes --kubeconfig ~/.kube/newconfig --name "dev(开发)" --upsert

如果master节点没有argocd client,可以登录到argo-cd-argocd-server pod中进行操作。