kubernetes v1.6.0 で追加された ConfigMap / Secret の内容を一度に Pod への環境変数として読み込むという機能 (envFrom) が便利だったのでご紹介します。
v1.6 以前の指定方法
v1.6 以前は ConfigMap / Secret のキーを環境変数として読み込む場合、以下のようにひとつづつキーを読み込まなければならず、キーが多い場合に冗長な記述となっていました。
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
# 一つづつ環境変数に読み込まなければいけなかった
- name: USERNAME
valueFrom:
configMapKeyRef:
name: myconfig # ConfigMap の name
key: USERNAME # ConfigMap のキー名
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: myconfig
key: PASSWORD
# 環境変数の数だけ繰り返し
v1.6 で追加された envFrom
v1.6.0 で下記のように envFrom という項目で ConfigMap または Secret の内容を一度に同名または prefix 付きの環境変数として読み込むことができようになりました。
以下では簡略のため Pod を例にしていますが Deployment や ReplicaSet でも同じ指定ができます。
apiVersion: v1
kind: Pod
metadata:
name: envfrom-test
spec:
containers:
- name: nginx
image: nginx:1.11
envFrom: # env ではなく envFrom
- configMapRef:
name: envfrom-test # ConfigMap の name を指定。すべてのキーが環境変数として展開される
prefix: MY_PREFIX_ # 名前衝突しないように prefix を指定することもできる
# Secret の場合は secretRef で Secret の name を指定
ConfigMap はキー名が環境変数として使われること以外、今までと変わりません。
kind: ConfigMap
apiVersion: v1
metadata:
name: envfrom-test
data:
# キー名が環境変数名として展開される
URL: myurl
USERNAME: myuser
PASSWORD: mypassword
上記の例でデプロイした Pod の環境変数を kubectl exec
を使って見てみます。指定した prefix + ConfigMap のキー名で環境変数に展開されていることがわかります。
$ kubectl exec envfrom-test env | grep MY_PREFIX
# ConfigMap に入っている 3つのキーが環境変数として自動的に設定されている
MY_PREFIX_PASSWORD=mypassword
MY_PREFIX_URL=myurl
MY_PREFIX_USERNAME=myuser