纯手动更换k8s证书大概步骤
首先纯手动意思是不依赖kubeadm工具,集群安装也是基于纯手工安装,master节点运行kubelet,集群apiserver,kube-controller-manager 等基于静态pod运行,node节点kubelet、kube-proxy使用systemd运行。
本次更换连同ca和证书一起更换
- 注意ca也是有过期的,使用cfssl certinfo命令查看,免得吃大亏。
- 本篇不保证能平滑更换,因为更换ca会导致内部很多组件需要重新认证,需要找一个空闲时间段做,把影响减到最低
- 参考 Kubernetes TLS bootstrapping 那点事 使用 Bootstrap Token 完成 TLS Bootstrapping
生成新ca和证书
使用cfssl工具生成,如果上次生成的时候的json配置文件还在会省事很多。
没有就找一下教程重新写吧,不难
ca证书也加上expiry,保证百年不变
1 | { |
签发ca
1 | cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
apiserver证书
1 | cfssl gencert -ca=ca.pem \ |
普通用户
1 | cfssl gencert -ca=k8s-root-ca.pem \ |
如果写进kubeconfig文件需要用base64编码
1 | cat apiserver.pem | base64 | xargs | sed 's/ //g' |
apiserver更新证书
注意检查一下apiserver.yaml看看需要哪些证书,一般是ca和apiserver,一共4个文件,把这些文件复制到配置的路径,一般是/etc/kubernetes/pki,然后重启。
更新~/.kube/config文件里面的证书配置,使用kubectl检查一下,正常来说能输出,没有x509认证报错就行。
更新sa
上一步重启之后apiserver的证书应该已经顺利更新了,这时候node节点肯定是认证不了的,会出现NotReady状态。
还有内部一些组件的sa可能会遇到认证问题。例如我遇到的traefik、calico controller、腾讯cbs-csi组件、还有一些其他的根据环境去处理,优先排查kube-system下的sa,最好预先写好更新sa的脚本吧。
更新node节点
主要是更新kubelet.kubeconfig、bootstrap.kubeconfig、kube-proxy.kubeconfig
这里使用sed命令进行更换
更换ca,所有kubeconfig文件都要换
1 | sudo sed -i '/certificate-authority-data:/c\ certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3RENDQTZpZ0F3' bootstrap.kubeconfig |
如果使用了kubelet证书自动轮换功能就简单点,只需要更换掉ca,然后删掉最近生成的kubelet-client-日期.pem
重启kubelet之后会自动向apiserver申请新的证书,如果没有自动轮换就用自己生成的kubelet证书,重启后等待一阵就能看见Ready状态。
node节点多可以使用ansible批量跑
etcd证书和calico
如果要更换etcd证书,而且刚好使用calico的话,需要注意calico是要访问etcd的,它有个secret资源保存etcd证书,需要更新然后重启节点calico-node。