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ファイルを分割するのか次回紹介します。