公司原有的几套k8s环境证书即将到期,需要重新更新证书:
k8s版本:1.22.1
docker版本:20.10.7
k8s部署方式:kubeadmin
提示:这里描述项目中遇到的问题:
kubeadmin部署的K8s集群,默认证书只有一年有效期,针对已经部署的k8s集群,证书即将到期或者证书已经过期的集群,提出证书更新方案
本文解决方案与现有百度的文章相比更全,建议升级证书,可以直接跳到第十步,如果失败再走1-9手动更新:
1.查询当前证书过期时间
# kubeadm alpha certs check-expiration
or
# Openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
or
#for i in `find /etc/kubernetes/pki -name "*.crt"`;do openssl x509 -in $i -text -noout| grep Not;echo $i;done
Not Before 初始时间
Not After 过期时间
主要有如下证书,需要注意:
apiserver.crt
front-proxy-ca.crt
ca.crt
apiserver-etcd-client.crt
apiserver-kubelet-client.crt
front-proxy-client.crt
etcd/server.crt
etcd/ca.crt
etcd/peer.crt
etcd/healthcheck-client.crt
2.备份
# cp -r /etc/kubernetes /etc/kubernetes_back
3.生成集群配置文件
# kubeadm config view > /root/kubeadmin.yaml
4.续期证书
# kubeadm alpha certs renew all --config=/root/kubeadmin.yaml
(拷贝新证书到其他master节点)
5.重新生成配置文件
# cd /etc/kubernetes
# ls *conf
# rm -rf *conf
# kubeadm init phase kubeconfig all --config=/root/kubeadmin.yaml
6.复制新的认证文件(在所有master上执行,使证书生效)
# rm -rf ~/.kube
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
7.重启kubelet、apiserver、controller-manager、scheduler、etcd(在所有master上执行,使证书生效)
# docker ps | egrep "etcd|kube-apiserver|kube-controller-manager|kube-scheduler" | grep -v pause | awk '{print $1}' | xargs -i docker restart {}
8.检查每个master的证书有效期
# for i in `find /etc/kubernetes/pki -name "*.crt"`;do openssl x509 -in $i -text -noout| grep Not;echo $i;done
9.补充若还是不行
# 查看etcd日志 docker logs -f 报类似以下错误的话
k8s-master02 etcd[1424]: rejected connection from "192.168.0.107:38224" (error "remote error: tls: bad certificate", ServerName ""
具体日志忘记了,只记得是host还是ServerName不在证书列表中。这一步当时处理花了很长时间。兄弟们这一步是解决问题的关键!!!
做如下操作:
# vim /root/kubeadmin.yaml
具体内容如下:
apiServer:
certSANs:
- hz-cs1
- hz-cs2
- hz-cs3
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.21.120:6443
controllerManager: {}
dns: {}
etcd:
local:
serverCertSANs:
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
peerCertSANs:
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.22.1
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.1.0.0/16
scheduler: {}
其中最为关键的就是这两步:
apiServer:
certSANs:
- hz-cs1
- hz-cs2
- hz-cs3
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
以及
etcd:
local:
serverCertSANs:
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
peerCertSANs:
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
- 192.168.2.120
新增如下内容包括三台master ip及主机名,及vip 之后再继续做4,5,6,7,8依次进行 到此就可以了
10.以上为手动操作,有备份的操作。以下为1.15版本以上的自动化操作方式。推荐先使用此方法,不行再手动更新。
下载脚本:
# git clone https://github.com/yuyicai/update-kube-cert.git
# cd update-kubeadm-cert
# chmod 755 update-kubeadm-cert.sh
同时更新etcd证书和master证书
:
#在每台master上执行以下命令
#./update-kubeadm-cert.sh all