Kustomize でスラッシュを含むパスにパッチを当てる

1 min read読了の目安(約1300字

背景

Kustomize では JSON Patch を用いて base のマニフェストにパッチを当てることができます。
例えば,以下のマニフェスト

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: myapp
    app.kubernetes.io/version: v1.0.0
    name: myapp
    version: v1.0.0
...

version の値を v1.0.1 に変えたい場合は,以下のようなパッチを当てます。

kustomization.yaml
resources:
- deployment.yaml

patchesJson6902:
- target:
    group: apps
    version: v1
    kind: Deployment
    name: myapp
  path: patch.yaml
patch.yaml
- op: replace
  path: /metadata/labels/version
  value: v1.0.1

path は JSON Pointer 形式でドキュメントルートからの位置を指定します。

疑問

では,app.kubernetes.io/version の値を v1.0.1 に変えたい場合はどうすればよいでしょうか?
キーに / を含む場合,そのままパスに書くと別のパスと認識されてしまうので,何らかの方法でエスケープしないといけません。
特に Kubernetes 公式で推奨されているように,アノテーションやラベルだと kubernetes.io/ のようなプレフィックスを付けた名称が入ることがよくあります。

解決方法

JSON Pointer の仕様書に書いてありました。

  • /~1 にエスケープします。
  • 他にも ~ が含まれる場合は ~0 にエスケープします。

先ほどの例ではこのようにするのが正解です。

patch.yaml
- op: replace
  path: /metadata/labels/app.kubernetes.io~1version
  value: v1.0.1