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

2022.01.08
2024.03.24
Kubernetes
ConfigMapSecret

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

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

ConfigMapとSecret

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

unknown link

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

Secret

Secret

Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクトのことです。 このような情報は、Secretを用いないとPodの定義やコンテナイメージに直接記載することになってしまうかもしれません。 Secretを使用すれば、アプリケーションコードに機密データを含める必要がなくなります。 なぜなら、Secretは、それを使用するPodとは独立して作成することができ、 Podの作成、閲覧、編集といったワークフローの中でSecret(およびそのデータ)が漏洩する危険性が低くなるためです。 また、Kubernetesやクラスター内で動作するアプリケーションは、不揮発性ストレージに機密データを書き込まないようにするなど、Secretで追加の予防措置を取ることができます。 Secretsは、ConfigMapsに似ていますが、機密データを保持するために用います。 注意: KubernetesのSecretは、デフォルトでは、APIサーバーの基礎となるデータストア(etcd)に暗号化されずに保存されます。APIにアクセスできる人は誰でもSecretを取得または変更でき、etcdにアクセスできる人も同様です。 さらに、名前空間でPodを作成する権限を持つ人は、そのアクセスを使用して、その名前空間のあらゆるSecretを読むことができます。これには、Deploymentを作成する能力などの間接的なアクセスも含まれます。 Secretsを安全に使用するには、以下の手順を推奨します。 Secretsを安全に暗号化する Secretsのデータの読み取りを制限するRBACルールの有効化または設定 適切な場合には、RBACなどのメカニズムを使用して、どの原則が新しいSecretの作成や既存のSecretの置き換えを許可されるかを制限します。 Secretの概要 Secretを使うには、PodはSecretを参照することが必要です。 PodがSecretを使う方法は3種類あります。 ボリューム内のファイルとして、Podの単一または複数のコンテナにマウントする コンテナの環境変数として利用する Podを生成するためにkubeletがイメージをpullするときに使用する KubernetesのコントロールプレーンでもSecretsは使われています。例えば、bootstrap token Secretsは、ノード登録を自動化するための仕組みです。 Secretオブジェクトの名称は正当なDNSサブドメイン名である必要があります。 シークレットの構成ファイルを作成するときに、dataおよび/またはstringDataフィールドを指定できます。dataフィールドとstringDataフィールドはオプションです。 dataフィールドのすべてのキーの値は、base64でエンコードされた文字列である必要があります。 base64文字列への変換が望ましくない場合は、代わりにstringDataフィールドを指定することを選択できます。これは任意の文字列を値として受け入れます。 dataとstringDataのキーは、英数字、-、_、または.で構成されている必要があります。 stringDataフィールドのすべてのキーと値のペアは、内部でdataフィールドにマージされます。 キーがdataフィールドとstringDataフィールドの両方に表示される場合、stringDataフィールドで指定された値が優先されます。 Secretの種類 Secretを作成するときは、Secretのtypeフィールド、または特定の同等のkubectlコマンドラインフラグ(使用可能な場合)を使用して、その型を指定できます。 Secret型は、Secret dataのプログラムによる処理を容易にするために使用されます。 Kubernetesは、いくつかの一般的な使用シナリオに対応するいくつかの組み込み型を提供します。 これらの型は、実行される検証とKubernetesが課す制約の点で異なります。 Builtin Type Usage Opaque arbitrary user-defined data kubernetes.io/service-account-token service account token kubernetes.io/dockercfg serialized ~/.dockercfg file kubernetes.io/dockerconfigjson serialized ~/.docker/config.json file kubernetes.io/basic-auth credentials for basic authentication kubernetes.io/ssh-auth credentials for SSH authentication kubernetes.io/tls data for a TLS client or server bootstrap.

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

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

Secret

