Kubernetes で Secret を単一ファイルとしてマウントする
https://4.bp.blogspot.com/-0Rz1rpJmOXw/V8jqYWtsdOI/AAAAAAAA9eE/48HyKYDJNLoIkfCMa8c_CC6LG45AdC3hgCLcB/s400/computer_cloud_storage.png
まとめ
Secret の中身をファイルとして扱う場合は volumes を利用する
mountPath に指定したディレクトリに volume はまるごとマウントされる
単一ファイルとして扱いたいならさらに追加で subPath を指定する
/icons/hr.icon
事前準備
予め事前にこんなコマンドで Secret を Kubernetes 上に生成しておく。(Secret の更新ができるようにあえて dry-run して yaml を作ってから apply に pipe している。)このコマンドで myapp という Secret が Kubernetes 上に用意され、実行時のカレントディレクトリにある .env ファイルの内容を .env というキー名で Secret 中に格納する。もちろん YAML を作ってから適用しても良い。 code:Secretを作成・更新するコマンド(bash)
kubectl create secret generic myapp --from-file=.env=.env --dry-run -o yaml | kubectl apply -f -
Secret を Volume として扱う
そして作成した Secret 中の .env を Kubernetes の Deployments で起動したコンテナで利用するには下記のように設定する。
code:deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
# ~ 中略 ~
spec:
volumes:
- name: secret
secret:
secretName: myapp
containers:
- name: myapp
# ~ 中略 ~
volumeMounts:
- name: secret
mountPath: /var/app/.env
subPath: .env
- name: secret
mountPath: /opt/secret
順を追っていくと・・・
まず volumes に secret という名前で myapp という名前の Secret を紐付ける。
続いて containers の volumeMounts で定義してある volume のマウント設定を行う。
secret という名前の volume を mountPath に指定の /var/app/.env にマウントする。
ここで肝になるのは subPath の設定で volume 中の 指定のキーに対応するデータは mountPath にマウントされる。
比較用として、同じく secret という名前の volume を mountPath に指定の /opt/secret にマウントする
こちらは subPath を設定していないので volume がまるごとマウントされ、/opt/secret はディレクトリとなり、その中にキー名に対応するファイルが配置されることになる。
code:subPath を指定してファイルとしてマウントした場合(bash)
# ls -la /var/app/.env
-rw-r--r-- 1 root root 20 May 14 15:40 /var/app/.env
# file /var/app/.env
/var/app/.env: ASCII text # ← 単一ファイルとしてマウントされている
code: subPath を解除してあえてディレクトリとしてマウントした場合(bash)
# ls -al /opt/secret
total 4
drwxrwxrwt 3 root root 120 May 14 15:40 .
drwxr-xr-x 1 root root 4096 May 14 15:40 ..
drwxr-xr-x 2 root root 80 May 14 15:40 ..2020_05_14_15_40_34.297617452
lrwxrwxrwx 1 root root 31 May 14 15:40 ..data -> ..2020_05_14_15_40_34.297617452
lrwxrwxrwx 1 root root 11 May 14 15:40 .env -> ..data/.env
lrwxrwxrwx 1 root root 12 May 14 15:40 dummy -> ..data/dummy # ← 複数ファイルが一度にマウントされる
余談
ちなみになんでこんなことを調べたのかというと kubectl create secret のタイミングで --from-file と --from-env-file を同時に設定できなかったため。Secret を分けても良かったけど、触ってたアプリがもともと .env の読み込みに対応してたので一気にファイルとしてマウントできたほうが便利だったのでやってみたらマウントしたらディレクトリになってしまったのでどうしたものかと探していたら subPath にたどり着いた。という流れであった。Stackoverflow は便利。