Kubernetes v1.13.0 证书升级详解

 查看证书有效期

# 查询api-server证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep Not
# 查询所有证书有效期 for tls in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`; do echo ===============$tls===============; openssl x509 -in $tls -text| grep Not; done
===============/etc/kubernetes/pki/front-proxy-ca.crt===============
            Not Before: Aug  7 06:10:58 2020 GMT
            Not After : Aug  5 06:10:58 2030 GMT
===============/etc/kubernetes/pki/etcd/server.crt===============
            Not Before: Aug  7 06:10:57 2020 GMT
            Not After : Mar 10 02:49:33 2022 GMT
===============/etc/kubernetes/pki/etcd/healthcheck-client.crt===============
            Not Before: Aug  7 06:10:57 2020 GMT
            Not After : Mar 10 02:49:33 2022 GMT
===============/etc/kubernetes/pki/etcd/ca.crt===============
            Not Before: Aug  7 06:10:57 2020 GMT
            Not After : Aug  5 06:10:57 2030 GMT
===============/etc/kubernetes/pki/etcd/peer.crt===============
            Not Before: Aug  7 06:10:57 2020 GMT
            Not After : Mar 10 02:49:34 2022 GMT
===============/etc/kubernetes/pki/apiserver-etcd-client.crt===============
            Not Before: Aug  7 06:10:57 2020 GMT
            Not After : Mar 10 02:49:34 2022 GMT
===============/etc/kubernetes/pki/ca.crt===============
            Not Before: Aug  7 06:10:58 2020 GMT
            Not After : Aug  5 06:10:58 2030 GMT
===============/etc/kubernetes/pki/apiserver-kubelet-client.crt===============
            Not Before: Aug  7 06:10:58 2020 GMT
            Not After : Mar 10 02:49:35 2022 GMT
===============/etc/kubernetes/pki/front-proxy-client.crt===============
            Not Before: Aug  7 06:10:58 2020 GMT
            Not After : Mar 10 02:49:33 2022 GMT
===============/etc/kubernetes/pki/apiserver.crt===============
            Not Before: Aug  7 06:10:58 2020 GMT
            Not After : Mar 10 02:49:34 2022 GMT

#################  master ###################

1、备份已有配置

cp -r /etc/kubernetes  /etc/kubernetes_old

2、获取集配配置

# 证书即将过期(未过期),可以利用命令直接获取集群配置
kubeadm config view > kubeadm-upgrade.yaml

# 如果证书已过期,可以手动编写集群配置
vim kubeadm-upgrade.yaml

apiVersion: kubeadm.k8s.io/v1beta1
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.13.0

3、更新所有证书

# 根据配置文件,更新所有证书
kubeadm alpha certs renew all --config kubeadm-upgrade.yaml

# 再次查看证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '

4、更新集群配置

