Kubernetes の Secret 使い方メモ。
Secret とは? Kubernetes で秘密にしたい設定を Pod 定義とは別に分ける。秘密設定は BASE64 で保存される。Pod からはファイルまたは環境変数で参照する。
Secret の作り方
例として、secretfile と secretenv という二つの秘密を作ります。データを作るには base64 でエンコードします。
$ echo -n 'This is a secret file.' | base64
VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
$ echo -n 'This is a secret env.' | base64
VGhpcyBpcyBhIHNlY3JldCBlbnYu
これを yaml 書けば良い。二つの秘密を topsecret という名前の Secret リソースに保存します。
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: topsecret
type: Opaque
data:
secretfile: VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
secretenv: VGhpcyBpcyBhIHNlY3JldCBlbnYu
読み込んで内容を確認します。
$ kubectl apply -f secret.yaml
secret "topsecret" created
$ kubectl get secret topsecret -o yaml
apiVersion: v1
data:
secretenv: VGhpcyBpcyBhIHNlY3JldCBlbnYu
secretfile: VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
...
Secret の使い方
作成した Secret はファイルか環境変数を通じて取り込む事が出来ます。
- 環境変数として取り込むには、.spec.containers[].env[].valueFrom.secretKeyRef を指定します。
- ファイルとして取り込むには、.spec.volumes[].secret を指定します。
# run.yaml
apiVersion: v1
kind: Pod
metadata:
name: run
spec:
containers:
- name: run-container
image: debian
command: ["bin/bash"]
args: ["-c", "echo ${SECRET_ENV} ; cat /etc/secret/secret"]
env:
- name: SECRET_ENV # 環境変数名
valueFrom:
secretKeyRef:
name: topsecret # 環境変数として取り込みたい secret の名前
key: secretenv # 環境変数として取り込みたい値の名前、この場合 secretenv が SECRET_ENV に割り当てられる。
volumeMounts:
- name: secretdir
mountPath: "/etc/secret" # マウントしたいディレクトリを指定する。
volumes:
- name: secretdir
secret:
secretName: topsecret
items:
- key: secretfile
path: secret # マウントしたいファイルを指定する。この場合 secretfile が /etc/secret/secret にマウントされる。
試してみます。
% kubectl create -f run.yaml
pod "run" created
tyamamiya@ducttape:~/doc/docker/secret% kubectl logs run
This is a secret env.
This is a secret file.%
ファイルから Secret を作る
このように手動で base64 して Secret を作るのは非常に面倒臭いので、ファイルから作る方法がいろいろあります。特に、env file (キー=値 形式のファイル) から読み込むと簡単です。
kubectl create secret generic my-secret --from-env-file=path/to/bar.env
Secret は、似たような機能の ConfigMaps と似たオプションが使えるらしく、詳しくは Create ConfigMaps from files 参照。