tjtjtjのメモ

自分のためのメモです

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

base64エンコードした値を得る

$ 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];