更新证书

1、检查证书是否过期

  1. # kubeadm alpha certs check-expiration
  2. # kubeadm alpha certs check-expiration --config kubeadm.yaml

该命令显示 /etc/kubernetes/pki文件夹中的客户端证书以及 kubeadm使用的 KUBECONFIG文件中嵌入的客户端证书的到期时间/剩余时间。

2、备份原有证书(重要)

  1. mkdir /etc/kubernetes.bak
  2. cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
  3. cp /etc/kubernetes/*.conf /etc/kubernetes.bak

3、备份ETCD数据

  1. # 备份数据目录
  2. cp -r /var/lib/etcd /var/lib/etcd.bak
  3. # 快照备份
  4. export ETCDCTL_API=3
  5. etcdctl --endpoints localhost:2379 snapshot save snapshot.db
  6. # 快照恢复命令
  7. etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data

4、更新证书

  1. kubeadm alpha certs renew all --config=kubeadm.yaml

更新完过后就可以查看证书的有效期了。

5、更新kubeconfig

  1. kubeadm init phase kubeconfig all --config kubeadm.yaml

6、将新生成的admin配置文件覆盖原有的配置文件

  1. mv $HOME/.kube/config $HOME/.kube/config.old
  2. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. chown $(id -u):$(id -g) $HOME/.kube/config

7、完成后重启kubernetes控制面的组件

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

8、通过apiserver 查看证书是否更新成功

  1. echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate

问题整理

1、kubelet证书轮转失败

默认情况下,kubeadm 使用 /etc/kubernetes/kubelet.conf中指定的 /var/lib/kubelet/pki/kubelet-client-current.pem 符号链接 来配置 kubelet 自动轮换客户端证书。如果此轮换过程失败,你可能会在 kube-apiserver 日志中看到 诸如x509: certificate has expired or is not yet valid之类的错误。

要解决此问题,你必须执行以下步骤:

  1. 从故障节点备份和删除 /etc/kubernetes/kubelet.conf 和 /var/lib/kubelet/pki/kubelet-client*。
  2. 在集群中具有 /etc/kubernetes/pki/ca.key 的、正常工作的控制平面节点上 执行 kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf。 $NODE 必须设置为集群中现有故障节点的名称。 手动修改生成的 kubelet.conf 以调整集群名称和服务器端点, 或传递 kubeconfig user —config(此命令接受 InitConfiguration)。 如果你的集群没有 ca.key,你必须在外部对 kubelet.conf 中的嵌入式证书进行签名。
  3. 将得到的 kubelet.conf 文件复制到故障节点上,作为 /etc/kubernetes/kubelet.conf。
  4. 在故障节点上重启 kubelet(systemctl restart kubelet),等待 /var/lib/kubelet/pki/kubelet-client-current.pem 重新创建。
  5. 在故障节点上运行 kubeadm init phase kubelet-finalize all。 这将使新的 kubelet.conf 文件使用 /var/lib/kubelet/pki/kubelet-client-current.pem 并将重新启动 kubelet。
  6. 确保节点状况变为 Ready。

Reference: