🖥️
Kustomize でスラッシュを含むパスにパッチを当てる
背景
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
Discussion