【Kubernetes】これから始めるkustomize

2021.12.07
2024.03.24
Kubernetes
kustomize

はじめに

これからkustomizeを使う人向けに、kustomizeとは何か実際にどう使うのかを解説していきたいと思います。

kustomizeとは

kustomizeとは、Kubernetesのマニフェスト管理ツールです。

開発環境、ステージング環境、本番環境などと各環境でマニフェストを作成すると、それぞれでマニフェストが異なることがあります。(レプリカ数とかリソースとか)そのような場合に、ベースとなるマニフェストは共通で、各環境での差分はそれぞれの環境ごとのマニフェストで管理できるようにするツールがkustomizeです。

ベースとなるマニフェストと各環境用のパッチファイルは以下のような構成で利用できます。

1.
2├── base # ベースとなるマニフェスト用ディレクトリ
3│   ├── deployment.yaml # ベースとなるDeployment
4│   └── kustomization.yaml # kustomize用ファイル
5└── overlays # 各環境用のパッチファイル用ディレクトリ
6    ├── dev
7    │   ├── deployment.yaml # dev環境向けDeploymentのパッチファイル
8    │   └── kustomization.yaml # dev環境kustomize用ファイル
9    ├── stg
10    │   ├── deployment.yaml # stg環境向けDeploymentのパッチファイル
11    │   └── kustomization.yaml # stg環境kustomize用ファイル
12    └── prod
13        ├── deployment.yaml # prod環境向けDeploymentのパッチファイル
14        └── kustomization.yaml # prod環境kustomize用ファイル

仕組みとしては、baseディレクトリにあるマニフェストをベースにして、各環境での差分をoverlaysディレクトリ配下のパッチファイルを上書きするような形で最終的なマニフェストを作るイメージです。

使ってみる

ここから実際に使ってみて、kustomizeがどのように動くのかを見ていきたいと思います。

作成するファイルとディレクトリは以下のようになります。

1.
2├── base
3│   ├── deployment.yaml
4│   └── kustomization.yaml
5└── overlays
6    ├── dev
7    │   └── kustomization.yaml
8    ├── stg
9    │   ├── deployment.yaml
10    │   └── kustomization.yaml
11    └── prod
12        ├── deployment.yaml
13        └── kustomization.yaml

base

まずは、ベースとなるファイルを準備します。

ベースとなるマニフェストは下記のdeployment.yamlです。レプリカ数1のnginxコンテナというシンプルなものになります。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5spec:
6  replicas: 1
7  selector:
8    matchLabels:
9      app: myapp
10  template:
11    metadata:
12      labels:
13        app: myapp
14    spec:
15      containers:
16      - name: ntginx
17        image: nginx:latest

kustomize用のファイルkustomization.yamlも作成します。

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3
4resources:
5- deployment.yaml # ベースとなるマニフェスト

overlays/dev

次に、開発環境用のファイルを用意します。

ここでは、baseのdeployment.yamlを基本として、名前のプレフィックスとラベルを付けるのみにしています。

kustomize用のファイルkustomization.yamlは以下のようになります。

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: dev-
4commonLabels:
5  env: dev
6resources:
7- ./../../base # baseへのパス

overlays/stg

ステージング環境用のファイルを用意します。

ステージング環境ではレプリカ数を2にするため、以下のようなdeployment.yamlを用意します。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5spec:
6  replicas: 2

kustomize用のファイルkustomization.yamlも作成します。

名前のプレフィックスとラベル、パッチファイルを用意したのでpatchesStrategicMergedeployment.yamlを指定します。

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: stg-
4commonLabels:
5  env: stg
6resources:
7- ./../../base
8patchesStrategicMerge:
9  - deployment.yaml # 作成したパッチファイル

overlays/prod

最後に、本番環境用のファイルを用意します。

本番環境ではレプリカ数を3に、ローリングアップデートの設定を追加しています。deployment.yamlは以下のようになります。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5spec:
6  replicas: 3
7  strategy:
8    rollingUpdate:
9      maxSurge: 1
10      maxUnavailable: 1
11    type: RollingUpdate

kustomize用のファイルkustomization.yamlも作成します。

名前のプレフィックスとラベル、パッチファイルの指定をしてます。

