AgonesとKustomizeを同時に使うときのTips

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も名前変換の対象にする」と指定すればよい。以下のドキュメントに設定例がある。

https://github.com/kubernetes-sigs/kustomize/blob/master/examples/transformerconfigs/README.md#name-reference-transformer

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    # <------ 変換されている!

  1. なぜ名前の異なるconfigMapを自動生成する必要があるのかについては https://qiita.com/syogun/items/9362b74545d1d5c88e38 の記事などを参照