🌊

Kustomize使ってみた

2022/06/01に公開

はじめに

sweeep株式会社エンジニアの関田です。

今回はKubernetesでよく使われるマニフェスト管理ツールのkustomizeを使ってみたので
簡単に紹介したいと思います。

Kustomizeのドキュメントはこちらになります。
Kustomize Reference

また、今回例で使用するマニフェストファイルは以下になります。
Github

Kustomizeとは

Kustomizeとはマニフェストファイル管理ツールで、
dev、stg、prd環境などにそれぞれマニフェストファイルを書くと同じ内容のものが何箇所も出てきます。
Kustomizeはそのような場合の管理を簡単に行えるようにできるツールになります。

インストール

Installation

上記にいろいろなインストール方法が書いてあります。
今回はMacのHomebrewでインストールしていきます。

$ brew install kustomize

使ってみた

まずはKustomizeを使う前のディレクトリ構成と、マニフェストファイルを下に示します。

.
├── dev
│   └── deployment.yaml
└── stg
    └── deployment.yaml
# dev/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
  namespace: dev # <------ 1
spec:
  replicas: 3 # <------ 2
  selector:
    matchLabels:
      app: fastapi-deployment
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:test
        imagePullPolicy: Always
        name: sample-fastapi-container
# stg/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
  namespace: stg # <------ 1
spec:
  replicas: 5 # <------ 2
  selector:
    matchLabels:
      app: fastapi-deployment
  strategy:  # <------ 3
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:test
        imagePullPolicy: Always
        name: sample-fastapi-container

devとstgの違いは主に以下の点になります

  1. namespace
  2. replicas
  3. stgにはrollingUpdateが定義されている

上記の点以外は全て同じ記述になっています。

Baseの作成

ここからはKustomizeを使って作成していきます。

まず、上記の1 ~ 3以外の共通部分をBaseとして作成します。

# base/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
spec:
  selector:
    matchLabels:
      app: fastapi-deployment
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:test
        imagePullPolicy: Always
        name: sample-fastapi-container

次にbaseにkustomization.yamlを作成します。
これは組み合わせるリソースやnamespaceの定義などを行います。
今回はdeploymentリソースのみを定義します。

# base/kustomization.yaml

resources:
  - deployment.yaml

dev/stgの作成

次に各環境のマニフェストを作成していきます。

作成するのは追加したい部分を記載したマニフェストファイルと先ほどのkustomizationを各環境毎に作成します。

最初は追加/変更したい部分を記載したマニフェストファイルを作成します。

# dev/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
spec:
  replicas: 3

次にkustomization.yamlを作成します。

bases:
  - ../base/
namespace: dev
patchesStrategicMerge:
  - ./patch-replicas.yaml

basesで元となるファイルを指定し、
patchesStrategicMergeで変更を取り込みたいファイルを指定します。
また、今回のようにnamespaceの変更はkustomization.yamlに記載することもできます。

実際にマージされたファイルを確認していきます。
コマンドはkustomize buildです。

$ kustomize build dev

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: fastapi-deployment
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:test
        imagePullPolicy: Always
        name: sample-fastapi-container

書き方が間違っていなければ正常にマージされたものが表示されます。

次にstg環境のを作っていきます。
用意するのはdevの時と同じものになります。

# stg/patch-strategy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
spec:
  replicas: 5
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

replicasの値とrollinUpdateを加えています。

# stg/kustomization.yaml

bases:
  - ../base/
namespace: stg
patchesStrategicMerge:
  - ./patch-strategy.yaml

確認してみましょう。

$ kustomize build stg

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
  namespace: stg
spec:
  replicas: 5
  selector:
    matchLabels:
      app: fastapi-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: fastapi-deployment
    spec:
      containers:
      - image: yusekita/sample-fastapi:test
        imagePullPolicy: Always
        name: sample-fastapi-container

期待通りにマージされています。

デプロイ

デプロイはkubectlにkオプションをつけることで行えます。

以下は先ほど作成したdev環境のマニフェストファイルをデプロイする例です。

$ kubectl apply -k dev

おわりに

使ってみた感想ですが、既存のものから少し手を加えたマニフェストファイルを作りたい場合や、
Dockerイメージだけ違うがあとは同じようなマニフェストファイルを作成するしたい場合などに、
簡単に作成ができて、管理もしやすそうな感じがしました。
似たようなツールでHelmというのもあるので今度はこちらも使ってみようと思います。

最後に宣伝にはなりますが、sweeepでは一緒に働くエンジニアを募集しています!
https://corp.sweeep.ai/recruit

GitHubで編集を提案

Discussion