Kubernetesのyaml管理ツールKustomizeを使ってみた
EKSの環境を構築していて、そろそろprod/test/devなど環境毎にyamlファイルを作る必要性が出てきたので、テンプレートエンジン的なツールを探していました。
初めはHelmを使う予定だったのですが、Helmはテンプレートエンジンとして使うだけの場合、管理方針や仕組みが複雑に感じ他に良さそうなツールを探していた所Kustomizeにたどり着きました。
Kustomizeは、kubernetesのyamlパッケージングツールです。 ※KustomizeはKubernetes 1.14からkubectlの標準コマンドとして取り込まれるみたいですね。(2019/04/01 追記)
Kustomizeの良い所
- 学習コストが低い
- 管理対象はyamlのみ
- 記述もすべてyaml
- 出力が単一のmanifestファイルになる
- コマンドがシンプル
$ kustomize help
kustomize manages declarative configuration of Kubernetes.
See https://sigs.k8s.io/kustomize
Usage:
kustomize [command]
Available Commands:
build Print current configuration per contents of kustomization.yaml
config Config Kustomize transformers
edit Edits a kustomization file
help Help about any command
version Prints the kustomize version
Kustomizeの微妙な所
- そんなにyamlの記述量が減らない
- プログラマブルに設定ファイルを記述することはできない
Kustomizeのサンプル
まずは簡単に複数のmanifestファイルを1つのyamlにパッケージングし、一部の設定を共通化してみます。kustomizeのリポジトリにあるhelloWorldのサンプルを元に簡単に解説します。
kustomization.yaml以外は普通のkubernetesのmanifestファイルとなります。 ビルドに関するメインの処理kustomization.yamlに記述します。 ``` # ディレクトリ構造
base ├── configMap.yaml ├── deployment.yaml ├── kustomization.yaml └── service.yaml
以下はkustomization.yamlの中身です。
```yaml
commonLabels: # kubernetes metadataのlabelsを定義
app: hello
resources: # 上記で定義した内容を列挙したyamlファイルに適応する
- deployment.yaml
- service.yaml
- configMap.yaml
manifestファイルの例としてビルド前のconfigMap.yamlを確認してみます。
apiVersion: v1
kind: ConfigMap
metadata:
name: the-map
data:
altGreeting: "Good Morning!"
enableRisky: "false"
これらのファイルを kustomize build
すると以下のような1つのmanifestファイルが標準出力で得られます。
apiVersion: v1
data:
altGreeting: Good Morning!
enableRisky: "false"
kind: ConfigMap
metadata:
labels: # ビルド前と比べてラベルが追加されている
app: hello
name: the-map
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello
name: the-service
spec:
ports:
... 省略
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello
name: the-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hello
... 省略
このテンプレートをkubernetesに適応したい場合は以下のように実行する事ができます。
kustomize build | kubectl apply -f -
例では簡単にラベルのみを追加しましたが、基本的にkustomization.yamlへはnamespaceやnamePrefixなど、共通設定を切り出したり、overlaysという仕組みを使ってmanifestの一部のパラメータを上書きする事ができます。(overlaysに関しては別の記事で解説予定。)
まとめ
Kustomizeの一番基本の機能を使ってみました。
個人的にあまり長い記事を書くとだれてしまうので、分割しつつモチベーション維持してこうと思います。ということで、冒頭で問題にしていた環境毎にどのようにmanifestファイルを分割するのか次回紹介します。