Kustomizeには ConfigMapGenerator, SecretGenerator という機能がある。 これを使うと、yamlの定義からconfigMap(またはsecrets)を自動生成してくれる1。
たとえば、kustomization.yaml
にconfigMapGeneratorの定義で the-map
という名前のconfigMapを作り、コンテナの環境変数などに指定する。
configMapGenerator: - name: the-map literals: - testEnv=hello
# Pod側の設定 apiVersion: v1 kind: Pod spec: containers: #(中略) env: - name: TEST_ENV valueFrom: configMapKeyRef: name: the-map key: testEnv
これを kustomize build
するとconfigMapの名前にランダム文字列がつけられて自動生成されたものになる。
# kustomize buildの結果 apiVersion: v1 kind: Pod spec: containers: # (中略) env: - name: TEST_ENV valueFrom: configMapKeyRef: key: testEnv name: the-map-c2mtbggg5d # <----- 末尾にランダム文字列がついた名前に変換されている
Agonesでは自動生成された名前が反映されない?
しかし、これと同様のことをAgonesのGameServer(またはFleet)の定義でやろうとするとランダム文字列が付かず、名前が変換されない。
apiVersion: "agones.dev/v1" kind: GameServer metadata: name: "simple-game-server" spec: ports: - name: default portPolicy: Dynamic containerPort: 7654 template: spec: containers: - name: simple-game-server image: gcr.io/agones-images/simple-game-server:0.3 resources: requests: memory: "64Mi" cpu: "20m" limits: memory: "64Mi" cpu: "20m" env: - name: TEST_ENV valueFrom: configMapKeyRef: name: the-map # <---- ここの名前が置き換わってほしい! key: testEnv
なぜAgonesリソースから参照しているconfigMapの名前は置き換わらないのか? それは「どこの名前を置き換えるか」がKustomize内でデフォルトで決まっていて、AgonesのようなCRD(Kubernetesのカスタムリソース)用の定義がないからだ。
解決策
定義がないなら、増やせばOK。 Kustomizeの名前を変換するしくみは Name reference transformer というプラグインなので、そこの設定に「AgonesのGameServerやFleetも名前変換の対象にする」と指定すればよい。以下のドキュメントに設定例がある。
Agones用の定義を指定すると、このようになる。
# nameref.yaml nameReference: - kind: ConfigMap version: v1 fieldSpecs: - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name version: v1 kind: GameServer - kind: ConfigMap version: v1 fieldSpecs: - path: spec/template/spec/template/spec/containers/env/valueFrom/configMapKeyRef/name version: v1 kind: Fleet
# kustomization.yaml configurations: - nameref.yaml
これでもう一度 kustomize build
すると、AgonesのGameServer内からのconfigMap参照も自動生成された名前に変換された 🎉
apiVersion: agones.dev/v1 kind: GameServer # (中略) template: spec: containers: - env: - name: TEST_ENV valueFrom: configMapKeyRef: key: testEnv name: the-map-c2mtbggg5d # <------ 変換されている!
-
なぜ名前の異なるconfigMapを自動生成する必要があるのかについては https://qiita.com/syogun/items/9362b74545d1d5c88e38 の記事などを参照↩