kubernetesのリソースをtemplateで一元管理する方法を運用し始めたので、その時の備忘録をご紹介します。
トピックは主にkubernetesを利用したことがあり、kustomizeを使っていないくらいの初心の方を対象にしています。
Kustomizeとは
既存のkubernetesオブジェクトのリソースファイルをdepoyment.yml,service.tmlなどをkustomization.ymlで指定したロケーション通りに配置し、kustomize buildコマンドを実行すると、kustomization.ymlを基にしてkustomizeによるテンプレートの加工と結合を行い、kubernetesオブジェクトの一括デプロイを行うことができます。
例として、
sample/
├── configMap.yaml
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
と言うようなディレクトリでkubernetesオブジェクトを配置してみます。
kustomize build ./sample | kubectl apply -f
以上の通り、kubernetesのオブジェクトは一括デプロイを前提になるので、デプロイの依存関係や実行順序に依存しない単位で設定をbundleするように使ったほうがよさそうです(いい運用の仕方があれば教えていただけると嬉しいです。)
公式リポジトリをcloneしexamplesのフォルダで出力を簡単に試すことができます。ここまでの使い方だと。
kubectl apply -f ./sample
と何が違うのかという疑問が出てくるかと思いますが、
一つはkustomization.ymlという設定を追加したり上書きできることによって、一度定義済みのテンプレートファイルに変更を加えることなくそのまま使い回せるということです。つまり、一度作ったテンプレートの差分を検証したい場合には変更する必要のない設定を一箇所にまとめて、変更点が生じるファイルはkustomization.ymlの設定でパス設定をすることで、追加分だけkubernetesテンプレートファイルを作成し、マージしたり、deployment,staging,production用にリソースのテンプレートファイルの変更が生じる点だけ定義すればよいという利点が得られます。
この機能をよく表してる表現で公式のリポジトリでも、kustomizeは、kubernetesにおいて宣言を一つのファイルにまとめて行う点でMakefileのようなものであり、file編集したものを出力するものという意味でsedのようなものと述べられています。
ユースケースやAPIについては
https://github.com/kubernetes-sigs/kustomize/blob/master/docs/glossary.md
に詳しくまとめられています。
Environmentによりパラメータ設定
例として、公式のリポジトリのldapサーバの構成を見てみます。
ldap
├── README.md
├── base
│ ├── deployment.yaml
│ ├── env.startup.txt
│ ├── kustomization.yaml
│ └── service.yaml
├── integration_test.sh
└── overlays
├── production
│ ├── deployment.yaml
│ └── kustomization.yaml
└── staging
├── config.env
├── deployment.yaml
└── kustomization.yaml
base,overlaysというディレクトリ名はkustomizeディレクトリのコンセプトに寄る命名規則ですが、kustomization.ymlの設定次第なので変更することも可能です。
また差分の変更をわかりやすいようにファイル名で設定内容を記述すると可用性があがります。
たとえば、以上の例では、depoyment.ymlという名前をreprica_counts.yamlと変えるなどの工夫によって、変更点を作成者に明示することができます。
# 使った所感など
今回はkustomizeの導入利点を説明しました。使い方は簡単なので、自作でクラスタ作成を行う際に便利だと思います。
類似のツールにhelmがありますが、こちらは、パッケージマネージャ-として、 すでに使いまわすことができるクラスタのスタック調整まで対応できるため、用途が分かれます。
これらをうまく組み合わせて、個人的にテンプレート作成のベストプラクティスを探っていますが、知っている方がいれば教えてください。
(2019/08/20)追記
kustomizeは現在kubernetesに標準インストールされていて-kオプションでkustomizeファイルに応じたdeployが出来るようになっていました。