Kustomize にて特定のリソースの一部分に変数を埋め込みたいときに、 かつては vars を使用していたが、kustomize v3.9 あたりからdeprecatedになり replacements を使用するよう警告が出るようになった。 vars とは結構書き方が変わるので使い方をメモする。

公式ドキュメント

https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/replacements/

試してみる

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myhello
spec:
  selector:
    matchLabels:
      name: myhello
  replicas: 1
  template:
    metadata:
      labels:
        name: myhello
    spec:
      containers:
        - name: myhello
          image: myhelloimage:0.0.1
          env:
            - name: MY_KEY
              value: SHOULD_BE_REPLACED
apiVersion: v1
kind: ConfigMap
metadata:
  name: application-cm
data:
  MY_VALUE: hoge
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
replacements:
  - source:
      kind: ConfigMap
      name: application-cm
      fieldPath: data.SECRET
    targets:
      - select:
          kind: Deployment
          name: myhello
        fieldPaths:
          - spec.template.spec.containers.[name=myhello].env.[name=MY_KEY].value
 
resources:
- deployment.yaml
- configmap.yaml

kustomize build すると期待通り、envの値が無事書き換わる。

apiVersion: v1
data:
  MY_VALUE: hoge
kind: ConfigMap
metadata:
  name: application-cm
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myhello
spec:
  replicas: 1
  selector:
    matchLabels:
      name: myhello
  template:
    metadata:
      labels:
        name: myhello
    spec:
      containers:
      - env:
        - name: MY_KEY
          value: hoge
        image: myhelloimage:0.0.1
        name: myhello

一部のリソースだけ適用しない

すべてのDeploymentリソースに適用する、ただし特定のリソースにだけ適用したくないといった指定もすることができる。 targets.reject に除外したい条件を書く。

replacements:
  - source:
      kind: ConfigMap
      name: application-cm
      fieldPath: data.SECRET
    targets:
      - select:
          kind: Deployment
        reject:
          - kind: Deployment
            name: newworld
        fieldPaths:
          - spec.template.spec.containers.[name=myhello].env.[name=MY_KEY].value