k8s证书过期处理
证书一共分为
-
根CA(ca.crt)
-
master各组件的证书(包括etcd、apiserver、front-proxy、controller-manager等各种)
-
kubelet证书
k8s证书有效期说明:
1、原生版本有效期
master节点:
/etc/kubernetes/ssl/apiserver.crt #1年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt #10年有效期
/etc/kubernetes/ssl/ca.crt #10年有效期
/etc/kubernetes/ssl/front-proxy-client.crt #1年有效期
/etc/kubernetes/ssl/etcd/ca.pem #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #1年有效期
node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem #1年有效期
2、DET K8S版本(注意采用邮件发的新包,20190821及之前版本可能存在node节点kubelet证书等问题)
master节点:
/etc/kubernetes/ssl/apiserver.crt #10年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt #100年有效期
/etc/kubernetes/ssl/ca.crt #100年有效期
/etc/kubernetes/ssl/front-proxy-client.crt #10年有效期
/etc/kubernetes/ssl/etcd/ca.pem #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #10年有效期
node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem #10年有效期
3、证书有效期查看命令
master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do echo "crt: $i" && openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do echo "crt: $i" && openssl x509 -in $i -noout -text|grep Not; done
node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
其中,根CA和master各组件证书默认已经改成了100年,kubelet证书改成了10年且有自动轮换
在一些用老包部署的环境里,可能出现证书过期问题,需要按如下操作解决证书问题。
检查
全部证书过期时间检查命令
master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do echo "crt: $i" && openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do echo "crt: $i" && openssl x509 -in $i -noout -text|grep Not; done
node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
场景1、集群整体证书已经到期
说明:证书更新会影响到K8s和docker服务,业务服务会出现一段时间不对外提供服务
0.替换所有节点的kubeadm二进制,默认是1年的二进制文件
注意,这里是k8s1.12版本的kubeadm,如果需要1.16或者1.18版本的kubeadm自行下载
mv /usr/local/bin/kubeadm /usr/local/bin/kubeadm-bak #备份旧的kubeadm
cp kubeadm /usr/local/bin/kubeadm #将新的kubeadm二进制文件放到对应位置
chmod +x /usr/local/bin/kubeadm
1.在第一个master节点更换证书和配置
-
备份/etc/kubernetes/ssl目录,生成新证书,然后把etcd证书拷贝到此目录
cp -r /etc/kubernetes/ssl /etc/kubernetes/ssl-bak
## 根据不同版本执行不同的证书更新命令
## 如默认1.12版本使用如下命令
kubeadm alpha phase certs all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
## 如1.16版本执行
kubeadm alpha certs renew all --config /etc/kubernetes/kubeadm-config.yaml
cp -r /etc/ssl/etcd/ssl/ /etc/kubernetes/ssl/etcd/
2. 然后把第一台master节点的证书拷贝到其他的master节点
3. 在所有master节点操作如下
-
备份旧.conf文件,重新生成.conf文件,并拷贝到/root/.kube/config
cd /etc/kubernetes ls |grep conf$ | xargs -I{} mv /etc/kubernetes/{} {}.bak ## 根据不同版本执行不同的证书更新命令 ## 如默认1.12版本使用如下命令 kubeadm alpha phase kubeconfig all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml ## 如1.16版本执行: kubeadm alpha kubeconfig user --client-name=admin kubeadm alpha kubeconfig user --org system:masters --client-name kubernetes-admin > /etc/kubernetes/admin.conf kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > /etc/kubernetes/kubelet.conf kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf cp /etc/kubernetes/admin.conf /root/.kube/config
重启 systemctl restart kubelet &&systemctl restart docker
4.在第一台master节点操作重新生成token(如果集群中只有master节点,或者只有master与node节点混合的节点,则不需要操作第4点)
-
将ca证书拷贝到node节点,并将node重新加入集群(注意这里的node节点是非master节点,不需要对既是master节点又是node节点进行操作)
$ scp /etc/kubernetes/ssl/ca.crt root@[node节点]:/etc/kubernetes/ssl/ $ kubectl delete nodes [worker-nodes] $ kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
-
需要更新kubeadm cluster-info
-
$ kubeadm alpha phase bootstrap-token cluster-info --kubeconfig /etc/kubernetes/admin.conf [bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
5. 在node节点(非master节点,不需要对既是master节点又是node节点进行操作)
备份bootstrap-kubelet.conf和kubelet.conf
cd /etc/kubernetes/
mv kubelet.conf kubelet.conf.bak
mv bootstrap-kubelet.conf bootstrap-kubelet.conf.bak
将新生成的token更新到/etc/kubernetes/kubeadm-client.v1alpha3.conf
discoveryToken: 55ovb3.up3t22u5a0c9p1sy
tlsBootstrapToken: 55ovb3.up3t22u5a0c9p1sy
token: 55ovb3.up3t22u5a0c9p1sy
在node节点,重新加入到集群
$ kubeadm join --config /etc/kubernetes/kubeadm-client.v1alpha3.conf --ignore-preflight-errors=all
以上所有操作在所有节点完成之后,在master节点确认
kubectl get nodes显示node Ready,然后再进行以下操作
6.在ansible controller节点上操作(需要使用最新的kubespray代码)最新地址:http://10.130.22.17:8000/kubespray/kubespray-code-20200508.tgz
修改hosts.ini和environment.yml(将之前的hosts.ini和environment.yml替换新代码库里的对应文件)-注意老的代码库里的enviroment文件修改为environment.yml文件
更新完成之后,需要更新k8s集群所有的secret,要不然pod会因为token失效连接不到证书
tar -zxvf kubespray-code-20200508.tgz
cd kubespray/
ansible-playbook -i inventory/mycluster/hosts.ini recover.yml --become --become-user=root -e @environment.yml -e gpu_share_enabled=false --tags rotate_tokens
默认会把kubespray自带的组件进行更新,业务组件需要业务人员进行手动查看token是否过期,如果过期则进行kubectl delete secret xxx重建
场景2、只node节点kubelet证书到期或者即将到期,其他证书都没问题
加上客户端证书自动轮换的配置,默认情况下客户端的证书是1年的、如下操作之后证书为10年。
更新客户端的证书为证书轮换策略(若没有纯node节点则不需要进行以下操作)
k8s 1.8之后增加客户端证书自动轮换,在有效期70%-90%这个区间,也就是大概剩下37-110天(大致1-3个多月)的有效期之间,kubelet 会使用其初始证书连接到 Kubernetes API ,并发送证书签名的请求
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
2、验证所有节点kubelet有无开启证书自动轮换
在所有节点验证如下配置
## 执行如下命令,看输出是否有:rotateCertificates: true
cat /var/lib/kubelet/config.yaml |grep rotateCertificates
如果有,则不需要添加如下配置直接进行第三步即可。
如果没有,需要编辑/etc/kubernetes/kubelet.env增加,
--feature-gates=RotateKubeletClientCertificate=true \
--rotate-certificates=true \
3、选取一个master节点生成永久不失效token
首先生成一个新的token,记录这个token后面会用,生成之前需要配置token有效期为forever
-
使用客户端证书轮换必须保证配置中token为有效的。
-
图中1画圈的为添加部分最终效果如图:
vim /etc/kubernetes/kubeadm-config.v1alpha3.yaml ## 如果没有bootstrapTokens,则需要添加如下内容bootstrapTokens部分;如果有,则修改其中内容ttl: "0" apiVersion: kubeadm.k8s.io/v1alpha3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token ttl: "0" usages: - signing - authentication ## 生成token kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml ## 查看TTL失效为 forever 见图2 kubeadm token list
4、在所有node节点替换token
vim /etc/kubernetes/bootstrap-kubelet.conf ## 前面是旧token /斜线后面是第一步生成的token替换一下 , 新token失效一定要是永久的要不然没有 :$s/dpcrb8.xj5ukm9y904kr1nl/3rqf1x.3sdbxo8vein3br2o/g ## 如果不存在/etc/kubernetes/bootstrap-kubelet.conf该文件,则执行cp /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf,然后vim /etc/kubernetes/bootstrap-kubelet.conf修改下面contexts和users部分 apiVersion: v1 clusters: - cluster: certificate-authority-data: xxx server: xxx name: cluster.local contexts: - context: cluster: cluster.local user: tls-bootstrap-token-user name: tls-bootstrap-token-user@cluster.local current-context: tls-bootstrap-token-user@cluster.local kind: Config preferences: {} users: - name: tls-bootstrap-token-user user: token: 3rqf1x.3sdbxo8vein3br2o
重启kubelet
systemctl daemon-reload
systemctl restart kubelet
5、修改controller-manager自动轮换的证书签署时间
在所有master节点操作
编辑/etc/kubernetes/manifests/kube-controller-manager.yaml增加签署时间,默认为8760,这里把签署时间改为10年
- --experimental-cluster-signing-duration=87600h0m0s
重启kubelet和controller-manager
systemctl daemon-reload
systemctl restart kubelet
## 检查controller-manager有无重启,没有则手动delete或者docker操作下触发重启,操作如下:
kubectl get po -n kube-system|grep controller-manager
kubectl delete po {查询到的所有controller-manager pod name} -n kube-system
6、备份并让controller-manager重新生成kubelet证书
在所有node节点操作
cd /var/lib/kubelet/pki && mkdir bak-kubelet-client
mv kubelet-client-* bak-kubelet-client/
systemctl restart kubelet