しばらく休眠していたOpenShiftとは
一般的なRed Hat OpenShiftは常時稼働する大規模なクラスターなのでこのようなことはないと思いますが、Single Node OpenShift(SNO)のような小規模なものではクラスター全体をシャットダウンして必要なときだけ起動することもあると思います。そして後日ブートすると、起動が完了しない(oc get node
でNot Readyのまま)ということに・・・
1ヶ月以上休眠していると
調べてみると、ちょうど1ヶ月以上の間、停止状態のままだと、証明書の有効期限が切れてこのようなことになるようです。これはブートしたノードにsshでログインしてみるとログからわかりました。証明書がexpiredとなった日付はちょうどノードをシャットダウンしてから一ヶ月後です。
ssh -i ./id_rsa core@ノードのIPアドレス
journalctl -b -u kubelet | grep expired
(メッセージの例1)
May 10 03:17:30 xx-xx-xx-xx-xx-xx hyperkube[3466]: E0510 03:17:30.096854 3466 bootstrap.go:265] part of the existing bootstrap client certificate in /var/lib/kubelet/kubeconfig is expired: 2023-04-24 07:39:18 +0000 UTC
(メッセージの例2)
6月 26 06:05:48 xx-xx-xx-xx-xx-xx kubenswrapper[2779]: I0626 06:05:48.869508 2779 csi_plugin.go:993] Failed to contact API server when waiting for CSINode publishing: Get "https://api-int.sno-vmware2.localdomain:6443/apis/storage.k8s.io/v1/csinodes/xx-xx-xx-xx-xx-xx": x509: certificate has expired or is not yet valid: current time 2023-06-26T06:05:48Z is after 2023-06-09T02:11:12Z
対策:証明書署名要求(CSR)の承認
そこで、oc
コマンドを使ってペンディング状態になっている証明書を承認してあげます。この操作はkubeconfig
ファイルを保管しているPCなどから実施します。
export KUBECONFIG=./kubeconfig-noingress
oc get csr
(CONDITIONがPendingとなっているCSRがあることを確認)
oc get csr -o name | xargs oc adm certificate approve
(certificatesigningrequest.certificates.k8s.io/csr-bsrdt approved のようなメッセージが表示される)
その後、oc get node
でReadyとなり、OpenShiftのWebコンソールにも接続できるようになりました。
メモ
OpenShift Assisted InstallerでSNOをセットアップする場合は完了後にkubeconfig
ファイルをダウンロードして保管することを忘れずに。そうしないとoc
コマンド操作ができません。