KustomizeのKustomizationファイルではKubernetesマニフェストにパッチを当てることができます。このパッチはJSON Patch(RFC6902)の仕様に基づきます。
このパッチの仕組みは便利ですが、配列の扱いがやや難しくコツが必要です。JSON Patchで配列を扱う際に気を付ける点について紹介します。
JSON Patchで配列に複数の要素を追加する場合は複数のオペレーションを使う
下記のようなマニフェストとkustomization.yamlがある場合に、portsに複数の要素を追加したいとします。
apiVersion: apps/v1
kind: Pod
metadata:
name: simple-app
spec:
containers:
- name: simple-app
image: nginx:latest
ports:
- name: port1
containerPort: 1000
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pod.yaml
patches:
- target:
kind: Pod
path: pod_patch.yaml
このとき、下記のように一つのオペレーション(op: add)で複数の要素を追加できないかと考えるかと思います。しかし、残念ながらJSON Patchではこのような操作はできません。
# 注意:適切に動作しない例
- op: add
path: /spec/containers/0/ports
value:
- name: port2
containerPort: 2000
- name: port3
containerPort: 3000
複数の要素を追加するには、下記のように複数のオペレーションを書く必要があります。
# 適切に動作する例
- op: add
path: /spec/containers/0/ports/-
value:
name: port2
containerPort: 2000
- op: add
path: /spec/containers/0/ports/-
value:
name: port3
containerPort: 3000
空配列を使ってパッチを再利用可能にする
下記のマニフェストのように ports がない状態を考えます。
apiVersion: apps/v1
kind: Pod
metadata:
name: simple-app
spec:
containers:
- name: simple-app
image: nginx:latest
このとき、下記のように存在しないportsに要素を追加する命令を書くとエラーになります。portsは存在しないのでportsへの要素の追加はできません。
# ダメな例
- op: add
path: /spec/containers/0/ports/-
value:
name: port1
containerPort: 1000
下記のように、portsごと追加する命令にすることで動作しますが、portsが存在しないマニフェストでしか使うことができず再利用性が損なわれます。
# 動作するが再利用性が低い
- op: add
path: /spec/containers/0/ports
value:
- name: port1
containerPort: 1000
そこで、元となるマニフェストでportsを空配列にしておくことで、要素追加のパッチが使えるようになります。
apiVersion: apps/v1
kind: Pod
metadata:
name: simple-app
spec:
containers:
- name: simple-app
image: nginx:latest
ports: []
- op: add
path: /spec/containers/0/ports/-
value:
name: port1
containerport: 1000