はじめに
Kustomizeはkustomizationファイルと呼ばれるYAMLを用いてKubernetesリソースを管理する方法で、共通化部分のYAMLをbaseディレクトリ、そこからの差分をpatchとして管理することでYAMLの冗長な部分をカットして扱うことができます。
本記事では実際にKustomizeを利用してYAMLを管理する流れについて分かりやすく記載しました。
環境情報
$ kubectl version Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3"...
事前準備
あるDeploymentのYAML(dep.yaml)があるとして同ファイルをbaseディレクトリに配置します。
同じくこのディレクトリにKustomize用のファイル(kustomization.yaml)を以下のように用意します。
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - dep.yaml
現在のディレクトリ構成は以下。
$ tree . └── base ├── dep.yaml └── kustomization.yaml
ここで以下のようにbaseからの差分(レプリカ数を1から3)を記載したYAMLファイル(patch.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 3
とkustomization.yamlを以下のようにして配置します。
bases: - ../../bases patches: - patch.yaml
現在のディレクトリ構成は以下。
$ tree . ├── bases │ ├── dep.yaml │ └── kustomization.yaml └── overlays └── test1 ├── patch.yaml └── kustomization.yaml
KustomizeによるYAMLファイル作成
上記の状態で以下のように差分が配置されているディレクトリを指定すると
$ kubectl kustomize overlays/test1
ベース情報から記載した差分だけが変更となったYAMLが標準出力されます。
試しに標準出力をYAMLに吐き出してdiffコマンドを取ると以下のような結果になります。
$ diff xx xxcxx < replicas: 1 --- > replicas: 3
尚、差分を記載するにも最小情報として
- apiVersion
- kind
- metadata:.name
はbaseのYAMLに合わせる必要があり、それを欠かすと以下のようにエラーが出ます。
Error: failed to find an object with ~G_~V_Deployment|test to apply the patch
Error: SliceFromPatches: YAML file [patch.yaml] encounters a format error. error unmarshaling JSON: while decoding JSON: Object 'Kind' is missing in...
Error: SliceFromPatches: missing metadata.name in object...
終わりに
テスト環境と本番環境のYAMLファイル群を個別に管理している場合、コンテナイメージに修正が入ると関連するファイルの全てに修正が必要です。一方でKustomizeを使えば共通管理部分だけを修正した上でコードを生成すれば、この変更を末端のファイルは修正不要で取り組むことができます。
以上、ご参考になれば幸いです。