現在表示しているのは、次のバージョン向けのドキュメントです。Kubernetesバージョン: v1.30

Kubernetes v1.30 のドキュメントは積極的にメンテナンスされていません。現在表示されているバージョンはスナップショットです。最新のドキュメントはこちらです: 最新バージョン

Podを構成してConfigMapを使用する

ConfigMapを使用すると、設定をイメージのコンテンツから切り離して、コンテナ化されたアプリケーションの移植性を維持できます。このページでは、ConfigMapを作成し、ConfigMapに保存されているデータを使用してPodを構成する一連の使用例を示します。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

バージョンを確認するには次のコマンドを実行してください: kubectl version.

ConfigMapを作成する

kubectl create configmapまたはkustomization.yamlのConfigMap generatorを使用すると、ConfigMapを作成できます。kubectlkustomization.yamlをサポートをしているのは1.14からである点に注意してください。

kubectl create configmapを使用してConfigMapを作成する

kubectl create configmapを使用してConfigMapをディレクトリファイル、またはリテラル値から作成します:

kubectl create configmap <map-name> <data-source> 

<map-name>の部分はConfigMapに割り当てる名前で、<data-source>はデータを取得するディレクトリ、ファイル、またはリテラル値です。ConfigMapの名前は有効なDNSサブドメイン名である必要があります。

ファイルをベースにConfigMapを作成する場合、<data-source> のキーはデフォルトでファイル名になり、値はデフォルトでファイルの中身になります。

kubectl describeまたは kubectl getを使用すると、ConfigMapに関する情報を取得できます。

ディレクトリからConfigMapを作成する

kubectl create configmapを使用すると、同一ディレクトリ内にある複数のファイルから1つのConfigMapを作成できます。ディレクトリをベースにConfigMapを作成する場合、kubectlはディレクトリ内でベース名が有効なキーであるファイルを識別し、それらのファイルを新たなConfigMapにパッケージ化します。ディレクトリ内にある通常のファイルでないものは無視されます(例: サブディレクトリ、シンボリックリンク、デバイス、パイプなど)。

例えば:

# ローカルディレクトリを作成します mkdir -p configure-pod-container/configmap/  # `configure-pod-container/configmap/`ディレクトリにサンプルファイルをダウンロードします wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties  # ConfigMapを作成します kubectl create configmap game-config --from-file=configure-pod-container/configmap/ 

上記のコマンドは各ファイルをパッケージ化します。この場合、configure-pod-container/configmap/ ディレクトリのgame.propertiesui.propertiesをgame-config ConfigMapにパッケージ化します。 以下のコマンドを使用すると、ConfigMapの詳細を表示できます:

kubectl describe configmaps game-config 

出力結果は以下のようになります:

Name: game-config Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: ---- color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice 

configure-pod-container/configmap/ ディレクトリのgame.propertiesui.properties ファイルはConfigMapのdataセクションに表示されます。

kubectl get configmaps game-config -o yaml 

出力結果は以下のようになります:

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2016-02-18T18:52:05Z  name: game-config  namespace: default  resourceVersion: "516"  uid: b4952dc3-d670-11e5-8cd0-68f728db1985 data:  game.properties: |  enemies=aliens  lives=3  enemies.cheat=true  enemies.cheat.level=noGoodRotten  secret.code.passphrase=UUDDLRLRBABAS  secret.code.allowed=true  secret.code.lives=30  ui.properties: |  color.good=purple  color.bad=yellow  allow.textmode=true  how.nice.to.look=fairlyNice 

ファイルからConfigMapを作成する

kubectl create configmapを使用して、個別のファイルまたは複数のファイルからConfigMapを作成できます。

例えば、

kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties 

は、以下のConfigMapを生成します:

kubectl describe configmaps game-config-2 

出力結果は以下のようになります:

Name: game-config-2 Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 

--from-file引数を複数回渡し、ConfigMapを複数のデータソースから作成できます。

kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties 

以下のコマンドを使用すると、ConfigMapgame-config-2の詳細を表示できます:

kubectl describe configmaps game-config-2 

出力結果は以下のようになります:

Name: game-config-2 Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: ---- color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice 

--from-env-fileオプションを利用してConfigMapをenv-fileから作成します。例えば:

# Env-filesは環境編集のリストを含んでいます。 # 以下のシンタックスルールが適用されます: # envファイルの各行はVAR=VALの形式である必要がある。 # #で始まる行 (例えばコメント)は無視される。 # 空の行は無視される。 # クオーテーションマークは特別な扱いは処理をしない(例えばConfigMapの値の一部になる).  # `configure-pod-container/configmap/`ディレクトリにサンプルファイルをダウンロードします wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties  # env-file `game-env-file.properties`は以下のようになります cat configure-pod-container/configmap/game-env-file.properties enemies=aliens lives=3 allowed="true"  # このコメントと上記の空の行は無視されます 
kubectl create configmap game-config-env-file \  --from-env-file=configure-pod-container/configmap/game-env-file.properties 

