azure-key-vault-controllerのhelmチャートのバージョンアップ備忘録

#### 前置き 
ちょっと長いです。
ので、時間のない人には、以下の手順でやりましたが通してsecret消えなかったです、とだけ。

helm3.2にしてhelm upgrade
→azure-keyvault-contoroller0.1から1.1に差し替えてhelm upgrade
　→CRD追加しhelm upgrade
　　→マニフェストのAPIバージョン上げてhelm upgrade
　　　→azure-keyvault-contoroller1.1消してhelm upgrade
　　　　→akv2k8s2.1いれてhelm upgrade

どっちもテストしたんですがAKS1.19でも1.20でもどっちでも同じ結果でした。

- 経緯

AKS（というかkubernetes）1.22までに必要なマニフェストの更新について調査したところ、azure-keyvault-contoroller([akv2k8s](https://akv2k8s.io/))の[CRDのAPIがだいぶ変わるようだった](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#customresourcedefinition-v122)のでバージョンアップ検証して既存環境に影響なさそうな手順を検証して活用できたので、メモを。

- CRDの非推奨API

https://kubernetes.io/docs/reference/using-api/deprecation-guide/#customresourcedefinition-v122

- CRDとは

CustomResourceDefinitionの略で、標準のPodとかのリソースとは別に作った人が独自にカスタムで定義して追加するリソースで、
今回アップデートする[akv2k8s](https://akv2k8s.io/)のHelmチャートの場合AzureKeyVaultと同期するためのカスタムリソースが定義されてます。

- helmコマンドと作業時の権限について

[Helm](https://helm.sh/docs/intro/)とはkubernetes用のmanifestを管理して1コマンドでインストールや更新をするための管理ツールというかコマンドで、Ansibleやterraformのような構成管理ツールの一種です。HelmチャートはAnsibleプレイブックのようなものでひとまとめにインストールしたいテンプレートの定義をかためてあるものです。
Helmはkubernetsのマニフェストをデプロイする際の管理に使われるデファクトスタンダードなソフトウェアのようです。(個人的な感想としてはterraformみたいにimportとrmができないと実運用でだいぶ不便？と思ってたのが3.2からマシになるの、か？て感じですがたいしてわかっていない）
今回用いてるHelm自体のバージョンは3.2.0です。

:warning: helmコマンド3.1.1だと、crdやsecretなどの消えると困るリソースが消えることを確認しており、helmコマンド3.2.4だと推奨ラベルが無いといったエラーが出るため、3.2.0にしました。

```
wget https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz && tar -zxvf helm-v3.2.0-linux-amd64.tar.gz && sudo mv linux-amd64/helm /usr/local/bin/helm
helm version
```

※一度helm upgradeを打って3.2.0のhelmが管理してる状態にしてから作業を開始します。
※以下の作業では管理者相当の権限がないとClusterRoleやCustomResourceにpatchを当てられないというようなエラーが出ます。
　今回の環境では[ManagedAD連携](https://docs.microsoft.com/ja-jp/azure/aks/managed-aad)していて[クラスター管理 Azure AD グループのメンバに作業者を入れるとcluster-admin相当の管理者権限がつく](https://docs.microsoft.com/ja-jp/azure/aks/concepts-identity#summary)んですが、もし管理ADグループに入れることで権限追加とはく奪する場合は都度、`az aks get-credentials `を打ってローカルの権限のキャッシュを更新する必要があり、以下の確認コマンドで必要な権限が許可されているかyesが返るかなどを確認します。

```
kubectl auth can-i patch azurekeyvaultsecrets
kubectl auth can-i patch clusterroles
```
- azure-key-vault-controllerバージョンの変化

|  | 既存でつかっているもの | 既存の最新 | 別チャート(env-injector)と統合された最新 |
| --- | --- | --- | --- |
| チャート名 | azure-key-vault-controller | azure-key-vault-controller | kv2k8s |
| helmリポジトリ | spv-charts | spv-charts | spv-charts |
| チャートバージョン | 0.1.23 | 1.1.6 | 2.1.0 |


バージョンはHelmチャートリポジトリの直下のChart.yamlに書いてあります。

バージョンアップ方法はこちらにありますが、chartsディレクトリに入れて依存チャートとしてデプロイしているので若干手順が異なります。
https://akv2k8s.io/installation/upgrade/

このHelmチャートでAzureKeyVaultに入れたセンシティブなデータを同期してSecretに入れてアプリのPodから使うなどの機能を実現しているんですが、
そのKeyvaultと同期するSecretのマニフェストをデプロイする前にazure-key-vaultと同期するためのCRD(CustomResourceDifinition)リソースが存在していないとエラー終了になります。

Helmの素の機能でインストール時の順序をコントロールするには、chartsディレクトリに依存するチャートを配置しておくことでそれが先にインストールされます。（本当はチャートを分離してhelm fileなどをつかって順序を定義するのがいいのかもですがそれは素のhelmについてる機能ではなくて自分でどうにかするのにちょっとかかりそうというか他の更新と混ぜると手順が複雑化して失敗する確率が上がりそうだしなと）

インストール時の前提条件参考↓
https://akv2k8s.io/installation/requirements/
独自の名前空間を定義しないととはあるけど1.1からくっついた機能(env-injector)に必要なものにみえる。defaultのままで大丈夫だった。

ちなみにMSが紹介している模様のシークレットストアCSIドライバは同じ機能だが今使ってないし替えるときに断が出るとアレかなという事情で見送りました。SR問い合わせしやすそうでいいかもしれないとは思う。
https://docs.microsoft.com/ja-jp/azure/key-vault/general/key-vault-integrate-kubernetes
akv2k8sはAzure Key Vaultからのシークレットと証明書を同期するコントローラーで、証明書を取得し、シークレットを作成して使用するが、Secret Store CSI ドライバーはKey Vaultのシークレットと証明書をストレージボリュームとしてマウントする（Azureだけでなく、他のVaultもサポート）模様。Azure Key Vaultのみ使用であれば、akvk8sの方がシンプルな設定で済みそう。


#### 現状確認
ログと現在のデータに異常がないこととバージョン上げる前の状態をみておく

```
$ kubectl get all|grep key
pod/tttest-chart-azure-key-vault-controller-56798b99d5-pvsnz          1/1     Running   0          92s
deployment.apps/tttest-chart-azure-key-vault-controller              1/1     1            1           93s
replicaset.apps/tttest-chart-azure-key-vault-controller-56798b99d5              1         1         1       93s
$ kubectl get crd
NAME                                    CREATED AT
azurekeyvaultsecrets.spv.no             2021-07-15T07:28:27Z

$ kubectl logs -f tttest-chart-azure-key-vault-controller-56798b99d5-pvsnz
time="2021-07-15T07:28:32Z" level=info msg="Log level set to 'info'"
time="2021-07-15T07:28:32Z" level=info msg="Creating event broadcaster"
time="2021-07-15T07:28:32Z" level=info msg="Setting up event handlers"
time="2021-07-15T07:28:32Z" level=info msg="Starting AzureKeyVaultSecret controller"
time="2021-07-15T07:28:32Z" level=info msg="Waiting for informer caches to sync"
time="2021-07-15T07:28:32Z" level=info msg="Starting workers"
time="2021-07-15T07:28:32Z" level=info msg="Started workers"
time="2021-07-15T07:34:31Z" level=info msg="Updating status for AzureKeyVaultSecret 'komitest-secret1'"
time="2021-07-15T07:34:31Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T07:34:31Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"

$ kubectl get akvs
NAME               VAULT         VAULT OBJECT       SECRET NAME        SYNCHED
komitest-secret1   komitest-kv   komitest-secret1   komitest-secret1   2021-07-15T07:35:31Z

$ kubectl get secret komitest-secret1
NAME               TYPE     DATA   AGE
komitest-secret1   Opaque   1      99s

$ kubectl get secrets komitest-secret1 -o jsonpath='{.data}'
{"secret-value":"aGltaXR1"}
$ echo "aGltaXR1"| base64 --decode
himitu

$ kubectl api-versions|grep spv.no
spv.no/v1
spv.no/v1alpha1

$ kubectl api-resources --api-group=spv.no
NAME                   SHORTNAMES   APIVERSION   NAMESPACED   KIND
azurekeyvaultsecrets   akvs         spv.no/v1    true         AzureKeyVaultSecret
```

#### Helmチャートのバージョンアップ1（0.1->1.1に差し替えてからupgrade)
helmリポジトリをアップデートする(0.1->1.1の場合はディレクトリの差し替え後にhelm upgrade可能です)

```
$ helm repo update
```
古いチャートを移動

```
$ mv tttest-chart/charts/azure-key-vault-controller /tmp/azure-key-vault-controller-0.1.23
```
新しいpullしたチャートを配置

```
$ cd /tmp/
$ helm pull spv-charts/azure-key-vault-controller --version 1.1.6
$ ls
$ tar xvzf azure-key-vault-controller-1.1.6.tgz
$ cp -rp azure-key-vault-controller-1.1.6 <path-to-repo>/tttest-chart/charts/azure-key-vault-controller
```
※pullのオプションに --version 0.1.23 とつけると元のバージョンのアーカイブを落とせる。

差分を確認

```
$ cd <path-to-repo>
$ helm list
$ helm diff upgrade tttest-chart tttest-chart -C 3 --allow-unreleased --values env/stg.yaml
```
エラーがなければアップグレード

```
$ helm upgrade --install tttest-chart tttest-chart --values=env/stg.yaml
$ helm list
```
状態を確認する

```
$ kubectl get all|grep key-vault
pod/tttest-chart-azure-key-vault-controller-6c4c4df4dd-w5zwj          1/1     Running   0          42s
deployment.apps/tttest-chart-azure-key-vault-controller              1/1     1            1           29m
replicaset.apps/tttest-chart-azure-key-vault-controller-56798b99d5              0         0         0       29m
replicaset.apps/tttest-chart-azure-key-vault-controller-6c4c4df4dd              1         1         1       43s

$ kubectl logs -f tttest-chart-azure-key-vault-controller-6c4c4df4dd-w5zwj 
time="2021-07-15T07:57:30Z" level=info msg="Log level set to 'info'"
W0715 07:57:30.020227       1 client_config.go:541] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.  
time="2021-07-15T07:57:30Z" level=info msg="Creating event broadcaster"
time="2021-07-15T07:57:30Z" level=info msg="Setting up event handlers"
time="2021-07-15T07:57:30Z" level=info msg="Starting AzureKeyVaultSecret controller"
time="2021-07-15T07:57:30Z" level=info msg="Waiting for informer caches to sync"
time="2021-07-15T07:57:30Z" level=info msg="Starting workers"
time="2021-07-15T07:57:30Z" level=info msg="Started workers"
time="2021-07-15T07:57:30Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T07:58:30Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T07:58:30Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"

$ kubectl get akvs
NAME               VAULT         VAULT OBJECT       SECRET NAME        SYNCHED
komitest-secret1   komitest-kv   komitest-secret1   komitest-secret1   2021-07-15T07:58:30Z

$ kubectl get secret komitest-secret1
NAME               TYPE     DATA   AGE
komitest-secret1   Opaque   1      25m
$ kubectl get secret|grep key-vault
tttest-chart-azure-key-vault-controller-env               Opaque                                0      3m35s
tttest-chart-azure-key-vault-controller-token-sbhxt       kubernetes.io/service-account-token   3      32m

$ kubectl api-versions|grep spv.no
spv.no/v1
spv.no/v1alpha1
```
あるべき個数が0になってるリソースは消して大丈夫だが後続の最新バージョン2.1にする場合は1.1消すときに消えるのでこれ↓はしなくていい
`kubectl delete replicaset tttest-chart-azure-key-vault-controller-56798b99d5`

#### CRDのアップデート
CRDは消すと関連するリソースが跡形もなくなることが公式にも書いてあり実際そうなので、消さずにアップデートする必要がある。

```
$ wget https://raw.githubusercontent.com/SparebankenVest/azure-key-vault-to-kubernetes/master/crds/AzureKeyVaultSecret.yaml
$ cp -p AzureKeyVaultSecret.yaml tttest-chart/charts/azure-key-vault-controller/templates/
$ helm upgrade --install tttest-chart tttest-chart --values=env/stg.yaml
```
※公式だとkubectlでアップデートしてるが、kubectlでアップデートできるのはkubectlで作ったリソースだけというようなエラーが出るのでHelmでデプロイしている。

状態を確認する

```
$ kubectl get all|grep key-vault
pod/tttest-chart-azure-key-vault-controller-6c4c4df4dd-w5zwj          1/1     Running   0          12m
deployment.apps/tttest-chart-azure-key-vault-controller              1/1     1            1           41m
replicaset.apps/tttest-chart-azure-key-vault-controller-56798b99d5              0         0         0       41m
replicaset.apps/tttest-chart-azure-key-vault-controller-6c4c4df4dd              1         1         1       12m

$ kubectl logs -f tttest-chart-azure-key-vault-controller-6c4c4df4dd-w5zwj
～略～
W0715 08:01:43.966583       1 reflector.go:302] pkg/mod/k8s.io/client-go@v0.15.11/tools/cache/reflector.go:98: watch of *v1.AzureKeyVaultSecret ended with: too old resource version: 6005636 (6005821)
time="2021-07-15T08:02:00Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:02:00Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:03:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:03:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:04:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:04:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:05:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:05:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:06:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:06:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:07:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:07:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:08:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:08:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:09:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:09:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"

$ kubectl get akvs
NAME               VAULT         VAULT OBJECT       SECRET NAME        SYNCHED   AGE
komitest-secret1   komitest-kv   komitest-secret1   komitest-secret1   49s       37m

$ kubectl get secret komitest-secret1
NAME               TYPE     DATA   AGE
komitest-secret1   Opaque   1      37m

$ kubectl api-versions|grep spv.no
spv.no/v1
spv.no/v1alpha1
spv.no/v2alpha1
spv.no/v2beta1
```
CRDを上げると使えるapi-versionsが増える。
ちなみにCRDを消すとsecretやakvsなどの関連リソースが消えてkeyvault-contorollerのPodは大量のエラーを垂れ流し続けて、チャートごとまっさらにしてから作り直すことになる。別にKeyvaultの中身が消えたりはしないので同期するためのリソースを消して作り直すだけ。ただその間にサービス影響は出ると思われる。

#### akvsリソース(secret)のAPIバージョンのアップデート
古いですよというのがログにも出ていたためアップデートをする

```
$ vi tttest-chart/templates/secrets.yaml 
apiVersion: spv.no/v1alpha1
#apiVersion: spv.no/v2beta1
 ↓
#apiVersion: spv.no/v1alpha1
apiVersion: spv.no/v2beta1

egrep -a 'apiVersion|^  name: ' tttest-chart/templates/secrets.yaml

$ helm diff upgrade tttest-chart tttest-chart -C 3 --allow-unreleased --values env/stg.yaml
$ helm upgrade --install tttest-chart tttest-chart --values=env/stg.yaml
$ helm list
```
状態を確認する

```
$ kubectl logs -f tttest-chart-azure-key-vault-controller-6c4c4df4dd-w5zwj 
time="2021-07-15T07:57:30Z" level=info msg="Log level set to 'info'"
W0715 07:57:30.020227       1 client_config.go:541] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.  
time="2021-07-15T07:57:30Z" level=info msg="Creating event broadcaster"
time="2021-07-15T07:57:30Z" level=info msg="Setting up event handlers"
time="2021-07-15T07:57:30Z" level=info msg="Starting AzureKeyVaultSecret controller"
time="2021-07-15T07:57:30Z" level=info msg="Waiting for informer caches to sync"
time="2021-07-15T07:57:30Z" level=info msg="Starting workers"
time="2021-07-15T07:57:30Z" level=info msg="Started workers"
～略～
time="2021-07-15T08:13:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:13:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:14:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:14:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:15:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:15:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"
time="2021-07-15T08:16:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Azure Key Vault"
time="2021-07-15T08:16:15Z" level=info msg="Successfully synced AzureKeyVaultSecret 'default/komitest-secret1' with Kubernetes Secret"

$ kubectl get akvs
NAME               VAULT         VAULT OBJECT       SECRET NAME        SYNCHED   AGE
komitest-secret1   komitest-kv   komitest-secret1   komitest-secret1   35s       44m
$ kubectl get secret komitest-secret1
NAME               TYPE     DATA   AGE
komitest-secret1   Opaque   1      44m
```
Successfully syncedでているし問題なし。



#### Helmチャートのバージョンアップ２（1.1を消してから2.1にupgrade)

公式には1.xから2.xに上げるには一回消してからインストールしてねと書いている。（チャート名が変わるし）

1.1を消すとき、podやdeploymentやreplicasetなどのリソースは消えますが、CRDは最新入れてるせいなのかhelm3.2だからなのか、
crd,akvs,secretのリソースは存在しててsecretが消えない。ということはアプリの挙動に影響しない。

リポジトリ更新後に上げる先のチャートを落としてくる

```
cd /tmp
~/k8s-manifests/helm pull spv-charts/akv2k8s --version 2.1.0

　既にあるなら消してからアーカイブを解凍する
　rm -r akv2k8s
tar xvzf akv2k8s-2.1.0.tgz 
```
古いチャートを移動する（チャート削除1.1.6）

```
cd <ヘルムのリポジトリ直下>
mv tttest-chart/charts/azure-key-vault-controller ../azure-key-vault-controller_1.1.6
ls  tttest-chart/charts/
```

差分を確認し、エラーがなければアップグレード（チャートを一旦消す1.1.6）

```
helm diff upgrade tttest-chart tttest-chart -C 3 --allow-unreleased --values env/${environment}.yaml
helm upgrade --install tttest-chart tttest-chart --values=env/${environment}.yaml
helm list
```
リソース確認する

```
kubectl get all
kubectl get akvs
kubectl get ingress -o wide
kubectl get crd
kubectl get secret
kubectl get secret komitest-secret1 -o jsonpath='{.data}'
kubectl api-versions|grep spv.no
kubectl api-resources --api-group=spv.no
kubectl logs -f --tail=20 <keyvault-controllerのPod名>
```
→secretやakvsやcrdが残ってたらよい結果、そうでなければ失敗なので、別途リカバリする
　この時点ではpod,deployment,replicasetなどは消えててcrd,secret,akvsが残るという動きになる。（先にCRDを最新にしていることとhelm3.2が必須）

新しいpullしたチャートを配置（最新のチャートを追加）

```
cp -rp /tmp/akv2k8s <path-to-repo>/tttest-chart/charts/
grep version tttest-chart/charts/akv2k8s/Chart.yaml
```

version: 2.1.0を確認

差分を確認し、エラーがなければアップグレード（最新のチャートを追加）

```
helm diff upgrade tttest-chart tttest-chart -C 3 --allow-unreleased --values env/${environment}.yaml
helm upgrade --install tttest-chart tttest-chart --values=env/${environment}.yaml
helm list
```
リソース確認する

```
kubectl get all
kubectl get akvs
kubectl get crd
kubectl get secret
kubectl get secret komitest-secret1 -o jsonpath='{.data}'
kubectl api-versions|grep spv.no
kubectl api-resources --api-group=spv.no
kubectl logs -f --tail=20 <keyvault-controllerのPod名>
```
→secretやakvsやcrdが残ってたらよい結果、そうでなければ失敗なので、別途リカバリする
    問題なかったら、パイプラインとかgitとかコミットして差分を吸収する。

#### 問題が出たケースの備忘録とリカバリ方法
:warning: 以下の手順では一回secretなどのリソースは消えるのでリソースが復活するまではサービス断時間がある。

- helmが3.1.1の場合、チャートを消したらcrdやsecretが消えたケースがあった
- helmが3.1.1でkeyvaultのチャートだけ消えてsecretが残っているか、消えているがhelm側が情報を持っていて消す挙動をするようなケースの場合、一旦切り戻すために別チャートでkeyvaultContorollerのチャートを入れないと、secretのリソースのマニフェストに書いてあるAPIバージョンが存在しないので消すことができない、というようなエラーがでる。
- 別チャートを入れることでAPIが存在することになるので消せるようになるが、別チャートを入れる際に変に残っていたsecretは勝手に消えるという挙動をしていた。それでもdataはAzureKeyvautのコンテナPaaS側に残っており、チャートを消して入れなおしてから元のマニフェストでsecretを再度入れなおせば元通りになる。

```
helm list
helm upgrade --install akvsold /tmp/azure-key-vault-controller-0.1.23 # helm upgrade --install <任意のチャート名> <任意のチャートディレクトリ>
helm list
secretを消してhelm upgradeする
helm uninstall akvsold
元のチャートを依存chartディレクトリに配置してhelm upgradeする
secretを追加してhelm upgradeする
```

- このほかの切り戻し方としてはチャートを全消ししてリソースも消して入れなおす、という話になるけど多分テスト環境でしか許されないしingressのIPとか変わる。
https://stackoverflow.com/questions/59443834/helm-3-install-for-resouces-that-exist

```
helm uninstall tttest-chart 
kubectl get all
kubectl -n default delete pod,deployment,replicaset,service,configmap,ingress,secret --all
helm upgrade --install tttest-chart tttest-chart --values=env/${environment}.yaml
```


#### 非推奨APIがないことをfind+grepで確認

最期にリポジトリからアクティブな非推奨APIがみつからないことを確認する

```
$ cd tttest-chart
$ find ./ -type f |xargs grep apiextensions.k8s.io/v1beta
```

#### env-injectorを止めたい場合
chartdir/values.yamlに以下を追記してhelm upgradeで依存チャートの変数を上書きすると余計なPodとか起動しなくなるしhelm diffの差分でなくなるので使ってない場合はそうしたほうがよさそう。akv2k8sチャート内のvalues.yamlを上書きする意味合い。

```
akv2k8s:
  env_injector:
  # -- Whether to install the env-injector
    enabled: false
```


#### 参考

helm3.2関連
https://jacky-jiang.medium.com/import-existing-resources-in-helm-3-e27db11fd467

チャート全消し関連
https://stackoverflow.com/questions/59443834/helm-3-install-for-resouces-that-exist
https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E5%89%8A%E9%99%A4

k8sのRBAC関連
https://qiita.com/sheepland/items/67a5bb9b19d8686f389d