はじめに
これからkustomizeを使う人向けに、kustomizeとは何か、実際にどう使うのかを解説していきたいと思います。
kustomizeとは
kustomizeとは、Kubernetesのマニフェスト管理ツールです。
開発環境、ステージング環境、本番環境などと各環境でマニフェストを作成すると、それぞれでマニフェストが異なることがあります。(レプリカ数とかリソースとか)そのような場合に、ベースとなるマニフェストは共通で、各環境での差分はそれぞれの環境ごとのマニフェストで管理できるようにするツールがkustomizeです。
ベースとなるマニフェストと各環境用のパッチファイルは以下のような構成で利用できます。
.
├── base # ベースとなるマニフェスト用ディレクトリ
│ ├── deployment.yaml # ベースとなるDeployment
│ └── kustomization.yaml # kustomize用ファイル
└── overlays # 各環境用のパッチファイル用ディレクトリ
├── dev
│ ├── deployment.yaml # dev環境向けDeploymentのパッチファイル
│ └── kustomization.yaml # dev環境kustomize用ファイル
├── stg
│ ├── deployment.yaml # stg環境向けDeploymentのパッチファイル
│ └── kustomization.yaml # stg環境kustomize用ファイル
└── prod
├── deployment.yaml # prod環境向けDeploymentのパッチファイル
└── kustomization.yaml # prod環境kustomize用ファイル
仕組みとしては、baseディレクトリにあるマニフェストをベースにして、各環境での差分をoverlaysディレクトリ配下のパッチファイルを上書きするような形で最終的なマニフェストを作るイメージです。
使ってみる
ここから実際に使ってみて、kustomizeがどのように動くのかを見ていきたいと思います。
作成するファイルとディレクトリは以下のようになります。
.
├── base
│ ├── deployment.yaml
│ └── kustomization.yaml
└── overlays
├── dev
│ └── kustomization.yaml
├── stg
│ ├── deployment.yaml
│ └── kustomization.yaml
└── prod
├── deployment.yaml
└── kustomization.yaml
base
まずは、ベースとなるファイルを準備します。
ベースとなるマニフェストは下記のdeployment.yaml
です。レプリカ数1のnginxコンテナというシンプルなものになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: ntginx
image: nginx:latest
kustomize用のファイルkustomization.yaml
も作成します。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml # ベースとなるマニフェスト
overlays/dev
次に、開発環境用のファイルを用意します。
ここでは、baseのdeployment.yaml
を基本として、名前のプレフィックスとラベルを付けるのみにしています。
kustomize用のファイルkustomization.yaml
は以下のようになります。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: dev-
commonLabels:
env: dev
resources:
- ./../../base # baseへのパス
overlays/stg
ステージング環境用のファイルを用意します。
ステージング環境ではレプリカ数を2にするため、以下のようなdeployment.yaml
を用意します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
kustomize用のファイルkustomization.yaml
も作成します。
名前のプレフィックスとラベル、パッチファイルを用意したのでpatchesStrategicMerge
でdeployment.yaml
を指定します。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: stg-
commonLabels:
env: stg
resources:
- ./../../base
patchesStrategicMerge:
- deployment.yaml # 作成したパッチファイル
overlays/prod
最後に、本番環境用のファイルを用意します。
本番環境ではレプリカ数を3に、ローリングアップデートの設定を追加しています。deployment.yaml
は以下のようになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
kustomize用のファイルkustomization.yaml
も作成します。
名前のプレフィックスとラベル、パッチファイルの指定をしてます。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: prod-
commonLabels:
env: prod
resources:
- ./../../base
patchesStrategicMerge:
- deployment.yaml
動かしてみる
必要なファイルは用意できたので、実際にkustomizeを使ってDeploymentを作成していきます。
kustomizeを利用するときは、kubectl
コマンドで-k
オプションをつけることで利用できます。また、kubectl kustomize
で作成するマニフェストが確認できます。
dev
開発環境のDeploymentを作成するコマンドは以下の通りです。
kubectl apply -k overlays/dev
レプリカ数1、プレフィックス付きで作成されていることが確認できます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dev-myapp 1/1 1 1 88s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
dev-myapp-78dfc5d846-pgl98 1/1 Running 0 93s
反映したマニフェストを確認してみます。
❯ k kustomize overlays/dev
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
env: dev # ラベルが付いている
name: dev-myapp # プレフィックスが付いている
spec:
replicas: 1
selector:
matchLabels:
app: myapp
env: dev
template:
metadata:
labels:
app: myapp
env: dev
spec:
containers:
- image: nginx:latest
name: ntginx
stg
ステージング環境のDeploymentを作成するコマンドは以下の通りです。
kubectl apply -k overlays/stg
レプリカ数が2になり、プレフィックも付いていることが確認できます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
stg-myapp 2/2 2 2 6s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
stg-myapp-797cb4c6c-2572r 1/1 Running 0 13s
stg-myapp-797cb4c6c-496vj 1/1 Running 0 13s
反映したマニフェストを確認してみます。
❯ k kustomize overlays/stg
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
env: stg # ラベルが付いている
name: stg-myapp # プレフィックスが付いている
spec:
replicas: 2 # レプリカ数が2になっている
selector:
matchLabels:
app: myapp
env: stg
template:
metadata:
labels:
app: myapp
env: stg
spec:
containers:
- image: nginx:latest
name: ntginx
prod
本番環境のDeploymentを作成するコマンドは以下の通りです。
kubectl apply -k overlays/prod
レプリカ数が3になり、プレフィックも付いていることが確認できます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
prod-myapp 3/3 3 3 47s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
prod-myapp-6d9bd57568-7tdvg 1/1 Running 0 9s
prod-myapp-6d9bd57568-fqhkc 1/1 Running 0 9s
prod-myapp-6d9bd57568-ktx79 1/1 Running 0 9s
反映したマニフェストを確認してみます。
❯ k kustomize overlays/prod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
env: prod # ラベルが付いている
name: prod-myapp # プレフィックスが付いている
spec:
replicas: 3 # レプリカ数が3になっている
selector:
matchLabels:
app: myapp
env: prod
strategy: # ローリングアップデートの設定が追加されている
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
app: myapp
env: prod
spec:
containers:
- image: nginx:latest
name: ntginx
まとめ
- kustomizeはマニフェスト管理ツール
- ベースのマニフェストを元に各環境ごとの差分を管理