導入
「開発環境では 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 で実現する道具といえます。