はじめに
Let's EncryptでSSL証明書を更新するためにGKEでcert-managerを動かしています。
今回、apiVersionをcert-manager.io/v1alpha2
からcert-manager.io/v1
に変更したさいに、ハマったのでメモ。
手順書
公式のドキュメントでいくとこのあたりを見ておく。
エラー内容
でも、うまく動かなかった。cert-mangaerのpodででたエラーは下記の通り。
cert-manager
k8s.io/client-go@v0.23.4/tools/cache/reflector.go:167: Failed to watch *v1.Certificate: failed to list *v1.Certificate: request to convert CR from an invalid group/version: cert-manager.io/v1alpha2
cert-manager-webhook
http: TLS handshake error from xxx.xxx.xxx.xxx:xxxxx: EOF
原因
v1に更新したはずなのに、v1alpha2を見ているようだ。古いCRDが残っているみたいです。
CRDとは、Custom Resource Definitionsというk8sが提供する独自のリソース定義の機能です。
ビルトインのリソースであるPodsやConfigMapと同じものです。
解決方法
今回、無停止である必要がなかったので、いったん名前空間ごと削除して作り直しました。
- 名前空間ごとcert-mangaerを削除
- 古いCRDを削除
- 新規でcert-mangaerを作成
手順2 「古いCRDを削除」の方法
本来であれば、手順1でkubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/{削除対象のバージョン}/cert-manager.yaml
でCRDも削除される想定でした。
しかし消えなかったので、古いバージョンのCRDを特定する必要があります。(よく分からなかったので、とりあえずcertmanager関連は全部消しました)
$ kubectl get crd | grep certmanager
$ kubectl get crd | grep cert-manager
表示されたCRDの名前は、kubectl delete crd {CRDの名前}
でも削除できないため、削除パッチを当てます。
finalizersを空にすることで削除できます。
kubectl patch crd/{{CRDの名前}} -p '{"metadata":{"finalizers":[]}}' --type=merge
#(例)
kubectl patch crd/certificaterequests.cert-manager.io -p '{"metadata":{"finalizers":[]}}' --type=merge
kubectl patch crd/certificates.cert-manager.io -p '{"metadata":{"finalizers":[]}}' --type=merge
kubectl patch crd/clusterissuers.cert-manager.io -p '{"metadata":{"finalizers":[]}}' --type=merge
削除後、新規でcert-mangaerを作成すると、正常にcert-managerが動作します。
おわりに
下記のissueを見て回ったけど、k8sの理解が浅くて解決方法が分からなかったですが、解決できてよかったです。