【Kubernetes】これから始めるkustomize

スポンサーリンク

はじめに

これから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も作成します。

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

参考

タイトルとURLをコピーしました