Kustomize使ってみた
はじめに
sweeep株式会社エンジニアの関田です。
今回はKubernetesでよく使われるマニフェスト管理ツールのkustomizeを使ってみたので
簡単に紹介したいと思います。
Kustomizeのドキュメントはこちらになります。
Kustomize Reference
また、今回例で使用するマニフェストファイルは以下になります。
Github
Kustomizeとは
Kustomizeとはマニフェストファイル管理ツールで、
dev、stg、prd環境などにそれぞれマニフェストファイルを書くと同じ内容のものが何箇所も出てきます。
Kustomizeはそのような場合の管理を簡単に行えるようにできるツールになります。
インストール
上記にいろいろなインストール方法が書いてあります。
今回は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の違いは主に以下の点になります
- namespace
- replicas
- 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では一緒に働くエンジニアを募集しています!
Discussion