kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

kustomize で patchesStrategicMerge を使わずに簡単に replicas と images を変更する

今まで kustomize を使って Deploymentreplicas を変更するときなどは kustomization.yamlpatchesStrategicMerge を設定していた.例えば,1年前に kustomize に入門したときに書いた以下の記事でもそういう手順になっている.

kakakakakku.hatenablog.com

最近 kustomize のドキュメントを読み直していたら replicasimages など,簡単に kustomization.yaml に設定できる機能があることに気付いた💡今まで知らなかった!検証も兼ねて試していく.

kubectl.docs.kubernetes.io

kubectl.docs.kubernetes.io

kustomize v4.2.0

なお,今回は kustomize v4.2.0 を使う.kubectl kustomize コマンドだとバンドルされているバージョンが古い可能性があり,正確には kubectl v1.20 までは kustomize v2.0.3 がバンドルされている.詳しくは GitHub に載っている.

$ brew install kustomize
$ kustomize version --short
{kustomize/v4.2.0  2021-07-01T00:44:28+01:00  }

github.com

replicasimages を試す

まず,以下のようなディレクトリ構成で base/overlays/ を準備する.Namespace + Service + Deployment (nginx) という基本構成で,今回は overlays/dev/ に設定している通り dev 環境を kustomize で作る.

.
├── README.md
├── base
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   ├── namespace.yaml
│   └── service.yaml
└── overlays
    └── dev
        └── kustomization.yaml

以下に base/ の代表的なファイルを載せておく.ポイントは base/deployment.yamlreplicas: 2image: nginx:1.20-alpine で,今回は kustomizereplicas: 5image: nginx:1.21-alpine に変更していく.

📁 base/kustomization.yaml

resources:
- namespace.yaml
- deployment.yaml
- service.yaml

📁 base/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20-alpine

次に overlays/dev 環境用の kustomization.yaml を載せる.ポイントは以下の2点となる.

  • replicas : Deployment のレプリカ数を count として設定できる
  • images : Deployment のイメージ名とタグ名を newNamenewTag として設定できる

📁 overlays/dev/kustomization.yaml

resources:
  - ../../base
namespace: kakakakakku-dev
namePrefix: kakakakakku-dev-
commonLabels:
  app: kakakakakku-dev
replicas:
- name: kakakakakku-dev-nginx
  count: 5
images:
  - name: nginx
    newName: nginx
    newTag: 1.21-alpine

さっそく kustomize build overlays/dev コマンドを実行すると,期待通りに replicas: 5image: nginx:1.21-alpine に変更できている💡簡単!これなら patchesStrategicMerge を使わずに kustomization.yaml だけでシンプルに設定できる.

apiVersion: v1
kind: Namespace
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev-nginx
  namespace: kakakakakku-dev
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: kakakakakku-dev
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev-nginx
  namespace: kakakakakku-dev
spec:
  replicas: 5
  selector:
    matchLabels:
      app: kakakakakku-dev
  template:
    metadata:
      labels:
        app: kakakakakku-dev
    spec:
      containers:
      - image: nginx:1.21-alpine
        name: nginx

patchesStrategicMerge と組み合わせる

とは言え replicasimages では複雑な設定はできないため,要件によってはやはり patchesStrategicMerge と組み合わせることになる.例えば nginx に加えて fluentbit をサイドカーとして追加する場合,images ではイメージの追加には対応していなかったりする.以下のように overlays/dev/kustomization.yamlpatchesStrategicMerge を追加した.

📁 overlays/dev/kustomization.yaml

resources:
  - ../../base
namespace: kakakakakku-dev
namePrefix: kakakakakku-dev-
commonLabels:
  app: kakakakakku-dev
replicas:
- name: kakakakakku-dev-nginx
  count: 5
images:
  - name: nginx
    newName: nginx
    newTag: 1.21-alpine
patchesStrategicMerge:
  - deployment.yaml

そして overlays/dev/deployment.yaml に追加する fluentbit を差分として設定する.

📁 overlays/dev/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    spec:
      containers:
      - name: fluentbit
        image: fluent/fluent-bit:1.8

もう1度 kustomize build overlays/dev コマンドを実行すると,今度は fluentbit も追加できている.

apiVersion: v1
kind: Namespace
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev-nginx
  namespace: kakakakakku-dev
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: kakakakakku-dev
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kakakakakku-dev
  name: kakakakakku-dev-nginx
  namespace: kakakakakku-dev
spec:
  replicas: 5
  selector:
    matchLabels:
      app: kakakakakku-dev
  template:
    metadata:
      labels:
        app: kakakakakku-dev
    spec:
      containers:
      - image: fluent/fluent-bit:1.8
        name: fluentbit
      - image: nginx:1.21-alpine
        name: nginx

まとめ

今まで kustomize で知らなかった replicasimages を使って,patchesStrategicMerge を使わずに簡単にマニフェストを変更できた.要件次第では patchesStrategicMerge と組み合わせることになるだろうけど,基本的な変更なら kustomization.yaml だけで完結できそう.引き続き kustomize も勉強していくぞ!今回検証に使ったプロジェクトは以下で確認できる.

github.com

関連記事

kakakakakku.hatenablog.com