はじめに
ConfigMapとSecretそれぞれを利用して、環境変数を簡単な例で実際に設定してみたいと思います。
ConfigMapとSecret
ConfigMapとは、機密性のない設定データを保存するオブジェクトです。
Secretとは、機密データを保存するためのオブジェクトです。
どちらもPodから設定データにアクセスすることができ、Podから設定データを分離することができます。
Secretの詳しいセキュリティ特性については下記のドキュメントを確認してください。
ConfigMapで環境変数
まずはConfigMapを使って環境変数の設定をしていきます。
ConfigMap
最初にConfigMapを作成します。
環境変数の値を格納するConfigMapのマニフェストconfigmap.yaml
は下記の通りです。
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
HELLO: Hello
WORLD: World!!
ConfigMapを作成します。
kubectl apply -f configmap.yaml
作成したConfigMapを確認してみると環境変数の値が確認できます。
❯ kubectl describe configmap env-config
Name: env-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
HELLO:
----
Hello
WORLD:
----
World!!
BinaryData
====
Events: <none>
個別に環境変数を設定
作成したConfigMapから個別に環境変数を設定するPodを作成します。
configMapKeyRef
を使って環境変数の値を設定しています。configmap-keyref-pod.yaml
は下記の通りです。
apiVersion: v1
kind: Pod
metadata:
name: configmap-keyref-pod
spec:
containers:
- name: env-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $HELLO $WORLD" ]
env:
- name: HELLO
valueFrom:
configMapKeyRef:
name: env-config
key: HELLO
- name: WORLD
valueFrom:
configMapKeyRef:
name: env-config
key: WORLD
restartPolicy: Never
Podを作成します。
kubectl apply -f configmap-keyref-pod.yaml
ログを確認すると環境変数が設定されていることがわかります。
❯ kubectl logs configmap-keyref-pod
Hello World!!
一括で環境変数を設定
次にConfigMapの設定内容を一括で設定するPodを作成します。
configMapRef
でConfigMapの設定内容全体を環境変数として設定します。configmap-ref-pod.yaml
は下記の通りです。
apiVersion: v1
kind: Pod
metadata:
name: configmap-ref-pod
spec:
containers:
- name: env-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $HELLO $WORLD" ]
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never
Podを作成します。
kubectl apply -f configmap-ref-pod.yaml
ログを確認すると一括でも環境変数が設定されていることがわかります。
❯ kubectl logs configmap-ref-pod
Hello World!!
Secretで環境変数
次はSecretを使って環境変数を設定します。
Secret
まずはSecretを作成します。
環境変数の値を格納するSecretのマニフェストsecret.yaml
は下記の通りです。
apiVersion: v1
kind: Secret
metadata:
name: password-secret
stringData:
USER: Masa
PASSWORD: HOGEHOGE
Secretを作成します。
kubectl apply -f secret.yaml
作成したSecretを確認してみるとデータがそのまま表示されていないことがわかります。
❯ kubectl describe secret password-secret
Name: password-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
PASSWORD: 8 bytes
USER: 4 bytes
下記のようにyaml形式で出力するとデータがエンコードされた文字列が確認できます。
❯ k get secret/password-secret -o yaml
apiVersion: v1
data:
PASSWORD: SE9HRUhPR0U= # エンコードされた文字列
USER: TWFzYQ== # エンコードされた文字列
kind: Secret
metadata:
:
:
type: Opaque
これをbase64でデコードすることで元の文字列に戻すことが可能です。
❯ echo "SE9HRUhPR0U=" | base64 --decode
HOGEHOGE
❯ echo "TWFzYQ==" | base64 --decode
Masa
個別に環境変数を設定
作成したSecretから個別に環境変数を設定するPodを作成します。
secretMapKeyRef
を使って環境変数の値を設定しています。secret-keyref-pod.yaml
は下記の通りです。
apiVersion: v1
kind: Pod
metadata:
name: secret-keyref-pod
spec:
containers:
- name: password-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $USER $PASSWORD" ]
env:
- name: USER
valueFrom:
secretKeyRef:
name: password-secret
key: USER
- name: PASSWORD
valueFrom:
secretKeyRef:
name: password-secret
key: PASSWORD
restartPolicy: Never
Podを作成します。
kubectl apply -f secret-keyref-pod.yaml
ログを確認すると環境変数が設定されていることがわかります。
❯ kubectl logs secret-keyref-pod
Masa HOGEHOGE
一括で環境変数を設定
次にSecretの設定内容を一括で設定するPodを作成します。
secretRef
でSecretの設定内容全体を環境変数として設定します。secret-ref-pod.yaml
は下記の通りです。
apiVersion: v1
kind: Pod
metadata:
name: secret-ref-pod
spec:
containers:
- name: password-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $USER $PASSWORD" ]
envFrom:
- secretRef:
name: password-secret
restartPolicy: Never
Podを作成します。
kubectl apply -f secret-ref-pod.yaml
ログを確認すると一括でも環境変数が設定されていることがわかります。
❯ kubectl logs secret-ref-pod
Masa HOGEHOGE