ある日、kubectlコマンドを叩いたところ、 「
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-03-06T05:32:47+09:00 is after 2022-02-26T20:40:29Z
」 のエラーが出るようになり、操作が出来なくなってしまいました。
これは、kubeadmで生成されたクライアント証明書は1年で失効するものによるものです。
証明書の更新をおこなえば解決するので、実際に更新作業をおこなっていきたいと思います。
エラーがでることを確認
kubectlコマンドを使用するとTLS証明書の期限が切れている旨のエラーがでます。
kubectl get po
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-03-06T05:32:47+09:00 is after 2022-02-26T20:40:29Z
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[check-expiration] Error reading configuration from the Cluster. Falling back to default configuration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Feb 26, 2022 20:40 UTC <invalid> no
apiserver Feb 26, 2022 20:40 UTC <invalid> ca no
apiserver-etcd-client Feb 26, 2022 20:40 UTC <invalid> etcd-ca no
apiserver-kubelet-client Feb 26, 2022 20:40 UTC <invalid> ca no
controller-manager.conf Feb 26, 2022 20:40 UTC <invalid> no
etcd-healthcheck-client Feb 26, 2022 20:40 UTC <invalid> etcd-ca no
etcd-peer Feb 26, 2022 20:40 UTC <invalid> etcd-ca no
etcd-server Feb 26, 2022 20:40 UTC <invalid> etcd-ca no
front-proxy-client Feb 26, 2022 20:40 UTC <invalid> front-proxy-ca no
scheduler.conf Feb 26, 2022 20:40 UTC <invalid> no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 24, 2031 20:40 UTC 8y no
etcd-ca Feb 24, 2031 20:40 UTC 8y no
front-proxy-ca Feb 24, 2031 20:40 UTC 8y no
更新自体は簡単で、
kubeadm certs renew all
コマンドを使用すれば全ての証明書を新しいものに更新してくれます。
kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[renew] Error reading configuration from the Cluster. Falling back to default configuration
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
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[check-expiration] Error reading configuration from the Cluster. Falling back to default configuration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Mar 05, 2023 21:02 UTC 364d no
apiserver Mar 05, 2023 21:02 UTC 364d ca no
apiserver-etcd-client Mar 05, 2023 21:02 UTC 364d etcd-ca no
apiserver-kubelet-client Mar 05, 2023 21:02 UTC 364d ca no
controller-manager.conf Mar 05, 2023 21:02 UTC 364d no
etcd-healthcheck-client Mar 05, 2023 21:02 UTC 364d etcd-ca no
etcd-peer Mar 05, 2023 21:02 UTC 364d etcd-ca no
etcd-server Mar 05, 2023 21:02 UTC 364d etcd-ca no
front-proxy-client Mar 05, 2023 21:02 UTC 364d front-proxy-ca no
scheduler.conf Mar 05, 2023 21:02 UTC 364d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 24, 2031 20:40 UTC 8y no
etcd-ca Feb 24, 2031 20:40 UTC 8y no
front-proxy-ca Feb 24, 2031 20:40 UTC 8y no
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.
先ほど、 master 側で発行した join コマンドをそのまま、ワーカーノードで実行します。
以下の様に、クラスターに参加した旨のメッセージがでれば問題ありません。
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
その後、 master 側で、
kubectl get nodes
を実行し、対象のワーカーノードが、 Ready 状態になっていれば問題ありません。