(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】Kustomizeのbase/patchでYAMLを管理する流れ

スポンサーリンク

はじめに

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を使えば共通管理部分だけを修正した上でコードを生成すれば、この変更を末端のファイルは修正不要で取り組むことができます。

以上、ご参考になれば幸いです。