Kubernetes

Kustomize かすたまいず

Kubernetesマニフェストオーバーレイkubectl環境差分YAML
Kustomizeについて教えて

簡単に言うとこんな感じ!

KubernetesのYAML設定ファイルを「ベース+差分」の形で管理できるツールだよ。「開発環境と本番環境でほぼ同じ設定なのに、レプリカ数だけ違う」ってとき、丸ごとコピーせず”差分だけ”書けばOKなんだ!


Kustomizeとは

Kustomizeは、Kubernetesの設定ファイル(マニフェスト)をテンプレートエンジンを使わずに管理・カスタマイズするためのツールです。2019年にKubernetes本体(kubectl)に組み込まれ、現在は追加インストールなしで利用できます。

Kubernetesではアプリの設定をYAMLファイルで記述しますが、開発・ステージング・本番といった複数の環境で「ほぼ同じだが少し違う」設定が必要になることがよくあります。Kustomizeはベース(共通設定)とオーバーレイ(環境ごとの差分)という考え方で、この問題をシンプルに解決します。

HelmのようにYAMLにテンプレート構文({{ }}など)を埋め込む必要がなく、純粋なYAMLのまま管理できるのが最大の特徴です。コードレビューや差分確認がしやすく、Gitとの相性も抜群です。


Kustomizeの構造と仕組み

Kustomizeは「ベース」と「オーバーレイ」という2層構造で設定を管理します。

概念役割
ベース(base)全環境共通の設定をまとめたものDeployment・Serviceの基本定義
オーバーレイ(overlay)環境ごとに上書きする差分設定本番はレプリカ数3、開発は1
kustomization.yaml何を読み込み、何を差分適用するかを宣言するファイルresources・patchesを列挙
パッチ(patch)ベースの特定フィールドだけを上書きする小さなYAMLreplicas: 3 だけを書く
my-app/
├── base/                     ← 共通設定
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
└── overlays/
    ├── dev/                  ← 開発環境の差分
    │   ├── patch-replicas.yaml
    │   └── kustomization.yaml
    └── prod/                 ← 本番環境の差分
        ├── patch-replicas.yaml
        └── kustomization.yaml

覚え方:「ベースはレシピ、オーバーレイはトッピング」

ピザのベース生地(共通)に、お好みのトッピング(環境差分)をのせるイメージ。生地を毎回作り直す必要はなく、トッピングだけ変えればよい!

kustomization.yamlの基本構文

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../../base
patches:
  - patch-replicas.yaml
commonLabels:
  env: production

歴史と背景

  • 2017年頃 — Kubernetesが普及するにつれ「複数環境の設定管理」が課題に。HelmやJSONnetなどが登場するが、テンプレート構文の複雑さが問題視される
  • 2018年 — GoogleエンジニアがKustomizeをオープンソースとして公開。「テンプレートなしで差分管理できる」コンセプトが注目を集める
  • 2019年 — Kubernetes v1.14にて kubectl にKustomizeが統合。kubectl apply -k コマンドで使えるように
  • 2020年以降 — ArgoCD・Flux(GitOpsツール)がKustomizeをネイティブサポート。GitOpsワークフローの標準的な構成管理ツールとして定着
  • 現在 — スタンドアロン版(kustomize CLI)と kubectl 組み込み版が並行メンテナンス。スタンドアロン版の方が機能追加が速い

KustomizeとHelmの比較

Kubernetesの設定管理ツールとしてよく比較されるのが Helm です。両者は思想が異なり、用途によって使い分けが重要です。

Kustomize vs Helm 比較 Kustomize Helm テンプレート構文なし(純粋なYAML) Go templateでYAMLを動的生成 構文 差分(パッチ)で上書き values.yamlで変数を注入 カスタマイズ kubectl組み込み(追加不要) Helm CLI別途インストール必要 導入 自社アプリの環境差分管理 OSSパッケージの配布・再利用 得意領域 シンプル・学習コスト低め 高機能・複雑なロジックも可能 複雑さ 社内開発に◎ OSS配布・再配布に◎

実務での選び方まとめ:

  • 自社開発アプリを複数環境(dev/stg/prod)にデプロイしたい → Kustomize
  • MySQLやPrometheusなどのOSSを手軽にインストールしたい → Helm
  • 両方使いたい → ArgoCDなどのGitOpsツールで組み合わせることも可能

関連する規格・RFC

仕様・ドキュメント内容
Kustomize公式ドキュメント公式の機能説明・チュートリアル
Kubernetes SIG-CLIKustomizeの開発・管理リポジトリ
KEP-0008kubectlへのKustomize統合に関するKubernetes Enhancement Proposal

関連用語

  • Kubernetes — コンテナのデプロイ・管理を自動化するオーケストレーションプラットフォーム
  • マニフェスト — Kubernetesへの指示をYAMLで記述した設定ファイル
  • Helm — Kubernetesのパッケージマネージャー。テンプレート構文でマニフェストを動的生成する
  • kubectl — Kubernetesクラスターを操作するコマンドラインツール
  • GitOps — Gitリポジトリを唯一の信頼源としてインフラ・アプリをデプロイする手法
  • ArgoCD — KubernetesのGitOps継続的デリバリーツール。Kustomize/Helmをネイティブサポート