環境
- Kubernetes 1.24
シークレットが当たり前過ぎて全然記事がなかったのでまとめ
追加方法
まずは秘匿情報が書かれたキーとバリューの組み合わせが書かれたファイルを用意する
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 -