Kubernetes Config Map と環境変数は違う

先日のブログで書いた話には続きがありました。まずは復習から。

Spring Boot ブログラムでは application.yaml を定義すると、@ConfigurationProperties を使って、初期値を Spring Boot に設定させることが可能です。

しかし、この設定値を実行時に変更したい場合もあり(例えば、credential や秘密鍵等)、環境変数や実行時のオプションで変更できるほか、Kurbernetes 利用の場合は Config Map を使用することができるようになっています。

Kurbernetes には Config Map を作成するための YAML 形式が定義されており、通常は以下のような形になります。

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-map
  namespace: default
data:
  APP_KEY: value

data 以降には環境変数ようなフォーマットの変数名と、その値の組が続きます。

kubectl create -f configmap.yaml

とすると、Config Map が作成され、kubectl から利用できる状態となります。

Spring Boot ドキュメントによると、YAML 形式と環境変数(もどき)形式には、以下の対応があります。

・YAML のドットは、環境変数のアンダースコアに置き換える。
・YAML のハイフンは、環境変数では削除する。
・YAML の小文字を、環境変数では大文字で表現する。

設定が配列になる場合はアンダースコアの後に数値を指定することで、Spring Boot がいい具合に解釈してくれます。

APP_KEY_0_0=value00
APP_KEY_0_1=value01
APP_KEY_1_0=value10
APP_KEY_1_1=value11
app.key=[[value00,value01],[value10,value11]]

しかし、配列と連想配列を組み合わせた場合は Config Map からは読んでくれません。

APP_KEY_0_ID="1"
APP_KEY_0_NAME="name1"
app.key=[{id=x,name=y}]

ところが(驚くべきことに??)、本物の環境変数で指定した場合は上書きできます。

kubectl run image:1.0.0 --image=image:1.0.0 --env="APP_KEY_0_ID=1" --env="APP_KEY_0_NAME=name1"
app.key=[{id=1,name=name1}]

なんだか仕様が揺れているように見えるのは、私だけでしょうか。

1 throughts on "Kubernetes Config Map と環境変数は違う"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です