【Kubernetes】ConfigMap/SecretでPodの環境変数設定

はじめに

ConfigMapとSecretそれぞれを利用して、環境変数を簡単な例で実際に設定してみたいと思います。

ConfigMapとSecret

ConfigMapとは、機密性のない設定データを保存するオブジェクトです。

ConfigMap
ConfigMapは、 機密性のないデータをキーと値のペアで保存するために使用されるAPIオブジェクトです。Podは、環境変数、コマンドライン引数、またはボリューム内の設定ファイルとしてConfigMapを使用できます。 ConfigMapを使用すると、環境固有の設定をコンテナイメージから分離できるため、アプリケーショ...

Secretとは、機密データを保存するためのオブジェクトです。

Secret
KubernetesのSecretはパスワード、OAuthトークン、SSHキーのような機密情報を保存し、管理できるようにします。 Secretに機密情報を保存することは、それらをPodの定義やコンテナイメージに直接記載するより、安全で柔軟です。 詳しくはSecretの設計文書を参照してください。 Secretはパスワー...

どちらもPodから設定データにアクセスすることができ、Podから設定データを分離することができます。

Secretの詳しいセキュリティ特性については下記のドキュメントを確認してください。

Secret
KubernetesのSecretはパスワード、OAuthトークン、SSHキーのような機密情報を保存し、管理できるようにします。 Secretに機密情報を保存することは、それらをPodの定義やコンテナイメージに直接記載するより、安全で柔軟です。 詳しくはSecretの設計文書を参照してください。 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

参考

タイトルとURLをコピーしました