Kubernetesのyaml管理ツールKustomizeを使ってみたではmanifestのbaseとなる設定を作成しました。
Kustomizeではbaseに対してoverlaysと呼ばれる設定を定義して環境毎に設定を分割して適応します。

overlaysのサンプル

今回は以下のようにディレクトリを切ってoverlaysの設定を管理していきます。

.
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── dev
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    ├── prod
    │   └── ...
    └── test
        └── ...

以下は kustomize build base の結果として出力される Deployment の設定となります。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello
  name: the-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
        deployment: hello
    spec:
      containers:
      - command:
        - /hello
        - --port=8080
        - --enableRiskyFeature=$(ENABLE_RISKY)
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              key: altGreeting
              name: the-map
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: the-map
        image: monopole/hello:1
        name: the-container
        ports:
        - containerPort: 8080

overlaysを使う場合、環境毎の設定は各環境名のディレクトリに配置されたkustomization.yamlに記述します。
例えば development.yaml のレプリカ数をoverlaysを使って変更する場合は以下のような設定を行います。環境を分割するついでにnamespaceなどメタデータも各環境に合わせて変更してみます。

  • /overlays/dev/kustomization.yaml
bases:
  - ../../base

namespace: dev-hello # namespaceを定義
namePrefix: dev- # nameに対してprefixを定義

patches: # overlaysで上書きする設定を記したファイル
- deployment.yaml
  • /overlays/dev/development.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 4

実際にこのoverlaysの設定をbaseに適応するためには以下のコマンドを使います。

kustomize build overlays/dev

実行すると以下のようなyamlファイルが生成されます。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello
  name: dev-the-deployment # prefixにdev-が追加されている
  namespace: dev-hello # namespaceが追加されている
spec:
  replicas: 4 # レプリカ数が変更されいる
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
        deployment: hello
    spec:
      containers:
      - command:
        - /hello
        - --port=8080
        - --enableRiskyFeature=$(ENABLE_RISKY)
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              key: altGreeting
              name: dev-the-map
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: dev-the-map
        image: monopole/hello:1
        name: the-container
        ports:
        - containerPort: 8080

きちんと overlays/dev で記述した設定が反映されていることがわかります。 このようにKustomizeを使うと簡単にmanifestファイルを環境分けできる事がわかりました。

まとめ

Kustomizeのbaseとoverlaysを使ってmanifestファイルを環境毎に分割・さらに1つのyamlにパッケージングする事ができました。Kustomizeはとてもシンプルな構成となっていて、実際自分も1時間ほどドキュメントを眺めるだけで簡単に使う事ができました。
KustomizeはKubernetesの初学者が最初にyaml管理目的で採用するツールとしてはとても良いと思います。