kustomizeを使った時に、単一のpatchを複数のResrouceに注入する方法 を調べました。patchMultipleObjectsを利用することで実現可能です。

概要

  • kustomzieはStrategic Merge PatchとJSONを使ってリソースをカスタマイズします。
  • その際に、1つのpatchを複数のリソースに適用することもできます。具体的にはpatchTarget Selectorを指定する必要があります

Hello World

Deploymentリソースに対して、sidecar containerをinjectしてみます

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1
spec:
  template:
    metadata:
      labels:
        old-label: old-value
    spec:
      containers:
        - name: nginx
          image: nginx
          args:
            - one
            - two
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy2
spec:
  template:
    metadata:
      labels:
        key: value
    spec:
      containers:
        - name: busybox
          image: busybo

patch

sidecar containerをinjectするために、Strategic Merge Patchファイルを宣言します

apiVersion: apps/v1
kind: Deployment
metadata:
  name: not-important
spec:
  template:
    spec:
      containers:
        - name: istio-proxy
          image: docker.io/istio/proxyv2
          args:
            - proxy
            - sideca

kustomization.yaml

  • patchsフィールドにpatchを追加することで、Deploymentに対してpatchが適用されます。
  • target:Target Selectorです。今回はkind: Deployment、つまりDeploymentのResrouce全てにpatchが適用されます。
resources:
  - deployments.yaml
patches:
  - path: patch.yaml
    target:
      kind: Deploymen

Target Selectorについて

  • Target selectorが複数ある場合は、nameやリソース名、ラベル、annotationでの指定が可能。
  • labelSelectorannotationSelectorはlabel seletorのconvension(規約)に従う必要がある。
  • 複数条件を指定した場合は、ANDで評価されます。(kustomizeは、patchを適用するために、targetのすべてのフィールドがマッチするターゲットを選択します。)
  • 以下はDeploymentリソースかつapp=helloのラベルが付与されたリソースに対してinjectする例です。
target:
  kind: Deployment
  labelSelector: app=hello

以上です。kustomizeを使うことで極力DRYにYAMLをマネジメントしていくぞ!