# helm uninstall <release-name> -n <namespace>
を実行してもHelm releaseが削除できない場合の対処法を紹介します。
参考記事
各バージョンについて
コンポーネント | バージョン |
---|---|
EKS | v1.27 |
helm | v3.16.1 |
Trident | v23.07.0 |
Helm Chart (Trident用) | v23.07.0 |
helmfile | v0.168.0 |
kubectl | v1.27.7-eks-e71965b |
※EKSは過去にv1.24から v1.27へアップグレードしています。
Helm release削除失敗までの経緯
EKSのバージョンを1.27から1.28へアップグレードする前にTridentのバージョンを挙げておこうと思ったら失敗...
# helmfile apply
...
Error: UPGRADE FAILED: unable to build kubernetes objects from current release manifest: resource mapping not found for name: "tridentoperatorpods" namespace: "" from "": no matches for kind "PodSecurityPolicy" in version "policy/v1beta1"
ensure CRDs are installed first
アップグレードできないし、一度TridentのHelm releaseを消して入れなおそうかなと思ったら失敗...
# helm uninstall trident-operator -n trident
Error: failed to delete release: trident-operator
困った...
ここからHelm release削除まで一気に突き進んでいきます!
どうやらEKS v1.27で非推奨のKubernetes APIバージョンの"PodSecurityPolicy"の設定がhelm用secretに定義が残っていて悪さをしていたようです。
犯人はこのsecret!
sh.helm.release.v1.<release-name>.<version>
本環境の場合は"sh.helm.release.v1.trident-operator.v1"です。
これより先は自身の環境のsecret名に置き換えてお読みください。
まずは、犯人のsecretのyaml内容をファイルに出力する!
# kubectl get secret -n trident sh.helm.release.v1.trident-operator.v1 -oyaml > tridentsecret.yaml
# cp tridentsecret.yaml tridentsecret-bk.yaml
設定変更用yamlファイルと設定を元に戻す用のyamlファイルを準備しておくのが安心安全です。
取得した設定変更用yamlファイルをデコードする!
# cat tridentsecret.yaml | grep -oP | grep -oP '(?<=release: ).*' | base64 -d | base64 -d | gzip -d > release.data.decoded
デコードしたファイルを修正する!
# vi release.data.decoded
※以下のpodsecuritypolicyの内容が記載されている部分を探して削除する。
---\n# Source: trident-operator/templates/podsecuritypolicy.yaml\napiVersion: policy/v1beta1\nkind: PodSecurityPolicy\nmetadata:\n name: tridentoperatorpods\n labels:\n app: operator.trident.netapp.io\nspec:\n privileged: false\n seLinux:\n rule: RunAsAny\n supplementalGroups:\n rule: RunAsAny\n runAsUser:\n rule: RunAsAny\n fsGroup:\n rule: RunAsAny\n volumes:\n - projected\n
ファイルをエンコードする!
# cat release.data.decoded | gzip | base64 | base64
※出力結果をコピーする。
設定変更用yamlファイルを修正する!
# vi tridentsecret.yaml
apiVersion: v1
data:
release: <エンコードの出力結果に書き換える>
...
設定変更用yamlファイルを読み込む!
# kubectl apply -f tridentsecret.yaml
secretの設定を元に戻したい場合は以下のコマンドを実行
# kubectl apply -f tridentsecret-bk.yaml
遂にHelm release削除の瞬間!
# helm uninstall -n trident trident-operator
release "trident-operator" uninstalled
おめでとうございます。
終わりに
Helm公式の推奨事項は、Kubernetes クラスターをアップグレードする前に、非推奨の API バージョンを使用しているリリースを、サポートされている API バージョンにアップグレードすること の様です。
(翻訳間違っていたらすみません。)
Recommendation: The best practice is to upgrade releases using deprecated API versions to supported API versions, prior to upgrading to a kubernetes cluster that removes those API versions.
所感
事前に対策する方法は検討する必要があるなぁと思いました。
非推奨APIによるエラーを防止してくれる Helm mapkubeapisプラグイン があるみたいだけどまだノータッチです...
今後試しに使ってみたいと思います!