过期后更新kubernetes pki

Kim*_*sen 23 ssl-certificate kubernetes

我的 kubernetes PKI 已过期(准确地说是 API 服务器),我找不到更新它的方法。我得到的错误是

May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922595    8751 server.go:417] Version: v1.14.2
May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922784    8751 plugins.go:103] No cloud provider specified.
May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922800    8751 server.go:754] Client rotation is on, will bootstrap in background
May 27 08:43:51 node1 kubelet[8751]: E0527 08:43:51.925859    8751 bootstrap.go:264] Part of the existing bootstrap client certificate is expired: 2019-05-24 13:24:42 +0000 UTC
May 27 08:43:51 node1 kubelet[8751]: F0527 08:43:51.925894    8751 server.go:265] failed to run Kubelet: unable to load bootstrap
kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory
Run Code Online (Sandbox Code Playgroud)

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/上的文档描述了如何更新,但它仅在 API 服务器未过期时才有效。我试过做一个

kubeadm alpha cert renew all
Run Code Online (Sandbox Code Playgroud)

并重新启动,但这只会使整个集群失败,所以我回滚到快照(我的集群在 VMware 上运行)。

集群正在运行,所有容器似乎都在工作,但我无法通过 kubectl 访问它,因此我无法真正部署或查询。

我的 kubernetes 版本是 1.14.2。

Kim*_*sen 49

所以解决方案是(首先备份)

$ cd /etc/kubernetes/pki/
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/
$ kubeadm init phase certs all --apiserver-advertise-address <IP>
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
Run Code Online (Sandbox Code Playgroud)

然后

$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
Run Code Online (Sandbox Code Playgroud)

这为我完成了工作,感谢您的提示:)

  • 谢谢!我只是想补充一点,我还必须从“/etc/kubernetes/pki/etcd/”中删除我的etcd .crt和.key文件,否则,我会得到“错误执行阶段certs/etcd-peer:无法写入证书” “etcd-peer”:加载 etcd/peer 证书失败:加载证书失败:证书已过期` (4认同)
  • 你刚刚拯救了这一天。仅供参考:您可以考虑将第 3 行替换为 `kubeadm init stage certs all --apiserver-advertise-address &lt;public ip&gt; --apiserver-cert-extra-sans=&lt;private ip1&gt;,&lt;private ip2&gt;` 并运行 `systemctl重新启动 docker &amp;&amp; 系统重新启动 kubelet` 而不是 `reboot`。 (3认同)
  • 我这样做了,现在我在所有节点上都得到“未经授权”。使用单个主控运行 kubernetes 1.16.9,任何想法。 (2认同)

Tom*_*ski 8

该主题也在以下内容中讨论:


Kubernetes v1.15提供了“使用 kubeadm 进行证书管理”的文档:

kubeadm alpha certs check-expiration
Run Code Online (Sandbox Code Playgroud)
  • 自动证书更新:
    • kubeadm 在控制平面升级期间更新所有证书。
  • 手动证书更新:
    • 您可以随时使用该kubeadm alpha certs renew命令手动更新证书。
    • 此命令使用存储在 /etc/kubernetes/pki 中的 CA(或前端代理 CA)证书和密钥执行更新。

总的来说,对于Kubernetes v1.14,我发现这个过程最有帮助:


小智 5

我使用的是 Kubernetes v15.1 并按照上面的说明更新了我的证书,但我仍然遇到相同的错误。/etc/kubernetes/kubelet.conf仍然引用过期/旧的“客户端证书数据”

经过一番研究,我发现如果证书更新未设置为 true, kubeadm 不会更新/etc/kubernetes/kubelet.conf文件。所以请注意 1.17 以下版本的 kubeadm 的一个 bug(https://github.com/kubernetes/kubeadm/issues/1753)。

仅当使用certificate-renewal=true 完成集群升级时,kubeadm 才会升级。所以我必须手动删除/etc/kubernetes/kubelet.conf并重新生成它,kubeadm init phase kubeconfig kubelet最终解决了我的问题。


Nic*_*_Kh 4

尝试通过以下方式更新证书kubeadm init phase certs

您可以通过以下命令检查证书过期情况:

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text

openssl x509 -in /etc/kubernetes/pki/apiserver-kubelet-client.crt -noout -text

首先,确保您拥有 k8s 证书库存的最新备份/etc/kubernetes/pki/*

删除apiserver.*apiserver-kubelet-client.*证书文件/etc/kubernetes/pki/

通过命令生成新证书kubeadm init phase certs

sudo kubeadm init phase certs apiserver

sudo kubeadm init phase certs apiserver-kubelet-client

重新启动kubeletdocker守护进程:

sudo systemctl restart docker; sudo systemctl restart kubelet

您可以在 K8s 官方文档中找到更多相关信息。

  • 感谢你,我让它工作了..我只需要再次创建所有配置文件 (3认同)
  • 谢谢..我做了上面的事情,还创建了 front-proxy-ca。所有证书都在 /etc/kubernetes/pki 中更新,但重新启动 kubelet 时我仍然得到: (2认同)
  • 5 月 27 日 16:19:43 node1 kubelet[28167]: E0527 16:19:43.234981 28167 bootstrap.go:264] 部分现有 bootstrap 客户端证书已过期:2019-05-24 13:24:42 +0000 UTC 5 月27 16:19:43 node1 kubelet[28167]: F0527 16:19:43.235227 28167 server.go:265] 无法运行 Kubelet:无法加载 bootstrap kubeconfig:stat /etc/kubernetes/bootstrap-kubelet.conf:没有这样的文件或目录 5 月 27 日 16:19:43 node1 systemd[1]: kubelet.service: 主进程已退出,code=exited,status=255/n/a (2认同)