この記事は GRIPHONE Advent Calendar 2020 25日目の記事です。
SREの徳田です。
ふとkustomizeでbaseのリソースからあるリソースを削除したいな〜と思ったのですが、なかなかやり方や文献が出てこなかったので紹介も兼ねてここに書いておこうかなと思います。
TL;DR
Strategic Merge Patchとして以下のパッチを適用する。
$patch: delete
apiVersion: v1
kind: Namespace
metadata:
name: hoge
Manifestの例
以下のようなディレクトリ構成・Manifestを用意しました。
$ tree
.
├── base
│ ├── kustomization.yaml
│ ├── ns-fuga.yaml
│ └── ns-hoge.yaml
└── overlay
└── kustomization.yaml
2 directories, 4 files
$ cat base/*
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ns-hoge.yaml
- ns-fuga.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: fuga
---
apiVersion: v1
kind: Namespace
metadata:
name: hoge
$ cat overlay/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
そしてoverlayのフォルダでkustomize build
した結果が以下のとおりです。
apiVersion: v1
kind: Namespace
metadata:
name: fuga
---
apiVersion: v1
kind: Namespace
metadata:
name: hoge
2つのNamespaceのManifestを生成するbase側とそれをそのまま取り込んでいるoverlay側があります。
ここから hoge
namespaceを削除することを考えます。
Strategic Merge Patch
Strategic Merge Patchは、もともとJSON PatchだとListがReplaceされてしまって困る、というところから提案されたものです。色々詳しく知りたい方はこちらへ。
Strategic Merge Patchは操作として、以下の4つがあります。
replace
merge
delete
deleteFromPrimitiveList
この中の `delete` という操作を使ってリソースの削除をします。
こちら delete
の操作を指定した例です。
rollingUpdate:
$patch: delete
上記のpatchを適用すると以下のような出力結果になります。
rollingUpdate: null
このように delete
はこのディレクティブを含む要素を削除(null)にする操作になります。
リソース自体を消す
あるフィールドの要素を消すだけであればJsonPatchでいいわけですが、リソースごと消すのはできません。そしてなんとStrategic Merge Patchだとできるんです!
方法は簡単で delete
ディレクティブを一番上に持ってきます。
$patch: delete
apiVersion: v1
kind: Namespace
metadata:
name: hoge
このパッチをkustomizeに指定します。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patchesStrategicMerge:
- delete-ns-hoge.yaml
これをビルドすると以下のような出力になります。
apiVersion: v1
kind: Namespace
metadata:
name: fuga
指定のリソースを消すことができました!
リソース消すだけのパッチを作ってみる
誰が得するか分かりませんが、ただただリソースを消すパッチを patches
フィールドを使うといい感じにリソースを消すことができます。(ほんとに誰得)
以下のように kustomization.yaml
を編集します。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- patch: |
$patch: delete
kind: dummy
metadata:
name: dummy
target:
kind: Namespace
patches
フィールドを使ったStrategic Merge Patchでは kind
と metadata.name
の値がセットされている必要があるのですが、その値自体は重要ではありません。
それではビルドしてみます。
$ kustomize build overlay/
$
そして誰もいなくなった・・・
おわりに
kustomizeでリソースを消すパッチを紹介しました。
Strategic Merge Patchでの各操作は覚えておくと便利そうですね。
ついでにStrategic Merge Patchや操作を知った上でググってみると普通に出てきますね。辛い😌
それでは!