Secret

Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクトのことです。 このような情報は、Secretを用いないとPodの定義やコンテナイメージに直接記載することになってしまうかもしれません。 Secretを使用すれば、アプリケーションコードに機密データを含める必要がなくなります。 なぜなら、Secretは、それを使用するPodとは独立して作成することができ、 Podの作成、閲覧、編集といったワークフローの中でSecret(およびそのデータ)が漏洩する危険性が低くなるためです。 また、Kubernetesやクラスター内で動作するアプリケーションは、不揮発性ストレージに機密データを書き込まないようにするなど、Secretで追加の予防措置を取ることができます。 Secretsは、ConfigMapsに似ていますが、機密データを保持するために用います。 注意: KubernetesのSecretは、デフォルトでは、APIサーバーの基礎となるデータストア(etcd)に暗号化されずに保存されます。APIにアクセスできる人は誰でもSecretを取得または変更でき、etcdにアクセスできる人も同様です。 さらに、名前空間でPodを作成する権限を持つ人は、そのアクセスを使用して、その名前空間のあらゆるSecretを読むことができます。これには、Deploymentを作成する能力などの間接的なアクセスも含まれます。 Secretsを安全に使用するには、以下の手順を推奨します。 Secretsを安全に暗号化する Secretsのデータの読み取りを制限するRBACルールの有効化または設定 適切な場合には、RBACなどのメカニズムを使用して、どの原則が新しいSecretの作成や既存のSecretの置き換えを許可されるかを制限します。 Secretの概要 Secretを使うには、PodはSecretを参照することが必要です。 PodがSecretを使う方法は3種類あります。 ボリューム内のファイルとして、Podの単一または複数のコンテナにマウントする コンテナの環境変数として利用する Podを生成するためにkubeletがイメージをpullするときに使用する KubernetesのコントロールプレーンでもSecretsは使われています。例えば、bootstrap token Secretsは、ノード登録を自動化するための仕組みです。 Secretオブジェクトの名称は正当なDNSサブドメイン名である必要があります。 シークレットの構成ファイルを作成するときに、dataおよび/またはstringDataフィールドを指定できます。dataフィールドとstringDataフィールドはオプションです。 dataフィールドのすべてのキーの値は、base64でエンコードされた文字列である必要があります。 base64文字列への変換が望ましくない場合は、代わりにstringDataフィールドを指定することを選択できます。これは任意の文字列を値として受け入れます。 dataとstringDataのキーは、英数字、-、_、または.で構成されている必要があります。 stringDataフィールドのすべてのキーと値のペアは、内部でdataフィールドにマージされます。 キーがdataフィールドとstringDataフィールドの両方に表示される場合、stringDataフィールドで指定された値が優先されます。 Secretの種類 Secretを作成するときは、Secretのtypeフィールド、または特定の同等のkubectlコマンドラインフラグ(使用可能な場合)を使用して、その型を指定できます。 Secret型は、Secret dataのプログラムによる処理を容易にするために使用されます。 Kubernetesは、いくつかの一般的な使用シナリオに対応するいくつかの組み込み型を提供します。 これらの型は、実行される検証とKubernetesが課す制約の点で異なります。 Builtin Type Usage Opaque arbitrary user-defined data kubernetes.io/service-account-token service account token kubernetes.io/dockercfg serialized ~/.dockercfg file kubernetes.io/dockerconfigjson serialized ~/.docker/config.json file kubernetes.io/basic-auth credentials for basic authentication kubernetes.io/ssh-auth credentials for SSH authentication kubernetes.io/tls data for a TLS client or server bootstrap.

ConfigMapで環境変数

まずはConfigMapを使って環境変数の設定をしていきます。

ConfigMap

最初にConfigMapを作成します。

環境変数の値を格納するConfigMapのマニフェストconfigmap.yamlは下記の通りです。

1apiVersion: v1
2kind: ConfigMap
3metadata:
4  name: env-config
5  namespace: default
6data:
7  HELLO: Hello
8  WORLD: World!!

ConfigMapを作成します。

1kubectl apply -f configmap.yaml

作成したConfigMapを確認してみると環境変数の値が確認できます。

1❯ kubectl describe configmap env-config
2Name:         env-config
3Namespace:    default
4Labels:       <none>
5Annotations:  <none>
6
7Data
8====
9HELLO:
10----
11Hello
12WORLD:
13----
14World!!
15
16BinaryData
17====
18
19Events:  <none>

個別に環境変数を設定

作成したConfigMapから個別に環境変数を設定するPodを作成します。

configMapKeyRefを使って環境変数の値を設定しています。configmap-keyref-pod.yamlは下記の通りです。

1apiVersion: v1
2kind: Pod
3metadata:
4  name: configmap-keyref-pod
5spec:
6  containers:
7  - name: env-container
8    image: k8s.gcr.io/busybox
9    command: [ "/bin/sh", "-c", "echo $HELLO $WORLD" ]
10    env:
11      - name: HELLO
12        valueFrom:
13          configMapKeyRef:
14            name: env-config
15            key: HELLO
16      - name: WORLD
17        valueFrom:
18          configMapKeyRef:
19            name: env-config
20            key: WORLD
21  restartPolicy: Never

