kustomizeであるリソースを消す方法

AvatarPosted by

この記事は 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されてしまって困る、というところから提案されたものです。色々詳しく知りたい方はこちらへ。

https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md

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では kindmetadata.name の値がセットされている必要があるのですが、その値自体は重要ではありません。

それではビルドしてみます。

$ kustomize build overlay/
$

そして誰もいなくなった・・・

おわりに

kustomizeでリソースを消すパッチを紹介しました。

Strategic Merge Patchでの各操作は覚えておくと便利そうですね。

ついでにStrategic Merge Patchや操作を知った上でググってみると普通に出てきますね。辛い😌

それでは!