LoginSignup
2
0

More than 1 year has passed since last update.

Kustomizeのpatches(JSON Patch)において配列を扱う際の注意点

Last updated at Posted at 2022-02-22

KustomizeのKustomizationファイルではKubernetesマニフェストにパッチを当てることができます。このパッチはJSON Patch(RFC6902)の仕様に基づきます。
このパッチの仕組みは便利ですが、配列の扱いがやや難しくコツが必要です。JSON Patchで配列を扱う際に気を付ける点について紹介します。

JSON Patchで配列に複数の要素を追加する場合は複数のオペレーションを使う

下記のようなマニフェストとkustomization.yamlがある場合に、portsに複数の要素を追加したいとします。

pod.yaml
apiVersion: apps/v1
kind: Pod
metadata:
  name: simple-app
spec:
  containers:
    - name: simple-app
      image: nginx:latest
      ports:
        - name: port1
          containerPort: 1000
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - pod.yaml

patches:
  - target:
      kind: Pod
    path: pod_patch.yaml

このとき、下記のように一つのオペレーション(op: add)で複数の要素を追加できないかと考えるかと思います。しかし、残念ながらJSON Patchではこのような操作はできません。

pod_patch.yaml
# 注意:適切に動作しない例
- op: add
  path: /spec/containers/0/ports
  value:
    - name: port2
      containerPort: 2000
        - name: port3
      containerPort: 3000

複数の要素を追加するには、下記のように複数のオペレーションを書く必要があります。

pod_patch.yaml
# 適切に動作する例
- 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 がない状態を考えます。

pod.yaml
apiVersion: apps/v1
kind: Pod
metadata:
  name: simple-app
spec:
  containers:
    - name: simple-app
      image: nginx:latest

このとき、下記のように存在しないportsに要素を追加する命令を書くとエラーになります。portsは存在しないのでportsへの要素の追加はできません。

pod_patch.yaml
# ダメな例
- op: add
  path: /spec/containers/0/ports/-
  value:
    name: port1
    containerPort: 1000

下記のように、portsごと追加する命令にすることで動作しますが、portsが存在しないマニフェストでしか使うことができず再利用性が損なわれます。

pod_patch.yaml
# 動作するが再利用性が低い
- op: add
  path: /spec/containers/0/ports
  value:
    - name: port1
      containerPort: 1000

そこで、元となるマニフェストでportsを空配列にしておくことで、要素追加のパッチが使えるようになります。

pod.yaml
apiVersion: apps/v1
kind: Pod
metadata:
  name: simple-app
spec:
  containers:
    - name: simple-app
      image: nginx:latest
      ports: []
pod_patch.yaml
- op: add
  path: /spec/containers/0/ports/-
  value:
    name: port1
    containerport: 1000
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0