TL;DR
- OpenShift インストール時に、内部の ingress にセットされるデフォルトの証明書 (cert) は有効期限2年が設定されており、2年を超えてそのまま使い続けるとクラスタが徐々に崩壊してくる
- cert を再作成することで大部分の問題は解決する: How to redeploy/renew an expired default ingress certificate in RHOCP4 - Red Hat Customer Portal
- OLM 周りに問題が残ることがあるので、その場合は packageserver の cert も再作成する: How to renew/rotate the certificate for cluster operator operator-lifecycle-manager-packageserver in RHOCP4 - Red Hat Customer Portal
(以下のコマンドラインは再現のため再構築したものなので、一部実際とは異なる点があるかもしれません)
問題発生
それは、削除できない名前空間から始まった。
$ oc delete ns mynamespace
namespace "mynamespace" deleted
$ oc get ns | grep mynamespace
mynamespace Terminating 27d
こうなった場合に一番あり得るのが、「finalizer で登録された Pod が先にいなくなってしまったため、後処理する人がいなくて削除が止まる」という理由。多くのページでは(例えば こちら)、原因となっているリソースを復旧させるか、それでも無理なら .spec.finalizers
を削除すればよい、と書いてある。
ところが私の場合、oc edit
で .spec.finalizers
を削除しても、再度 oc get ns
で確認すると .spec.finalizers
が勝手に復活してしまい、いつまで経っても削除できなかった。
そのメッセージを見てみると、どうやら packageserver という Operator が提供する apiservice の不具合らしい。PackageManifest
カスタムリソースが見つからないようだ。PackageManifest
は、Operator Lifecycle Manager (OLM) の CatalogSource
で追加された Operator ひとつにつきひとつ用意される、いわば OLM でインストール可能な Operator を表現するためのカスタムリソースで、その定義がない、というのは明らかにおかしい。
$ oc -n openshift-operator-lifecycle-manager get csv packageserver
NAME DISPLAY VERSION REPLACES PHASE
packageserver Package Server 0.19.0 Installing
ステータスが Installing
になっていて、どうやら packageserver のインストールが途中で止まっているようだ。
仕方ないので OpenShift web console から入ってみようとて、新規ユーザを作成して web console にログインを試みるもログインできない。おかしいなと思って CLI でログインしようとすると…
$ oc login https://api.example.com/ -u myuser -p mypasswd
error: x509: certificate has expired or is not yet valid: ...
あ、これは証明書の問題だ、と気付いた。
ingress-controller の cert 更新
エラーメッセージで検索を書けると、原因と対策はすぐに見つかった。
How to redeploy/renew an expired default ingress certificate in RHOCP4 - Red Hat Customer Portal
OpenShift はインストール後2年でデフォルト証明書の有効期限が切れてしまい、不具合が発生し始めることが記述されている。そこで、ここに書いてあることを丁寧に読んで、"Workaround for the default ingress certificate" に記述されている手順を踏んだ。手順実施直後は oc login
できなかった (oauth サーバが応答してくれない)が、しばらく(数分)時間が経つと oc login
できるようになり、web console にも入れるようになった。どうやら更新した証明書は徐々に内部サービスに浸透していくらしい。そうかそうか、待てばいいのか。
しかし、待てど暮らせど packageserver
は Installing
のまま。正直途方に暮れた。
packageserver の cert 更新
ここで「もしや」と思って、"operator package server certificate renew" で検索してみた。
全ての Operator に浸透するわけじゃないのか…とここで気付いた。このドキュメントも上記の ingress-controller のものと同じく丁寧に記述されているので、きちんと手順を踏めば証明書は更新される。
そして…
$ oc -n openshift-operator-lifecycle-manager get csv packageserver
NAME DISPLAY VERSION REPLACES PHASE
packageserver Package Server 0.19.0 Succeeded
$ oc get ns | grep mynamespace
$
消えた。