本文へスキップ
BecomeCoder

Kubernetesコース · 第5章 設定とストレージ ― 状態をどう持つか · レッスン24

ConfigMap ― 設定をイメージから切り離す

ブラウザで完結

導入

開発環境では http://localhost の DB、本番では http://prod-db の DB につなぎたい」。こういう環境ごとに変わる値を、コンテナイメージの中に直接書き込んでしまうと、環境が変わるたびにイメージを作り直す羽目になります。これを避けるのが ConfigMap(コンフィグマップ) です。

説明

コンテナイメージ(image) とは、アプリと必要な部品を1つに固めた「実行可能なテンプレート」です。同じイメージを、開発でも本番でも使い回せるのが理想。そこで「環境で変わる値」だけをイメージから追い出し、ConfigMap という別の入れ物にキーと値のペアとして置きます。ただし ConfigMap は機密でない設定専用です(パスワード等は次のレッスンの Secret を使います)。

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  API_URL: "https://api.example.com"   # 接続先
  FEATURE_NEW_UI: "true"               # 機能フラグ
  PAGE_SIZE: "20"

この ConfigMap の値を、Pod に 環境変数として注入できます。

apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
    - name: web
      image: myapp:1.0
      envFrom:
        - configMapRef:
            name: app-config   # ConfigMapの全キーを環境変数として渡す

こうしておけば、接続先を変えたいときは ConfigMap の値を書き換えるだけ。アプリのイメージには一切手を触れず、再ビルドも不要です。「同じイメージ + 環境ごとの ConfigMap」で、開発・検証・本番を安全に使い分けられます。

設定をコード(イメージ)から分離するこの考え方は、クラウド時代のアプリ設計指針「The Twelve-Factor App(12要素アプリ)」でも重視される原則です。ConfigMap はそれを k8s で実現する道具といえます。

実際に動かしてみよう

上がマニフェスト(YAML)エディタ、下が kubectl の端末です。エディタの内容は `manifest.yaml` として保存され、下で `kubectl apply -f manifest.yaml` を実行するとクラスタに反映されます(pod.yaml / deploy.yaml / service.yaml も最初から置いてあります)。`kubectl get pods` / `describe` / `scale` / `rollout` などで結果を確かめましょう(本物のKubernetesではなく、動きを再現した軽量なシミュレータです)。各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」で戻せます。

kubectl(シミュレート)

マニフェスト(YAML)を書いて kubectl コマンドを試せる学習用クラスタを読み込みます(本物のKubernetesではなく、apply/get/describe/scale/rollout などの動きを再現した軽量な自作シミュレータです)。
スクロールして表示された時点でも自動で読み込まれます。