先日のブログで書いた話には続きがありました。まずは復習から。
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 と環境変数は違う"