は、以下のConfigMapを生成します:

kubectl get configmap game-config-env-file -o yaml 

出力結果は以下のようになります:

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2017-12-27T18:36:28Z  name: game-config-env-file  namespace: default  resourceVersion: "809965"  uid: d9d1ca5b-eb34-11e7-887b-42010a8002b8 data:  allowed: '"true"'  enemies: aliens  lives: "3" 

--from-env-fileを複数回渡す場合の挙動は以下のように示されます:

# `configure-pod-container/configmap/`ディレクトリにサンブルファイルをダウンロードします wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties  # ConfigMapを作成します kubectl create configmap config-multi-env-files \  --from-env-file=configure-pod-container/configmap/game-env-file.properties \  --from-env-file=configure-pod-container/configmap/ui-env-file.properties 

は、以下のConfigMapを生成します:

kubectl get configmap config-multi-env-files -o yaml 

出力結果は以下のようになります:

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2017-12-27T18:38:34Z  name: config-multi-env-files  namespace: default  resourceVersion: "810136"  uid: 252c4572-eb35-11e7-887b-42010a8002b8 data:  color: purple  how: fairlyNice  textmode: "true" 

ファイルからConfigMap作成する場合は使用するキーを定義する

--from-file引数を使用する場合、ConfigMapのdata セクションでキーにファイル名以外を定義できます:

kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file> 

<my-key-name>の部分はConfigMapで使うキー、<path-to-file> はキーで表示したいデータソースファイルの場所です。

例えば:

kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties 

は、以下のConfigMapを生成します:

kubectl get configmaps game-config-3 -o yaml 

出力結果は以下のようになります:

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2016-02-18T18:54:22Z  name: game-config-3  namespace: default  resourceVersion: "530"  uid: 05f8da22-d671-11e5-8cd0-68f728db1985 data:  game-special-key: |  enemies=aliens  lives=3  enemies.cheat=true  enemies.cheat.level=noGoodRotten  secret.code.passphrase=UUDDLRLRBABAS  secret.code.allowed=true  secret.code.lives=30 

リテラル値からConfigMapを作成する

--from-literal引数を指定してkubectl create configmapを使用すると、コマンドラインからリテラル値を定義できます:

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm 

複数のキーバリューペアを渡せます。CLIに提供された各ペアは、ConfigMapのdataセクションで別のエントリーとして表示されます。

kubectl get configmaps special-config -o yaml 

出力結果は以下のようになります:

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2016-02-18T19:14:38Z  name: special-config  namespace: default  resourceVersion: "651"  uid: dadce046-d673-11e5-8cd0-68f728db1985 data:  special.how: very  special.type: charm 

ジェネレーターからConfigMapを作成する

kubectlkustomization.yamlを1.14からサポートしています。 ジェネレーターからConfigMapを作成して適用すると、APIサーバー上でオブジェクトを作成できます。ジェネレーターはディレクトリ内のkustomization.yamlで指定する必要があリます。

ファイルからConfigMapを生成する

例えば、ファイルconfigure-pod-container/configmap/game.propertiesからConfigMapを生成するには、

# ConfigMapGeneratorを含むkustomization.yamlファイルを作成する cat <<EOF >./kustomization.yaml configMapGenerator: - name: game-config-4  files:  - configure-pod-container/configmap/game.properties EOF 

ConfigMapを作成するためにkustomizationディレクトリを適用します。

kubectl apply -k . configmap/game-config-4-m9dm2f92bt created 

ConfigMapが作成されたことを以下のようにチェックできます:

kubectl get configmap NAME DATA AGE game-config-4-m9dm2f92bt 1 37s   kubectl describe configmaps/game-config-4-m9dm2f92bt Name: game-config-4-m9dm2f92bt Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p...  Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 Events: <none> 

生成されたConfigMapの名前は、コンテンツをハッシュ化したサフィックスを持つことに注意してください。これにより、コンテンツが変更されるたびに新しいConfigMapが生成されます。

ファイルからConfigMapを生成する場合に使用するキーを定義する

ConfigMapジェネレーターで使用するキーはファイルの名前以外を定義できます。 例えば、ファイルconfigure-pod-container/configmap/game.propertiesからキーgame-special-keyを持つConfigMapを作成する場合

