前置き
ちょっと長いです。
ので、時間のない人には、以下の手順でやりましたが通して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)のCRDのAPIがだいぶ変わるようだったのでバージョンアップ検証して既存環境に影響なさそうな手順を検証して活用できたので、メモを。
- CRDの非推奨API
- CRDとは
CustomResourceDefinitionの略で、標準のPodとかのリソースとは別に作った人が独自にカスタムで定義して追加するリソースで、
今回アップデートするakv2k8sのHelmチャートの場合AzureKeyVaultと同期するためのカスタムリソースが定義されてます。
- helmコマンドと作業時の権限について
Helmとはkubernetes用のmanifestを管理して1コマンドでインストールや更新をするための管理ツールというかコマンドで、Ansibleやterraformのような構成管理ツールの一種です。HelmチャートはAnsibleプレイブックのようなものでひとまとめにインストールしたいテンプレートの定義をかためてあるものです。
Helmはkubernetsのマニフェストをデプロイする際の管理に使われるデファクトスタンダードなソフトウェアのようです。(個人的な感想としてはterraformみたいにimportとrmができないと実運用でだいぶ不便?と思ってたのが3.2からマシになるの、か?て感じですがたいしてわかっていない)
今回用いてるHelm自体のバージョンは3.2.0です。
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連携していてクラスター管理 Azure AD グループのメンバに作業者を入れるとcluster-admin相当の管理者権限がつくんですが、もし管理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チャートのバージョンアップ2(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とかコミットして差分を吸収する。
問題が出たケースの備忘録とリカバリ方法
以下の手順では一回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