このセクションでは、Secret リソースを Pod 内のコンテナーに環境変数を使って渡す方法について紹介します。

まず、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 リソースを確認します。 sample-secret リソースが Opaque タイプで起動していることが確認できます。

[root@kube-master sample-secret]# kubectl get secrets sample-secretNAME            TYPE     DATA   AGE
sample-secret   Opaque   2      7s
[root@kube-master sample-secret]# 

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

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yamlapiVersion: 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-02T05:41:14Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3409123"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: 279af3f0-26ad-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]#

Secret 情報を一つずつ環境変数に渡す場合

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

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

spec の containers の env に Secret リソースからコンテナーに渡す環境変数を指定します。ここでは、sample-secret の Secret リソースに登録されている username をコンテナーの環境変数に登録するようにしています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-single-env
spec:
  containers:
    - name: secret-container
      image: nginx:1.12
      env:
        - name: LOGIN_USER
          valueFrom:
            secretKeyRef:
              name: sample-secret
              key: username

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

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

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

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

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

[root@kube-master sample-secret]# kubectl exec -it sample-secret-single-env env | grep LOGIN_USER
LOGIN_USER=root
[root@kube-master sample-secret]# 

Secret 情報を全て環境変数に渡す場合

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

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

spec の containers の envFrom に Secret リソースを指定します。ここでは、Secret リソースにsample-secret を指定しています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-single-env
spec:
  containers:
    - name: secret-container
      image: nginx:1.12
      envFrom:
      - secretRef: 
          name: sample-secret

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

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

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

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

Master サーバーから Pod( sample-secret-all-env )内の 環境変数を確認します。ここでは、Secret リソースの username と password に定義されている 情報が環境変数として登録されていることが確認できます。

[root@kube-master sample-secret]# kubectl exec -it sample-secret-all-env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=sample-secret-all-env
TERM=xterm
password=root-password
username=root
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root
[root@kube-master sample-secret]# 

Secret 情報をプレフィックスを付与して全て環境変数に渡す場合

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

[root@kube-master sample-secret]# vi sample-secret-prefix-env.yaml 

spec の containers の envFrom で複数の Secret を読み込む場合、prefix を付与すると Key の衝突を回避することができます。ここでは、LOGIN1_ と LOGIN2_ のプレフィックスを指定しています。

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-prefix-env
spec:
  containers:
    - name: secret-container
      image: nginx:1.12
      envFrom:
      - secretRef:
          name: sample-secret
        prefix: LOGIN1_
      - secretRef:
          name: sample-secret
        prefix: LOGIN2_

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

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

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

[root@kube-master sample-secret]# kubectl get pod sample-secret-prefix-env
NAME                       READY   STATUS    RESTARTS   AGE
sample-secret-prefix-env   1/1     Running   0          11s
[root@kube-master sample-secret]# 

Master サーバーから Pod( sample-secret-prefix-env )内の 環境変数を確認します。ここでは、Secret リソースの username と password に定義されている 情報が LOGIN1_ と LOGIN2_ で別々に環境変数として登録されていることが確認できます。

[root@kube-master sample-secret]# kubectl exec -it sample-secret-prefix-env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=sample-secret-prefix-env
TERM=xterm
LOGIN2_username=root
LOGIN1_password=root-password
LOGIN1_username=root
LOGIN2_password=root-password
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root
[root@kube-master sample-secret]# 

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

[root@kube-master sample-secret]# kubectl get pod 
NAME                       READY   STATUS    RESTARTS   AGE
sample-env                 1/1     Running   0          12h
sample-secret-all-env      1/1     Running   0          17m
sample-secret-prefix-env   1/1     Running   0          5m49s
sample-secret-single-env   1/1     Running   0          38m
[root@kube-master sample-secret]# 

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

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

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

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