【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
も作成します。
名前のプレフィックスとラベル、パッチファイルを用意したのでpatchesStrategicMerge
でdeployment.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はマニフェスト管理ツール
- ベースのマニフェストを元に各環境ごとの差分を管理