2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ビジネスエンジニアリング株式会社Advent Calendar 2024

Day 15

削除できなくなったHelm releaseを無理やり削除してみた

Last updated at Posted at 2024-12-14
# 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プラグイン があるみたいだけどまだノータッチです...
今後試しに使ってみたいと思います!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?