# ConfigMapGeneratorを含むkustomization.yamlファイルを作成する cat <<EOF >./kustomization.yaml configMapGenerator: - name: game-config-5  files:  - game-special-key=configure-pod-container/configmap/game.properties EOF 

kustomizationディレクトリを適用してConfigMapを作成します。

kubectl apply -k . configmap/game-config-5-m67dt67794 created 

リテラルからConfigMapを作成する

リテラルspecial.type=charmspecial.how=veryからConfigMapを作成する場合は、 以下のようにkustomization.yamlのConfigMapジェネレーターで指定できます。

# ConfigMapGeneratorを含むkustomization.yamlファイルを作成します cat <<EOF >./kustomization.yaml configMapGenerator: - name: special-config-2  literals:  - special.how=very  - special.type=charm EOF 

kustomizationディレクトリを適用してConfigMapを作成します。

kubectl apply -k . configmap/special-config-2-c92b5mmcf2 created 

ConfigMapデータを使用してコンテナ環境変数を定義する

単一のConfigMapのデータを使用してコンテナ環境変数を定義する

  1. ConfigMapに環境変数をキーバリューペアとして定義します:

    kubectl create configmap special-config --from-literal=special.how=very 
  2. ConfigMapに定義された値special.howをPod specificationの環境変数SPECIAL_LEVEL_KEYに割り当てます。

apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/sh", "-c", "env" ]  env:  # 環境変数を定義します  - name: SPECIAL_LEVEL_KEY  valueFrom:  configMapKeyRef:  # SPECIAL_LEVEL_KEYに割り当てる値をConfigMapが保持します  name: special-config  # 値に紐付けるキーを指定します  key: special.how  restartPolicy: Never 

Podを作成します:

kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml 

すると、Podの出力結果に環境変数SPECIAL_LEVEL_KEY=veryが含まれています。

複数のConfigMapのデータを使用してコンテナ環境変数を定義する

  • 先ほどの例の通り、まずはConfigMapを作成します。

    apiVersion: v1 kind: ConfigMap metadata:  name: special-config  namespace: default data:  special.how: very --- apiVersion: v1 kind: ConfigMap metadata:  name: env-config  namespace: default data:  log_level: INFO 

    ConfigMapを作成します:

kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml 
  • Pod specificationの環境変数を定義します

    apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/sh", "-c", "env" ]  env:  - name: SPECIAL_LEVEL_KEY  valueFrom:  configMapKeyRef:  name: special-config  key: special.how  - name: LOG_LEVEL  valueFrom:  configMapKeyRef:  name: env-config  key: log_level  restartPolicy: Never 

    Podを作成します:

kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml 

すると、Podの出力結果に環境変数SPECIAL_LEVEL_KEY=very and LOG_LEVEL=INFOが含まれています。

ConfigMapの全てのキーバリューペアをコンテナ環境変数として構成する

  • 複数のキーバリューペアを含むConfigMapを作成します。

    apiVersion: v1 kind: ConfigMap metadata:  name: special-config  namespace: default data:  SPECIAL_LEVEL: very  SPECIAL_TYPE: charm 

    ConfigMapを作成します:

kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml 
  • envFromを利用して全てのConfigMapのデータをコンテナ環境変数として定義します。ConfigMapからのキーがPodの環境変数名になります。
apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/sh", "-c", "env" ]  envFrom:  - configMapRef:  name: special-config  restartPolicy: Never 

Podを作成します:

kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml 

すると、Podの出力結果は環境変数SPECIAL_LEVEL=verySPECIAL_TYPE=charmが含まれています。

PodのコマンドでConfigMapに定義した環境変数を使用する

ConfigMapに環境変数を定義し、Pod specificationのcommand セクションで$(VAR_NAME)Kubernetes置換構文を介して使用できます。

例えば以下のPod specificationは

apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]  env:  - name: SPECIAL_LEVEL_KEY  valueFrom:  configMapKeyRef:  name: special-config  key: SPECIAL_LEVEL  - name: SPECIAL_TYPE_KEY  valueFrom:  configMapKeyRef:  name: special-config  key: SPECIAL_TYPE  restartPolicy: Never 

以下コマンドの実行で作成され、

kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml 

test-containerコンテナで以下の出力結果を表示します:

kubectl logs dapi-test-pod 
very charm 

ボリュームにConfigMapデータを追加する

ファイルからConfigMapを作成するで説明したように、--from-fileを使用してConfigMapを作成する場合は、ファイル名がConfigMapのdataセクションに保存されるキーになり、ファイルのコンテンツがキーの値になります。

このセクションの例は以下に示されているspecial-configと名付けれたConfigMapについて言及したものです。

