このセクションでは、Secret リソースの情報を Pod 内コンテナーの ボリューム( Volume )としてマウントし渡す方法について紹介します。

まず、Master サーバーから Kubernetes クラスタ上に Secret リソースを作成します。

[root@kube-master sample-secret]# kubectl create secret generic --save-config sample-secret --from-literal=username=root --from-literal=password=root-password
secret/sample-secret created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上で作成したSecret リソースの情報を yaml 形式で出力します。ここでは、 username と password の情報が確認できます。secret で定義した情報は、base64 でエンコードされます。

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yaml
apiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-secret","creationTimestamp":null},"data":{"password":"cm9vdC1wYXNzd29yZA==","username":"cm9vdA=="}}
  creationTimestamp: "2019-02-02T07:38:06Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3419018"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: 7b031bde-26bd-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]# 

Secret 情報を一つずつVolume にマウントして渡す場合

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-secret]# vi sample-secret-single-volume.yaml 

spec の containers の volumeMounts にコンテナー上のボリュームをマウントするパスを指定します。 spec の volumes に指定したパスにマウント情報を指定します。ここでは、Secret( sample-secret )リソースにある username 情報を /config/ ディレクトリに username.txt として登録する指定をしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-single-volume
spec:
  containers:
    - name: secret-container
      image: nginx:1.12
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      secret:
        secretName: sample-secret
        items:
        - key: username
          path: username.txt

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-secret]# kubectl apply -f sample-secret-single-volume.yaml 
pod/sample-secret-single-volume created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースを確認します。

[root@kube-master sample-secret]# kubectl get pod sample-secret-single-volume
NAME                          READY   STATUS    RESTARTS   AGE
sample-secret-single-volume   1/1     Running   0          8s
[root@kube-master sample-secret]# 

Master サーバーから Pod( sample-secret-single-volume )内 の /config/username.txt に登録されている情報を確認します。ここでは、Secret リソースの username に定義されている 情報が username.txt に登録されていることが確認できます。

[root@kube-master sample-secret]# kubectl exec -it sample-secret-single-volume cat /config/username.txt
root
[root@kube-master sample-secret]# [root@kube-master sample-secret]#

Secret 情報を全て Volume にマウントして渡す場合

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-secret]# vi sample-secret-all-volume.yaml 

spec の containers の volumeMounts にコンテナー上のボリュームをマウントするパスを指定します。 spec の volumes に指定したパスにマウント情報を指定します。ここでは、Secret( sample-secret )リソースにある 全ての情報( username と password )を /config/ ディレクトリに登録する指定をしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-all-volume
spec:
  containers:
    - name: secret-container
      image: nginx:1.12
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      secret:
        secretName: sample-secret

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-secret]# kubectl apply -f sample-secret-all-volume.yaml 
pod/sample-secret-all-volume created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースを確認します。

[root@kube-master sample-secret]# kubectl get pod sample-secret-all-volume
NAME                       READY   STATUS    RESTARTS   AGE
sample-secret-all-volume   1/1     Running   0          17s
[root@kube-master sample-secret]# 

Master サーバーから Pod( sample-secret-all-volume )内 の /config/ ディレクトリを参照します。ここでは、/config/ ディレクトリに username と password ファイルが確認できます。

[root@kube-master sample-secret]# kubectl exec -it sample-secret-all-volume ls /config/
password  username
[root@kube-master sample-secret]# 

Master サーバーから Pod( sample-secret-all-volume )内 の /config/ ディレクトリにある username と password ファイルの確認します。ここでは、Secret リソースの username と password に定義されている 情報が username と password ファイルにそれぞれ登録されていることが確認できます。

[root@kube-master sample-secret]# kubectl exec -it sample-secret-all-volume cat /config/username
root
[root@kube-master sample-secret]# [root@kube-master sample-secret]# kubectl exec -it sample-secret-all-volume cat /config/password root-password
[root@kube-master sample-secret]#

Master サーバーから Kubernetes クラスタ上の Secret と Pod リソースを確認します。

[root@kube-master sample-secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-75dfq   kubernetes.io/service-account-token   3      28d
sample-secret         Opaque                                2      46m
[root@kube-master sample-secret]# 

[root@kube-master sample-secret]# kubectl get pod 
NAME                          READY   STATUS    RESTARTS   AGE
sample-secret-all-volume      1/1     Running   0          7m36s
sample-secret-prefix-env      1/1     Running   0          36m
sample-secret-single-volume   1/1     Running   0          30m
[root@kube-master sample-secret]# 

Master サーバーから 作成したKubernetes クラスタ上の Secret と Pod リソースを全て削除します。

[root@kube-master sample-secret]# kubectl delete secret sample-secret
secret "sample-secret" deleted
[root@kube-master sample-secret]# 

[root@kube-master sample-secret]# kubectl delete pod sample-secret-all-volume sample-secret-prefix-env sample-secret-single-volume
pod "sample-secret-all-volume" deleted
pod "sample-secret-prefix-env" deleted
pod "sample-secret-single-volume" deleted
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Secret と Pod リソースが削除されていることを確認します。

[root@kube-master sample-secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-75dfq   kubernetes.io/service-account-token   3      28d
[root@kube-master sample-secret]# 

[root@kube-master sample-secret]# kubectl get pod 
No resources found.
[root@kube-master sample-secret]#