zaki work log

作業ログやら生活ログやらなんやら

[Kubernetes] Helmを使ってインストールすると生成されるシークレットの内容についてのメモ

Helmチャートをインストールすると、sh.helm.release.v1.<リリース名>.v1というシークレットリソースが作成されるけど、これ何だっけ?と思って調べてみた。
結論から言うと、Helmでインストールしたリリース情報がgzip形式で格納されている。これを手動で消したりするとHelmによる制御・管理ができなくなり、リリースの削除等のhelmを使った管理ができなくなる。なので手動で消したりするのは厳禁。
また、アップグレードすると、シークレットは増えていく。

チャートのインストール

$ helm upgrade --install fluentbit fluent/fluent-bit -n logging --create-namespace --version 0.43.0 -f values.yam
l
Release "fluentbit" does not exist. Installing it now.
NAME: fluentbit
LAST DEPLOYED: Thu Feb 29 15:45:51 2024
NAMESPACE: logging
STATUS: deployed
REVISION: 1

[...]

$ kubectl get secret -n logging 
NAME                              TYPE                 DATA   AGE
sh.helm.release.v1.fluentbit.v1   helm.sh/release.v1   1      9s

この通り、チャートをインストールするとシークレットが生成される。

シークレットを削除すると…

$ kubectl delete secret -n logging sh.helm.release.v1.fluentbit.v1 
secret "sh.helm.release.v1.fluentbit.v1" deleted

以下の通りリリースが削除できなくなる。

$ helm uninstall -n logging fluentbit
Error: uninstall: Release not loaded: fluentbit: release: not found

ので、シークレットを削除するのはやめましょう。

リリースをアップグレードすると

デプロイ済みのアプリがある状態で、次のバージョン2をデプロイ

$ helm upgrade --install fluentbit fluent/fluent-bit -n logging --create-namespace --version 0.43.0 -f values.yam
l
Release "fluentbit" has been upgraded. Happy Helming!
NAME: fluentbit
LAST DEPLOYED: Thu Feb 29 15:46:13 2024
NAMESPACE: logging
STATUS: deployed
REVISION: 2
NOTES:
Get Fluent Bit build information by running these commands:

export POD_NAME=$(kubectl get pods --namespace logging -l "app.kubernetes.io/name=fluent-bit,app.kubernetes.io/instance=fluentbit" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace logging port-forward $POD_NAME 2020:2020
curl http://127.0.0.1:2020

すると、v2のシークレットが作成される。

$ kubectl get secret -n logging 
NAME                              TYPE                 DATA   AGE
sh.helm.release.v1.fluentbit.v1   helm.sh/release.v1   1      26s
sh.helm.release.v1.fluentbit.v2   helm.sh/release.v1   1      3s

ここでv2のシークレットを削除すると、Helmとしては「Revision 2はなく、Revision 1の状態」と認識してしまうため、その状態からhelm upgradeを実行するとRevision 2としてデプロイされる。

$ helm upgrade --install fluentbit fluent/fluent-bit -n logging --create-namespace --version 0.43.0 -f values.yam
l
Release "fluentbit" has been upgraded. Happy Helming!
NAME: fluentbit
LAST DEPLOYED: Thu Feb 29 15:50:08 2024
NAMESPACE: logging
STATUS: deployed
REVISION: 2

[...]

で、このシークレットの中身って何なの?

$ kubectl describe -n logging secrets sh.helm.release.v1.fluentbit.v1 
Name:         sh.helm.release.v1.fluentbit.v1
Namespace:    logging
Labels:       modifiedAt=1709189817
              name=fluentbit
              owner=helm
              status=deployed
              version=1
Annotations:  <none>

Type:  helm.sh/release.v1

Data
====
release:  28832 bytes

サイズはそこそこある。
何のデータか確認するためBase64デコードした内容をみると、何かがBase64エンコードされた文字列に見えるので、さらにBase64デコードしてみるとバイナリデータだった。
ファイルへ出力すると中身はgzip圧縮されたデータだった。

$ kubectl get -n logging secrets sh.helm.release.v1.fluentbit.v1 -o jsonpath='{.data.release}' | base64 -d | base64 -d > zzz
$ file zzz
zzz: gzip compressed data, max compression, original size modulo 2^32 108244
$ mv zzz zzz.gz
$ gunzip zzz.gz
$ file zzz
zzz: JSON text data

中身を確認するとチャートとリリースの情報一式が入ってるようだった。

ドキュメント

自力で中身調べてたけど、ドキュメントに載ってましたね。。

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