メインコンテンツまでスキップ

kustomizeでpatchを複数のresrouceにinjectする方法

· 約2分
ごとけん
Solutions Architect

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

  • kustomzieはStrategic Merge PatchとJSONを使ってリソースをカスタマイズします。
  • その際に、1つのpatchを複数のリソースに適用することもできます。具体的にはpatchとTarget 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での指定が可能。
  • labelSelectorとannotationSelectorはlabel seletorのconvension(規約)に従う必要がある。
  • 複数条件を指定した場合は、ANDで評価されます。(kustomizeは、patchを適用するために、targetのすべてのフィールドがマッチするターゲットを選択します。)
  • 以下はDeploymentリソースかつapp=helloのラベルが付与されたリソースに対してinjectする例です。
target:
kind: Deployment
labelSelector: app=hello

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