[kubernetes][Secret] kubernetes の Secret を使って credentials を Pod にマウントする
credentials を秘匿しながら Pod にマウントしよう。
🤔 kubernetes の Secret とは?
まず kubernetes には ConfigMap と Secret と、Pod に値を渡すための役割として似たようなものが2種類あります。
公式の ConfigMap の注意書きにも
注意: ConfigMapは機密性や暗号化を提供しません。保存したいデータが機密情報である場合は、ConfigMapの代わりにSecretを使用するか、追加の(サードパーティー)ツールを使用してデータが非公開になるようにしてください。
と記載されているので、
- 環境変数は ConfigMap
- credentials の類は Secret
と使い分けたいところです。
🔍 ConfigMap と Secret の違い
に書いてあるとおりですが、
- Secret は dataフィールドのすべてのキーの値は base64 でエンコードされた文字列である必要がある
- Secret は
tmpfs
に保存されるのでディスクストレージに書き込まれない- 復元のリスクが少ない(と思われる)
機密情報を Secret にする根拠としては「tmpfs
に保存されるのでディスクストレージに書き込まれない」からですかね〜。(base64 は根拠にならないよね)
📜 Secret を使って credentials を Pod にマウントする
ようやく本題です。
まずは手元の credentials.json
をもとに Secret を作成します。
$ kubectl create secret generic {Secret名} --from-file={podに配置するファイル名}={credentials.json格納先} # 例 $ kubectl create secret generic my-credentials --from-file=credentials.json=/home/test-user/credentials.json
次に Pod から Secret を参照します。
マニフェストファイルは以下のような形になります。
apiVersion: apps/v1 kind: Deployment metadata: name: sample-deployment spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: volumes: - name: my-key secret: secretName: my-credentials containers: - image: nginx name: sample-pod ports: - containerPort: 80 volumeMounts: - name: my-key mountPath: /var/secret/
Secret 作成時の kubectl create secret generic {Secret名}
で設定した Secret名 を secretName: の値として設定します。
mountPath が credentials の格納先ですね。
kubectl apply -f {マニフェストファイル}
で起動して Pod の中に入って mountPath で指定したパスを確認すると
credentials が格納されていることを確認できます。
おわりに
ConfigMap と Secret についてはなんとなく使える状態まで仕上がりました。
kubernetes 大変ですが、やってて損はないと信じて今後も頑張りましょう。💪