1apiVersion: kustomize.config.k8s.io/v1beta1
2kind: Kustomization
3namePrefix: prod-
4commonLabels:
5  env: prod
6resources:
7- ./../../base
8patchesStrategicMerge:
9  - deployment.yaml

動かしてみる

必要なファイルは用意できたので、実際にkustomizeを使ってDeploymentを作成していきます。

kustomizeを利用するときは、kubectlコマンドで-kオプションをつけることで利用できます。また、kubectl kustomizeで作成するマニフェストが確認できます。

dev

開発環境のDeploymentを作成するコマンドは以下の通りです。

1kubectl apply -k overlays/dev

レプリカ数1、プレフィックス付きで作成されていることが確認できます。

1❯ kubectl get deployment
2NAME        READY   UP-TO-DATE   AVAILABLE   AGE
3dev-myapp   1/1     1            1           88s
4
5❯ kubectl get pod
6NAME                         READY   STATUS    RESTARTS   AGE
7dev-myapp-78dfc5d846-pgl98   1/1     Running   0          93s

反映したマニフェストを確認してみます。

1❯ k kustomize overlays/dev
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5  labels:
6    env: dev # ラベルが付いている
7  name: dev-myapp # プレフィックスが付いている
8spec:
9  replicas: 1
10  selector:
11    matchLabels:
12      app: myapp
13      env: dev
14  template:
15    metadata:
16      labels:
17        app: myapp
18        env: dev
19    spec:
20      containers:
21      - image: nginx:latest
22        name: ntginx

stg

ステージング環境のDeploymentを作成するコマンドは以下の通りです。

1kubectl apply -k overlays/stg

レプリカ数が2になり、プレフィックも付いていることが確認できます。

1❯ kubectl get deployment
2NAME        READY   UP-TO-DATE   AVAILABLE   AGE
3stg-myapp   2/2     2            2           6s
4
5❯ kubectl get pod
6NAME                         READY   STATUS    RESTARTS   AGE
7stg-myapp-797cb4c6c-2572r    1/1     Running   0          13s
8stg-myapp-797cb4c6c-496vj    1/1     Running   0          13s

反映したマニフェストを確認してみます。

1❯ k kustomize overlays/stg
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5  labels:
6    env: stg # ラベルが付いている
7  name: stg-myapp # プレフィックスが付いている
8spec:
9  replicas: 2 # レプリカ数が2になっている
10  selector:
11    matchLabels:
12      app: myapp
13      env: stg
14  template:
15    metadata:
16      labels:
17        app: myapp
18        env: stg
19    spec:
20      containers:
21      - image: nginx:latest
22        name: ntginx

prod

本番環境のDeploymentを作成するコマンドは以下の通りです。

1kubectl apply -k overlays/prod

レプリカ数が3になり、プレフィックも付いていることが確認できます。

1❯ kubectl get deployment
2NAME         READY   UP-TO-DATE   AVAILABLE   AGE
3prod-myapp   3/3     3            3           47s
4
5❯ kubectl get pod
6NAME                          READY   STATUS    RESTARTS   AGE
7prod-myapp-6d9bd57568-7tdvg   1/1     Running   0          9s
8prod-myapp-6d9bd57568-fqhkc   1/1     Running   0          9s
9prod-myapp-6d9bd57568-ktx79   1/1     Running   0          9s

反映したマニフェストを確認してみます。

1❯ k kustomize overlays/prod
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5  labels:
6    env: prod # ラベルが付いている
7  name: prod-myapp # プレフィックスが付いている
8spec:
9  replicas: 3 # レプリカ数が3になっている
10  selector:
11    matchLabels:
12      app: myapp
13      env: prod
14  strategy: # ローリングアップデートの設定が追加されている
15    rollingUpdate:
16      maxSurge: 1
17      maxUnavailable: 1
18    type: RollingUpdate
19  template:
20    metadata:
21      labels:
22        app: myapp
23        env: prod
24    spec:
25      containers:
26      - image: nginx:latest
27        name: ntginx

まとめ

  • kustomizeはマニフェスト管理ツール
  • ベースのマニフェストを元に各環境ごとの差分を管理

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee