kubernetes 学習 secret
シークレットの管理 - 平文
シークレット一覧を確認
$ kubectl get secrets NAME TYPE DATA AGE default-token-klj4b kubernetes.io/service-account-token 3 8d
ファイルにシークレットを平文で保存
echo -n "username" > ./username echo -n "this-is-a-password" > ./password
ファイルからシークレット:mysecret を生成。シークレットに複数のkey/valueを設定できる
$ kubectl create secret generic mysecret --from-file=./username --from-file=./password secret/mysecret created
シークレット詳細を確認。ファイル名がシークレットのキー。ファイルの内容がシークレットの値になる
$ kubectl describe secret/mysecret Name: mysecret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 18 bytes username: 8 bytes
PHP脳だとこんな感じか。
secrets[mysecret][username] = `username`; secrets[mysecret][password] = `this-is-a-password`;
シークレットを削除
$ kubectl delete secret mysecret secret "mysecret" deleted
シークレットの管理 - yaml
$ echo -n "username" | base64 dXNlcm5hbWU= $ echo -n "this-is-a-password" | base64 dGhpcy1pcy1hLXBhc3N3b3Jk
secret.yaml 作成。base64エンコードした値を設定
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: dXNlcm5hbWU= password: dGhpcy1pcy1hLXBhc3N3b3Jk
yaml 適用
$ kubectl apply -f ./secret.yaml secret/mysecret created
secret 確認
$ kubectl describe secret/mysecret Name: mysecret Namespace: default Labels: <none> Annotations: Type: Opaque Data ==== password: 18 bytes username: 8 bytes
Getting a shell to a Container
あとでシークレットを環境変数に設定しシェルで確認したいので、脱線するが Getting a shell to a Container をやる。
shell-demo.yaml
apiVersion: v1 kind: Pod metadata: name: shell-demo spec: volumes: - name: shared-data emptyDir: {} containers: - name: nginx image: nginx volumeMounts: - name: shared-data mountPath: /usr/share/nginx/html
apply して pod 確認。
$ kubectl apply -f shell-demo.yaml pod/shell-demo created $ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED N ODE READINESS GATES shell-demo 1/1 Running 0 14s 10.244.1.44 kb2 <none> <none>
kubectl exec -it ... でコンテナのシェルに入る。
$ kubectl exec -it shell-demo -- /bin/bash root@shell-demo:/# ls / bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@shell-demo:/# ls -l /var/log/nginx/ total 8 lrwxrwxrwx. 1 root root 11 Feb 6 08:11 access.log -> /dev/stdout lrwxrwxrwx. 1 root root 11 Feb 6 08:11 error.log -> /dev/stderr
コンテナにsecret設定する
PodSpec の構造を追跡したりする。 PodSpec ->Container -> EnvVar -> EnvVarSource と追っていくとgolangのstructぽいなーと感じた。そりゃそうだ. core/v1/types.go
shell-demo.yaml に env を追加。
apiVersion: v1 kind: Pod metadata: name: shell-demo # PodSpec spec: volumes: - name: shared-data emptyDir: {} # Container array containers: - name: nginx image: nginx volumeMounts: - name: shared-data mountPath: /usr/share/nginx/html # EnvVar array env: - name: SECRET_USERNAME # EnvVarSource valueFrom: # SecretKeySelector secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
pod 作り直し
$ kubectl get pod NAME READY STATUS RESTARTS AGE shell-demo 1/1 Running 0 40m $ kubectl delete pod shell-demo pod "shell-demo" deleted $ kubectl apply -f shell-demo.yaml pod/shell-demo created
「」 コンテナ内の環境変数確認
$ kubectl exec -it shell-demo -- /bin/bash root@shell-demo:/# echo $SECRET_USERNAME username root@shell-demo:/# echo $SECRET_PASSWORD this-is-a-password root@shell-demo:/# echo $asdf
PHP脳だとこんな感じか。
export SECRET_USERNAME=secrets[mysecret][username]; export SECRET_PASSWORD=secrets[mysecret][password];