Kustomize」はマニフェストの差分管理を可能にするコマンドラインツールです。冗長になりがちなマニフェストの共通化を可能にし、DRY(Don’t Repeat Yourself)の原則を簡単に適用することができます。例えば、ベース(base)とカスタマイズ部分(devやprodなど)に分け、開発環境と本番環境の環境差分を効率的に管理するといった具合です。

同ツールは、k8sのv1.14から「kubectl」に統合され、k8sの標準ツールとなりました。その結果、従来のKustomizeコマンドを個別にインストールして利用する方法に加えて、kubectlのオプションを用いることも可能になっています。

パッケージマネージャの「Helm」と比較して、柔軟性が高く、また環境間の共通化が容易な点が特徴です。アプリケーションの配布に重きを置く場合はパッケージマネージャを使うなど、用途に合わせて使い分けると良いでしょう。

公式サイト

Kustomizeの公式サイト

他プロダクトとの親和性

Kustomizeはコマンドラインでマニフェストを作る部分に特化しており、さまざまなプロダクトとの親和性が高いのが特徴です。具体的には、以下のプロダクトとの統合が図られています。

  • Kots
  • ArgoCD
  • Flux
  • Kuestack
  • Unfork
Kustomizeと統合されたプロダクト

Kustomizeと統合されたプロダクト/出典:Kustomizeの公式サイト

ベースと環境差分

Kustomizeでは、baseフォルダにベースとなるマニフェストを配置します。また、dev/prodフォルダに、以下のような環境差分を設定します。

  • nameprefix:環境名を指定
  • replicas:開発環境は1を指定し単体pod構成とし、本番環境では3を指定して冗長構成とする
  • image:開発環境では常に最新バージョンのコンテナイメージを指定し、本番環境ではシステムテストまで完了した安定バージョンを指定

公式ドキュメントには、「bases」から「vars」まで全19種類の設定可能なフィールドが掲載されています。特に、パッチ(patches)を使うと任意のマニフェストを指定できるので、細かな設定が必要になった場合に使うと良いでしょう。

フォルダ構成は以下の通りです。識別しやすいように、環境名などを付けておくと良いでしょう。

フォルダ構成

フォルダ構成

設定ファイル

上記フォルダ構成で示した各設定ファイルを見ていきましょう。

ベースとなるリソース(deployament.yaml/service.yaml)は、通常通りのマニフェストの記述方法で記述します。公式サイトのYAMLファイルなどを参考にすると良いでしょう。

base/kustomization.yamlには、ベースとなるリソース(Deployment/Service)のマニフェストへの参照を記述します。マニフェストを普段書かれている方であれば、とっつきやすいと思います。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml

dev/kustomization.yamlには、開発環境の環境差分を記述します。ベースのリソースへの参照パスと、環境の識別子として「dev-」を指定しています

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../base
nameprefix: dev-

※ prod/kustomization.yamlの記述はdevと同様なので、割愛します。

## kustomizeを使ってみる では、Kustomizeを使ってみましょう。Kustomizeはkubectlに組み込まれているため、インストールは必要ありません。2021年5月1日時点の最新バージョンであるkubectlのv1.21.0に組み込まれているKustomizeは、v4.0.5です。 最新バージョンはv4.1.2ですので、そちらを使いたい方は以下よりインストールしてください。 $brew install kustomize ### 実行してみる 前節のbase/dev/prodフォルダの親フォルダに移動します。以下を実行し、マニフェストを出力してみましょう。
$kubectl kustomize dev
apiVersion: v1
kind: Service
metadata:
  labels:
    run: my-nginx
  name: dev-my-nginx
spec:
~後略~
たった1コマンドでマニフェストを出力できることがわかります。 次に変更点を確認してみましょう。baseとdevの実行結果の差分をdiffコマンドで出力します。
$diff -u 

name属性の冒頭に「dev-」が付与されたことがわかります。

* * *

繰り返しになりますが、kustomizeはKubernetes標準のツールであり、利用方法も非常にシンプルです。他のツールと組み合わせて利用することも容易にできるので、ぜひ、お手元のDevOps環境に組み込んでみてください。

著者紹介


正野 勇嗣 (SHONO Yuji ) - NTTデータ 課長

2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。

最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。