# 删除已有配置(已备份,无需担心)
rm -rf /etc/kubernetes/*.conf

# 根据配置文件,重新生成所有配置
kubeadm init phase kubeconfig all --config kubeadm-upgrade.yaml --node-name <节点名称> --apiserver-advertise-address <集群VIP>

# 更新kubectl配置并赋予权限
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

5、重启核心组件容器

docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart

systemctl restart kubelet
# 查看节点和所有服务是否正常
kubectl get nodes
kubectl get pods --all-namespaces

 注意:kubelet.conf 中 <nodeName> 的值 必须 与 kubelet 向 apiserver 注册时提供的节点名称的值完全匹配。(一种是传递参数--node-name指定节点名称,一种是修改hostname与nodename一致)


#################  node  ###################

1、备份kubelet配置

cp /etc/kubernetes/kubelet.conf  /etc/kubernetes/kubelet.conf_bak

2、更新kubelet配置

# 重新生成节点kubelet配置
kubeadm init phase kubeconfig kubelet --node-name <节点名称> --kubeconfig-dir /tmp/ --apiserver-advertise-address <集群VIP>

# 更新节点kubelet配置
scp /tmp/kubelet.conf root@<节点名称>:/etc/kubernetes/

# 重启节点kubelet
systemctl restart kubelet

#################  crontab  ###################

注意:在首次升级完证书后,证书到期需要手动重启kubelet,否则kubelet无法识别新证书,

并且在到期之前重启是无效的,这将要求我们必须卡在那个到期时间点重启,否则影响集群使用,

此问题目前还未找到问题源,所以使用临时方案添加定时任务crontab,注意事项:

1、证书有效期时间时区为+0000,我们设置定时任务需要根据系统时区计算实际时间

2、定时任务时间大于到期时间,最好就是到期后下一分钟

3、定时任务需要设置所有节点,并且核对所有节点系统时间

# 查看系统时间和时区
date -R && crontab -l
# 计算并设置定时任务
crontab -e
42 13 21 5 5 systemctl restart kubelet

实战日志(以下通过更改系统时间,模拟证书过期)

[root@192 k8s]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep 'Not After'
            Not After : Apr 12 07:01:12 2022 GMT
[root@192 k8s]# ls /etc/kubernetes
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf
[root@192 k8s]# date -s "2022-3-12"
Sat Mar 12 00:00:00 PST 2022
[root@192 k8s]# kubectl get pod --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx   nginx-ingress-controller-77b474c665-lh8tt   1/1     Running   0          334d
kube-system     coredns-86c58d9df4-7bq94                    1/1     Running   0          334d
kube-system     coredns-86c58d9df4-dm6jb                    1/1     Running   0          334d
kube-system     etcd-192.168.73.129                         1/1     Running   0          334d
kube-system     heapster-7856548f99-2l8fp                   1/1     Running   0          334d
kube-system     kube-apiserver-192.168.73.129               1/1     Running   0          334d
kube-system     kube-controller-manager-192.168.73.129      1/1     Running   0          334d
kube-system     kube-flannel-ds-amd64-qcmbq                 1/1     Running   0          334d
kube-system     kube-proxy-kh7xn                            1/1     Running   0          334d
kube-system     kube-scheduler-192.168.73.129               1/1     Running   0          334d
kube-system     nvidia-device-plugin-daemonset-6xzxj        1/1     Running   0          334d
[root@192 k8s]#
[root@192 k8s]# kubeadm config view > kubeadm-upgrade.yaml
[root@192 k8s]# kubeadm alpha certs renew all --config kubeadm-upgrade.yaml
[root@192 k8s]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep 'Not After'
            Not After : Mar 12 08:00:22 2023 GMT
[root@192 k8s]#
[root@192 k8s]# rm -rf /etc/kubernetes/*.conf
[root@192 k8s]# kubeadm init phase kubeconfig all --config kubeadm-upgrade.yaml --node-name 192.168.73.129
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[root@192 k8s]#
[root@192 k8s]# cp /etc/kubernetes/admin.conf $HOME/.kube/config
[root@192 k8s]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd'
85a67efc7369        f1ff9b7e3d6e           "kube-apiserver --au…"   9 months ago        Up 9 months                             k8s_kube-apiserver_kube-apiserver-......
66a23ae913ac        3cab8e1b9802           "etcd --advertise-cl…"   9 months ago        Up 9 months                             k8s_etcd_etcd-......
f614aae9b68f        9508b7d8008d           "kube-scheduler --ad…"   9 months ago        Up 9 months                             k8s_kube-scheduler_kube-scheduler-......
fb9d59c857ee        d82530ead066           "kube-controller-man…"   9 months ago        Up 9 months                             k8s_kube-controller-manager_kube-controller-manager-......
[root@192 k8s]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
b53d7fb8e1db
c7b6ae222bc1
15707e4219d9
110e23ea3b00
[root@192 k8s]# date -s "2023-2-12"
Sun Feb 12 00:00:00 PST 2023
[root@192 k8s]# systemctl restart kubelet
[root@192 k8s]# kubectl get pod --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx   nginx-ingress-controller-77b474c665-lh8tt   1/1     Running   0          671d
kube-system     coredns-86c58d9df4-7bq94                    1/1     Running   0          671d
kube-system     coredns-86c58d9df4-dm6jb                    1/1     Running   0          671d
kube-system     etcd-192.168.73.129                         1/1     Running   0          671d
kube-system     heapster-7856548f99-2l8fp                   1/1     Running   0          671d
kube-system     kube-apiserver-192.168.73.129               1/1     Running   0          671d
kube-system     kube-controller-manager-192.168.73.129      1/1     Running   0          671d
kube-system     kube-flannel-ds-amd64-qcmbq                 1/1     Running   0          671d
kube-system     kube-proxy-kh7xn                            1/1     Running   0          671d
kube-system     kube-scheduler-192.168.73.129               1/1     Running   0          671d
kube-system     nvidia-device-plugin-daemonset-6xzxj        1/1     Running   0          671d
[root@192 k8s]# kubectl get node
NAME             STATUS   ROLES    AGE    VERSION
192.168.73.129   Ready    master   671d   v1.13.0

 

参考>>> https://blog.csdn.net/lihongbao80/article/details/109001639

作者:Leozhanggg

出处:https://www.cnblogs.com/leozhanggg/p/14648636.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/leozhanggg/p/14648636.html