このセクションでは、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]#