It's a peacehell world.

こんな名前ですが情報技術について主に扱うブログです。

[kubernetes][Secret] kubernetes の Secret を使って credentials を Pod にマウントする

credentials を秘匿しながら Pod にマウントしよう。

🤔 kubernetes の Secret とは?

まず kubernetes には ConfigMapSecret と、Pod に値を渡すための役割として似たようなものが2種類あります。

公式の ConfigMap の注意書きにも

注意: ConfigMapは機密性や暗号化を提供しません。保存したいデータが機密情報である場合は、ConfigMapの代わりにSecretを使用するか、追加の(サードパーティー)ツールを使用してデータが非公開になるようにしてください。

と記載されているので、

と使い分けたいところです。

🔍 ConfigMap と Secret の違い

kubernetes.io

に書いてあるとおりですが、

  • 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 大変ですが、やってて損はないと信じて今後も頑張りましょう。💪