「Kustomize」超入門――複数環境の重過ぎKubernetesマニフェスト、どう管理すればいいのか:Cloud Nativeチートシート(2)
Kubernetesやクラウドネイティブをより便利に利用する技術やツールについて概要や使い方を凝縮して紹介していく連載。今回は、「Kustomize」を取り上げます。
Kubernetesやクラウドネイティブをより便利に利用する技術やツールについて概要や使い方を凝縮して紹介していく本連載「Cloud Nativeチートシート」。今回は「Kustomize」を取り上げます。
目次
- 複数環境の重過ぎKubernetesマニフェスト、どう管理すればいいのか
- 「Kustomize」とは
- Kustomizeの構成
- Kustomizeのインストール
- Kustomizeを使って差分情報を管理する方法
- 主なプラグイン、17の使い方
- Kustomizeをカスタマイズ
- 「Helm」との使い分け
- まとめ
複数環境の重過ぎKubernetesマニフェスト、どう管理すればいいのか
Kubernetesへのデプロイは「マニフェスト」を使っている方が多いのではないでしょうか。手動でデプロイする場合であれば、下記のようなコマンドを実行すると思います。CI/CD(継続的インテグレーション/継続的デリバリー)ツールなどを使ってデプロイをする際でも、手動の場合と同じようにマニフェストを使うことがほとんどでしょう。
kubectl apply -f manifest.yaml
このようにKubernetesでは、デプロイに関する記述をマニフェストというコードの形式で管理できるため、IaC(Infrastructure as Code)を手軽に実現できます。しかし、商用サービスを開発するようなケースでは、開発/試験/本番環境といった複数環境を利用することが求められます。このようなケースでは、例えば下記のような設定は、それぞれの環境において異なる値が設定される可能性があるため、環境差分としてこれらの情報を管理する必要があります。
- アプリケーションのバージョン
- 接続先のエンドポイント情報
- データベースへのクレデンシャル情報
では、どのようにしてこれらの環境差分を管理したらいいのでしょうか?
CI/CDツールなどを利用している場合、CI/CDツールをメンテナンスする若干名しか詳細を把握しておらず「最終的に、どのような状態になるか」が分かりにくくなるため、IaCの実現に苦労している方も多いと思います。環境ごとにGitのブランチを分けたり、フォルダを分けたりして、環境ごとにそれぞれのマニフェストを管理している方もいるかもしれませんが、マニフェストの記述量が増えると、環境差分の管理が大変になります。ファイルやブランチで管理していると、環境間でのファイルやブランチのマージにおいて“漏れ”なども発生します(図1)。
「Kustomize」とは
そこで、「Kustomize」を利用すると、この環境差分の管理が簡単にできるようになります。Kustomizeでは、ベースとなるマニフェストと、そのマニフェストに対する環境差分を管理し、ベースのマニフェストに対して環境差分情報のパッチを当てるという形でデプロイするマニフェストを生成、管理します(図2)。
そのため、上述した問題点を解消し、複数環境で開発しないといけない場合でも手軽にIaCを実現できます。
Kustomizeは、このように環境差分だけを管理し、同じ設定を重複して管理する必要がないため、「DRY(Don't Repeat Yourself)」の原則をサポートするためのツールと紹介されることもあります。
Kustomizeの構成
Kustomizeの構成を簡単に説明すると、図3のようになります。
開発環境(dev)と商用環境(prod)へそれぞれ別の設定でデプロイしたいとしましょう。まず、環境共通のマニフェスト「base」を定義します。baseに対し、それぞれの環境用の差分を「overlay」(上書き用のパッチ)として用意します。最終的にそれぞれのパッチが適用されたマニフェストを生成することができます。
具体的にファイル構成を見ていくと、次のようになります。
├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── dev │ ├── kustomization.yaml │ └── patch.yaml ├── prod │ ├── kustomization.yaml │ └── patch.yaml └── staging ├── kustomization.yaml └── patch.yaml
※本稿で利用しているサンプルは、「https://github.com/cloudnativecheetsheet/kustomize」から「git clone」コマンドで取得できるので、参考にしてください。
フォルダ構成を見ると、baseとoverlaysの2つのフォルダを確認できます。baseのフォルダには、全ての環境のベースとなるマニフェストを管理し、overlaysフォルダにある環境ごとの管理フォルダ(dev、prod)で、環境ごとの差分となる設定ファイル(マニフェスト)をパッチとして管理します。
各フォルダには、kustomizationファイル(kustomization.yaml)が配置されていますが、kustomizationファイルの中に環境ごとのパッチの処理を記述します。
具体的な設定方法や適用イメージについては、後述の「Kustomizeを使ってみよう」で見ていきます。
Kustomizeのインストール
Kustomizeを利用するには、「kubectl」コマンド組み込みのKustomizeを、「-k」オプションで利用する方法と、Kustomizeバイナリを導入してkustomizeコマンドで利用する方法があります。
2020年12月の執筆時時点でKustomizeの最新バージョンは、3.8.7ですが、kubectl組み込みのKustomizeは2.0.3と若干古いバージョンとなっています(※kubectl組み込みのKustomizeも将来的にバージョンアップされる予定があります)。
また、kubectlコマンドを利用する場合、「kubectl apply --dry-run=client -k」のように明示的に「--dry-run=client」オプションを付与しないと、「クラスタへのデプロイが発生します。kubectlコマンドを利用すると、生成されるYAMLを確認したかったのに、誤ってデプロイする」という可能性もあるので、Kustomizeを個別に導入することをお勧めします。
本稿では、最新のKustomizeを個別に導入して解説します。
インストール方法は、「curl」「bash」コマンドが使えるOSなら、「root」もしくは「sudo」ユーザーで下記コマンドを実行するだけです。
$ curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
インストーラがOSを自動的に判別し、適切なバイナリをインストールしてくれます。なおWindowsの場合は、bashがデフォルトでは利用できないので、Kustomizeのリリースサイトの「Assets」から、exeファイルをダウンロードしインストールしてください。直接端末からインターネットに接続できない環境で利用する場合も、上記のリリースサイトからバイナリをダウンロード、コピーして、インストールしてください。
インストールが完了したら、シェルでkustomizeのコマンドやオプションを補完できるようにしておくと便利です。例えば、bashシェルの補完を利用するには、下記のようなコマンドを実行して、一度ログアウトしてログインし直します。
$ kustomize completion bash >> ~/.bashrc
bash以外にも、「zsh」「fish」「PowerShell」などの補完もサポートしています。
Kustomizeを使って差分情報を管理する方法
Kustomizeを使って差分情報を管理する方法は大きく2通りあります。
- patchマニフェストに差分を記述し、「kustomization」ファイルとは別ファイルとして管理
- プラグインを利用してkustomizationファイルに記述して管理
基本的に差分が別ファイルにばらばらに管理されると、変更内容の全体を把握するのが大変なので、2のプラグインを利用する方法がお勧めです。プラグインを利用すると、コンテナイメージのバージョンや「ConfigMap」など、環境ごとに頻繁に変わる設定については、kustomizationファイルに簡易な記述をするだけでパッチを当てることができます。
プラグインで対応できない場合は、1のpatchマニフェストを利用するとよいでしょう。
1.patch機能によるマニフェスト管理の実践
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Kubernetesの自前運用は難しい? はてなの撤退事例
はてなのMackerelチームはKubernetesクラスタを自前で構築して運用していたが、撤退を選択したという。なぜ、Kubernetesの運用を諦めて撤退を選んだのか。はてなのMackerelチームでSREを務める今井隼人氏が語った。 - Kubernetesを手元で試せる「Minikube」「MicroK8s」とは
「コンテナ技術」やコンテナ実行環境の「Docker」、大量のコンテナ管理や負荷分散を実現する「Kubernetes」について概要から本番活用の仕方まで解説する「これから始める企業のためのコンテナ実践講座」。第4回は、Kubernetesのパッケージマネジャー「Helm」と手元で試せる「Minikube」「MicroK8s」を紹介します。 - Kubernetes 1.14がリリース、Windowsコンテナサポートが安定版に到達
Kubernetesプロジェクトは2019年3月25日(米国時間)、Windowsノードの本番サポートなどを盛り込んだKubernetes 1.14をリリースしたと発表した。Kubernetes 1.14では、安定性に重点を置き、既にβ版などとして搭載している機能を成熟させることに力を注いだという。