環境
シークレットが当たり前過ぎて全然記事がなかったのでまとめ
追加方法
まずは秘匿情報が書かれたキーとバリューの組み合わせが書かれたファイルを用意する
NAME=taro
PASSWORD=12345
kubectl create secret generic
構文でシークレットを登録する。my-secretの部分は任意の名前
kubectl create secret generic my-secret --from-env-file=.env
確認
$ kubectlubectl get secret
NAME TYPE DATA AGE
my-secret Opaque 2 19s
個別のを確認してみる。値はBase64で格納されている。
$ kubectl get secrets my-secret -o yaml
apiVersion: v1
data:
NAME: dGFybw==
PASSWORD: MTIzNDU=
kind: Secret
metadata:
creationTimestamp: "2022-08-30T14:19:42Z"
name: my-secret
namespace: default
resourceVersion: "6839359"
uid: 63868e12-b4a3-4a28-a5ed-7a2ec1314b86
type: Opaque
kubectlから値の確認方法
別に暗号化されている訳ではないのでコマンドを駆使すれば値を得られる
$ kubectl get secrets my-secret -o json | jq -r '.data.NAME' | base64 --decode
taro
$ kubectl get secrets my-secret -o json | jq -r '.data.PASSWORD' | base64 --decode
12345
Podからの値の確認方法
PodからはSecret名を指定して起動すると、環境変数として取得することが出来る
例えば適当に以下のような環境変数を出力するだけのPodを作成する。「my-secret」が最初作ったSecret名になっている。
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
resources: {}
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- secretRef:
name: my-secret
restartPolicy: Never
kubectl apply -f deployment.yml
でログを確認してみる おk
$ kubectl logs secret-test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=secret-test-pod
SHLVL=1
HOME=/root
NAME=taro
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
PASSWORD=12345
シークレットを更新する
実はSecretsまたはConfigMapのアップデートはkubectlコマンド自体には用意されていない。
そこで新たにそれ用のYAMLを生成し kubectl apply
でパッチする
kubectl create secret generic my-secret --from-env-file=.env --dry-run=client -o yaml | kubectl apply -f -
参考リンク