Contents
  1. 1. 生成新ca和证书
  2. 2. apiserver更新证书
  3. 3. 更新sa
  4. 4. 更新node节点
  5. 5. etcd证书和calico

首先纯手动意思是不依赖kubeadm工具,集群安装也是基于纯手工安装,master节点运行kubelet,集群apiserver,kube-controller-manager 等基于静态pod运行,node节点kubelet、kube-proxy使用systemd运行。
本次更换连同ca和证书一起更换

  • 注意ca也是有过期的,使用cfssl certinfo命令查看,免得吃大亏。
  • 本篇不保证能平滑更换,因为更换ca会导致内部很多组件需要重新认证,需要找一个空闲时间段做,把影响减到最低

生成新ca和证书

使用cfssl工具生成,如果上次生成的时候的json配置文件还在会省事很多。
没有就找一下教程重新写吧,不难

ca证书

1
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

apiserver证书

1
2
3
4
cfssl gencert -ca=ca.pem \
-ca-key=ca-key.pem \
-config=config.json -profile=peer \
apiserver-csr.json | cfssljson -bare apiserver

普通用户

1
2
3
4
cfssl gencert -ca=k8s-root-ca.pem \
-ca-key=k8s-root-ca-key.pem \
-config=config.json -profile=client \
devuser-csr.json | cfssljson -bare devuser

如果写进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。

Contents
  1. 1. 生成新ca和证书
  2. 2. apiserver更新证书
  3. 3. 更新sa
  4. 4. 更新node节点
  5. 5. etcd证书和calico