apiVersion: v1 kind: ConfigMap metadata:  name: special-config  namespace: default data:  SPECIAL_LEVEL: very  SPECIAL_TYPE: charm 

ConfigMapを作成します:

kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml 

ConfigMapに保存されているデータをボリュームに入力する

ConfigMap名をPod specificationのvolumesセクション配下に追加します。 これによりConfigMapデータがvolumeMounts.mountPathで指定されたディレクトリに追加されます (このケースでは、/etc/configに)。commandセクションはConfigMapのキーに合致したディレクトリファイルを名前別でリスト表示します。

apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/sh", "-c", "ls /etc/config/" ]  volumeMounts:  - name: config-volume  mountPath: /etc/config  volumes:  - name: config-volume  configMap:  # コンテナに追加するファイルを含むConfigMapの名前を提供する  name: special-config  restartPolicy: Never 

Podを作成します:

kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml 

Podが稼働していると、ls /etc/config/は以下の出力結果を表示します:

SPECIAL_LEVEL SPECIAL_TYPE 

ConfigMapデータをボリュームの特定のパスに追加する

pathフィールドを利用して特定のConfigMapのアイテム向けに希望のファイルパスを指定します。 このケースではSPECIAL_LEVELアイテムが/etc/config/keysconfig-volumeボリュームにマウントされます。

apiVersion: v1 kind: Pod metadata:  name: dapi-test-pod spec:  containers:  - name: test-container  image: registry.k8s.io/busybox  command: [ "/bin/sh","-c","cat /etc/config/keys" ]  volumeMounts:  - name: config-volume  mountPath: /etc/config  volumes:  - name: config-volume  configMap:  name: special-config  items:  - key: SPECIAL_LEVEL  path: keys  restartPolicy: Never 

Podを作成します:

kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml 

Podが稼働していると、 cat /etc/config/keysは以下の出力結果を表示します:

very 

キーを特定のパスとファイルアクセス許可に投影する

キーをファイル単位で特定のパスとアクセス許可に投影できます。Secretのユーザーガイドで構文が解説されています。

マウントされたConfigMapは自動的に更新される

ボリュームで使用されているConfigMapが更新されている場合、投影されているキーも同じく結果的に更新されます。kubeletは定期的な同期ごとにマウントされているConfigMapが更新されているかチェックします。しかし、これはローカルのttlを基にしたキャッシュでConfigMapの現在の値を取得しています。その結果、新しいキーがPodに投影されてからConfigMapに更新されるまでのトータルの遅延はkubeletで、kubeletの同期期間(デフォルトで1分) + ConfigMapキャッシュのttl(デフォルトで1分)の長さになる可能性があります。Podのアノテーションを1つ更新すると即時のリフレッシュをトリガーできます。

ConfigMapとPodsを理解する

ConfigMap APIリソースは構成情報をキーバリューペアとして保存します。データはPodで利用したり、コントローラーなどのシステムコンポーネントに提供できます。ConfigMapはSecretに似ていますが、機密情報を含まない文字列を含まない操作する手段を提供します。ユーザーとシステムコンポーネントはどちらも構成情報をConfigMapに保存できます。

ConfigMapのdataフィールドは構成情報を含みます。下記の例のように、シンプルに個別のプロパティーを--from-literalで定義、または複雑に構成ファイルまたはJSON blobsを--from-fileで定義できます。

apiVersion: v1 kind: ConfigMap metadata:  creationTimestamp: 2016-02-18T19:14:38Z  name: example-config  namespace: default data:  # --from-literalを使用してシンプルにプロパティーを定義する例  example.property.1: hello  example.property.2: world  # --from-fileを使用して複雑にプロパティーを定義する例  example.property.file: |-  property.1=value-1  property.2=value-2  property.3=value-3 

制限事項

  • ConfigMapはPod specificationを参照させる前に作成する必要があります(ConfigMapを"optional"として設定しない限り)。存在しないConfigMapを参照させた場合、Podは起動しません。同様にConfigMapに存在しないキーを参照させた場合も、Podは起動しません。

  • ConfigMapでenvFromを使用して環境変数を定義した場合、無効と判断されたキーはスキップされます。Podは起動されますが、無効な名前はイベントログに(InvalidVariableNames)と記録されます。ログメッセージはスキップされたキーごとにリスト表示されます。例えば:

    kubectl get events 

    出力結果は以下のようになります:

    LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE 0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames {kubelet, 127.0.0.1} Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names. 
  • ConfigMapは特定のNamespaceに属します。ConfigMapは同じ名前空間に属するPodからのみ参照できます。

  • static podsはKubeletがサポートしていないため、ConfigMapに使用できません。

次の項目