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

```
# helm uninstall <release-name> -n <namespace>
```
を実行してもHelm releaseが削除できない場合の対処法を紹介します。

# 参考記事

https://helm.sh/docs/topics/kubernetes_apis/

# 各バージョンについて

| コンポーネント | バージョン |
|:-----------|------------:|
| 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
```

:::note warn
設定変更用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
```

:::note info
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プラグイン** があるみたいだけどまだノータッチです...
今後試しに使ってみたいと思います！