前言
kubernetes
版本为v1.16.3
使用 kubelet get node
后报错: x509: certificate has expired or is not yet valid
,提示证书过期。
解决
检查证书何时过期
kubeadm alpha certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
admin.conf Mar 27, 2024 07:41 UTC <invalid> no
apiserver Mar 27, 2024 07:41 UTC <invalid> no
apiserver-etcd-client Mar 27, 2024 07:41 UTC <invalid> no
apiserver-kubelet-client Mar 27, 2024 07:41 UTC <invalid> no
controller-manager.conf Mar 27, 2024 07:41 UTC <invalid> no
etcd-healthcheck-client Mar 27, 2024 07:41 UTC <invalid> no
etcd-peer Mar 27, 2024 07:41 UTC <invalid> no
etcd-server Mar 27, 2024 07:41 UTC <invalid> no
front-proxy-client Mar 27, 2024 07:41 UTC <invalid> no
scheduler.conf Mar 27, 2024 07:41 UTC <invalid> no
# 备份 kubernetes配置
cp -r /etc/kubernetes /etc/kubernetes_bak
kubeadm alpha certs renew
:可以使用 all
子命令来续订所有 Kubernetes
证书,也可以选择性地续订部分证书 kubeadm alpha certs renew --help
- all:更新所有可用证书,一般可以直接使用这个更新所有。
- apiserver:单独更新服务 Kubernetes API 的证书,相当于针对单个组件进行生成。
- apiserver-etcd-client:更新 apiserver 用来访问 etcd 的证书。
- 其它都类似
kubeadm alpha certs renew all
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
此时所有证书都已重新生成,在 /etc/kubernetes/pki
下。/etc/kubernetes/admin.conf
、/etc/kubernetes/controller-manager.conf
、/etc/kubernetes/scheduler.conf
也已经更新了。
再次查看证书时间就延续了一年:
kubeadm alpha certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
admin.conf Mar 27, 2025 10:23 UTC 364d no
apiserver Mar 27, 2025 10:23 UTC 364d no
apiserver-etcd-client Mar 27, 2025 10:23 UTC 364d no
apiserver-kubelet-client Mar 27, 2025 10:23 UTC 364d no
controller-manager.conf Mar 27, 2025 10:23 UTC 364d no
etcd-healthcheck-client Mar 27, 2025 10:23 UTC 364d no
etcd-peer Mar 27, 2025 10:23 UTC 364d no
etcd-server Mar 27, 2025 10:23 UTC 364d no
front-proxy-client Mar 27, 2025 10:23 UTC 364d no
scheduler.conf Mar 27, 2025 10:23 UTC 364d no
如果容器服务使用的是 Docker
,为了让证书生效,可以使用以下命令对涉及到证书使用的几个服务进行重启:
docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' | xargs docker restart
或者重启 docker
服务:systemctl restart docker
没有更新的文件就只有 /etc/kubernetes/kubelet.conf
了,因为 kubeadm
将 kubelet
配置为自动更新证书。 轮换的证书位于目录 /var/lib/kubelet/pki
。 要修复过期的 kubelet
客户端证书,请参阅 kubelet
客户端证书轮换失败。当签署的证书即将到期时,kubelet
会使用 Kubernetes API
,自动发起新的证书签名请求。 该请求会发生在证书的有效时间剩下 30% 到 10% 之间的任意时间点。 同样地,控制器管理器会自动批准证书请求,并将签署的证书附加到证书签名请求中。 Kubelet
会从 Kubernetes API
取回签署的证书,并将其写入磁盘。 然后它会更新与 Kubernetes API
的连接,使用新的证书重新连接到 Kubernetes API
。
在通过 kubeadm init
创建的节点上,在 kubeadm 1.17
版本之前有一个 缺陷,该缺陷使得你必须手动修改 /etc/kubernetes/kubelet.conf
文件的内容。 kubeadm init
操作结束之后,你必须更新 kubelet.conf
文件 将 client-certificate-data
和 client-key-data
改为如下所示的内容 以便使用轮换后的 kubelet
客户端证书:
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
如果是 1.17 以前的版本,也可以手动调用 kubeadm init phase kubeconfig kubelet
进行证书轮换。需要先把 /etc/kubernetes/kubelet.conf
删掉,使用 kubeadm init phase kubeconfig kubelet
进行重新生成。之后在 systemctl restart kubelet
进行重启。
node节点
这时候把 master
节点上的 $HOME/.kube/config
,复制到 node
节点的 $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
这样 所有节点都可以正常使用 kubectl
了
k8s v1.19版本之后,自签证书过期x509: certificate has expired or is not yet valid
所有评论(0)