Podを作成します。

1kubectl apply -f configmap-keyref-pod.yaml

ログを確認すると環境変数が設定されていることがわかります。

1❯ kubectl logs configmap-keyref-pod
2Hello World!!

一括で環境変数を設定

次にConfigMapの設定内容を一括で設定するPodを作成します。

configMapRefでConfigMapの設定内容全体を環境変数として設定します。configmap-ref-pod.yamlは下記の通りです。

1apiVersion: v1
2kind: Pod
3metadata:
4  name: configmap-ref-pod
5spec:
6  containers:
7  - name: env-container
8    image: k8s.gcr.io/busybox
9    command: [ "/bin/sh", "-c", "echo $HELLO $WORLD" ]
10    envFrom:
11      - configMapRef:
12          name: env-config
13  restartPolicy: Never

Podを作成します。

1kubectl apply -f configmap-ref-pod.yaml

ログを確認すると一括でも環境変数が設定されていることがわかります。

1❯ kubectl logs configmap-ref-pod
2Hello World!!

Secretで環境変数

次はSecretを使って環境変数を設定します。

Secret

まずはSecretを作成します。

環境変数の値を格納するSecretのマニフェストsecret.yamlは下記の通りです。

1apiVersion: v1
2kind: Secret
3metadata:
4  name: password-secret
5stringData:
6  USER: Masa
7  PASSWORD: HOGEHOGE

Secretを作成します。

1kubectl apply -f secret.yaml

作成したSecretを確認してみるとデータがそのまま表示されていないことがわかります。

1❯ kubectl describe secret password-secret
2Name:         password-secret
3Namespace:    default
4Labels:       <none>
5Annotations:  <none>
6
7Type:  Opaque
8
9Data
10====
11PASSWORD:  8 bytes
12USER:      4 bytes

下記のようにyaml形式で出力するとデータがエンコードされた文字列が確認できます。

1❯ k get secret/password-secret -o yaml
2apiVersion: v1
3data:
4  PASSWORD: SE9HRUhPR0U= # エンコードされた文字列
5  USER: TWFzYQ== # エンコードされた文字列
6kind: Secret
7metadata:
8    :
9    :
10type: Opaque

これをbase64でデコードすることで元の文字列に戻すことが可能です。

1echo "SE9HRUhPR0U=" | base64 --decode
2HOGEHOGE
3
4echo "TWFzYQ==" | base64 --decode
5Masa

個別に環境変数を設定

作成したSecretから個別に環境変数を設定するPodを作成します。

secretMapKeyRefを使って環境変数の値を設定しています。secret-keyref-pod.yamlは下記の通りです。

1apiVersion: v1
2kind: Pod
3metadata:
4  name: secret-keyref-pod
5spec:
6  containers:
7  - name: password-container
8    image: k8s.gcr.io/busybox
9    command: [ "/bin/sh", "-c", "echo $USER $PASSWORD" ]
10    env:
11      - name: USER
12        valueFrom:
13          secretKeyRef:
14            name: password-secret
15            key: USER
16      - name: PASSWORD
17        valueFrom:
18          secretKeyRef:
19            name: password-secret
20            key: PASSWORD
21  restartPolicy: Never

Podを作成します。

1kubectl apply -f secret-keyref-pod.yaml

ログを確認すると環境変数が設定されていることがわかります。

1❯ kubectl logs secret-keyref-pod
2Masa HOGEHOGE

一括で環境変数を設定

次にSecretの設定内容を一括で設定するPodを作成します。

secretRefでSecretの設定内容全体を環境変数として設定します。secret-ref-pod.yamlは下記の通りです。

1apiVersion: v1
2kind: Pod
3metadata:
4  name: secret-ref-pod
5spec:
6  containers:
7  - name: password-container
8    image: k8s.gcr.io/busybox
9    command: [ "/bin/sh", "-c", "echo $USER $PASSWORD" ]
10    envFrom:
11      - secretRef:
12          name: password-secret
13  restartPolicy: Never

Podを作成します。

1kubectl apply -f secret-ref-pod.yaml

ログを確認すると一括でも環境変数が設定されていることがわかります。

1❯ kubectl logs secret-ref-pod
2Masa HOGEHOGE

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee