1. 導入:なぜ設定をコンテナから分離するのか
現代のアプリケーション開発において、「設定をコードから分離する」ことは Twelve-Factor App の原則の一つであり、非常に重要です。もし設定情報(DBの接続先やAPIキーなど)をコンテナイメージの中にハードコーディングしてしまうと、環境ごとにイメージを作り直す必要があり、CI/CDの効率が著しく低下します。KubernetesのConfigMapとSecretを活用すれば、イメージはそのままで、環境に応じて柔軟に設定を注入できるようになります。
2. 基礎知識:ConfigMapとSecretの役割
Kubernetesには、設定値を管理するためのリソースとして主に以下の2つが存在します。
ConfigMap: 非機密データを管理します。アプリケーションの設定ファイルや、環境変数、ポート番号などを保存するのに適しています。
Secret: パスワード、APIトークン、SSH鍵などの機密情報を管理します。デフォルトではBase64エンコードされた状態で保存され、ConfigMapよりも厳密な管理が可能です。
これらはPodの「環境変数」として注入するか、「ボリューム(ファイル)」としてマウントすることで、アプリケーション側から読み取ることが可能になります。
3. 実装:Podへの注入手順
設定を管理する流れは以下の通りです。
1. ConfigMap/Secretリソースを作成する。
2. Podの定義ファイル(Deploymentなど)で、それらを参照するように設定する。
3. アプリケーションからは環境変数またはファイルパスを通じて値を取得する。
4. サンプルプログラム:ConfigMapとSecretの利用例
以下は、環境変数として設定を注入するPodの定義例です。
<ConfigMapの定義>
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: “db.production.local” # データベースのホスト名
<Secretの定義>
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DB_PASSWORD: “my-secret-password” # 機密情報(stringDataを使うとBase64エンコードの手間が省けます)
<Podへのマウント例>
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app-container
image: my-app:latest
env:
# ConfigMapから環境変数を取得
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
# Secretから環境変数を取得
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
5. 応用・注意点:現場で役立つTIPS
ボリュームマウントの活用:
設定ファイル(例: nginx.conf など)全体を注入したい場合は、環境変数ではなく「ボリュームマウント」を使用します。Podのspec.volumesにConfigMapを指定することで、コンテナ内の特定ディレクトリにファイルとして配置できます。
セキュリティの注意点:
Secretは「Base64でエンコードされているだけ」であり、暗号化はされていません。本番環境で利用する際は、Etcdの暗号化設定や、HashiCorp Vaultのような外部のシークレット管理ツールとの連携を検討してください。
更新時の挙動:
環境変数として注入した場合、ConfigMapやSecretを更新しても、Podの再起動なしには新しい値が反映されません。一方で、ボリュームマウントとして利用した場合は、数分程度のタイムラグを経てファイル内容が更新されます。アプリケーション側が動的な再読み込みに対応しているか確認してから運用しましょう。

コメント