LoginSignup
6
0

Kustomize(v5.2)からpatchesにマルチリソースファイルを指定できる

Last updated at Posted at 2023-12-05

こんにちは、Intimate Merger のFukudaです。
今回はKustomizeのpatchesに関する記事です。

概要

⭐️Kustomize v5.2 からpatchesでマルチリソースファイルを指定できるようになりました⭐️

Kustomize v5.0 からpatchesStrategicMergepatchesJson6902が非推奨になりました。
代わりとしてpatchesの使用が推奨されています。
しかし、v5リリースでpatchesへの移行に完全に対応できるものではありませんでした。
これがついに対応され、移行できる形になったので共有します!

補足情報

  • 現在のKustomizeのAPIバージョンはkustomize.config.k8s.io/v1beta1
    • patchesStrategicMergepatchesJson6902は非推奨機能として残っています
  • kustomize.config.k8s.io/v1で非推奨機能は削除される予定
    • kustomize/v5以降のメジャーバージョンアップで、APIバージョンがkustomize.config.k8s.io/v1に更新
  • 詳しくはKustomize/v5.0のDeprecationsをご覧ください

ファイルを準備

ファイル構成

manifests
├── deployment.yaml
├── deployment_patches.yaml
└── kustomization.yaml

各ファイルの説明

kustomization.yamlは管理するリソースをまとめたマニフェスト

  • kustomization.yaml(patchesStrategicMerge)
    • patchesStrategicMergeを使ってマージ
  • kustomization.yaml(patches)
    • patchesを使ってマージ
  • deployment.yaml
    • 下記のリソースを作成するためのマニフェスト
      • nginx-deployment-1
      • nginx-deployment-2
  • deployment_patches.yaml
    • deveployment.yamlのリソースにマージ
    • マージによるリソースの変更点
      • nginx-deployment-1にポート81を生やす
      • nginx-deployment-2のレプリカ数を2→10に増やす

kustomization.yaml(patchesStrategicMerge)

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
patchesStrategicMerge:
- deployment_patches.yaml

kustomization.yaml(patches)

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
patches:
- path: deployment_patches.yaml

deployment.yaml

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-1
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80

deployment_patches.yaml

deployment_patches.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-1
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 81
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80

実際に試してみましょう

検証に使用したKustomizeはv5.1.1とv5.2.1です。

Kustomize v5.2 未満でpathesを使ってマルチリソースファイルをマージしようとするとエラーが発生します。
回避策として非推奨機能のpatchesStrategicMergeを使用する必要がありました。

期待される出力

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-1
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 81
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80

Kustomize v5.1.1

kustomization.yaml(patches)を使用

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
patches:
- path: deployment_patches.yaml

ビルドするとエラーが発生します。
このエラーに関してのIssueが上がっていました。
patchesがマルチリソースファイルに対応できていないようです。

$ kustomize build manifests
Error: trouble configuring builtin PatchTransformer with config: `
path: deployment_patches.yaml
`: unable to parse SM or JSON patch from [apiVersion: apps/v1
                (マニフェストの内容なので省略)
]

kustomization.yaml(patchesStrategicMerge)を使用

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
patchesStrategicMerge:
- deployment_patches.yaml

非推奨機能のpatchesStrategicMergeを使って上記エラーを回避できます。
ビルドすると patchesStrategicMergeの非推奨警告 と 期待される出力 が表示されました。

$ kustomize build manifests
# Warning: 'patchesStrategicMerge' is deprecated. Please use 'patches' instead. Run 'kustomize edit fix' to update your Kustomization automatically.
(期待される出力が表示)

これがKustomize v5.2未満でマルチリソースファイルを使ってビルドする方法です。

Kustomize v5.2.1

Kustomize v5.2 で上記エラー修正PRが取り込まれています。

kustomization.yaml(patches)を使用

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
patches:
- path: deployment_patches.yaml

ビルドすると期待される出力が表示されます。

$ kustomize build manifests
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-1
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 81
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80

まとめ

patchesを使ってマルチリソースファイルが利用できるようになりました🎉

弊社では、非推奨機能を使っていることに歯痒さを感じていました。
今回のバグ修正のおかげでスッキリとした気分で開発が進められます😀

patchesStrategicMergeは非推奨なのでpatchesへ移行しましょう!!!

あとがき

読んでいただいてありがとうございます。
以上、Kustomize(v5.2)のpatchesに関する記事でした。

引き続きアドベントカレンダーの記事を読んでいただけると嬉しいです。
次回はpoetryに関する記事のようです。

参考

6
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
6
0