k8s の yaml を kustomize で管理している。ここからリソースを消しても kustomize はそれを感知しないためクラスタからは削除されない。
どうするか
kpt を使う。これを見つけたのは deprecated になった inventory からリンクが貼られていたため。
kpt はいくつかの機能で構成されているが、そのうち live
を使う(それ以外の機能はあまり知らない *1)。
kpt live では apply 時に適用対象のリソースを列挙して ConfigMap に保存する。これによって、次回以降の apply 時に適用するリソースと以前に適用したリソースを比較することができ、不要になったリソースが何であるかを判別することができる。
googlecontainertools.github.io
kpt を使う
kpt をインストールしたあとに、まず ConfigMap を作るためのリソースを作成する。
$ kpt live init .
これで inventory-template.yaml
ができる。これを kustomize.yaml
に含めておく。
resources: - ... - inventory-template.yaml
そして build したものを kpt live apply
で適用する。
$ kustomize build | kpt live apply
その結果、2回目からは不要なリソースを消してくれるようになる。
以下おまけ
kpt を使わない方法
Kustomize で CommonLabels
を使うことで kubectl apply --prune
と組み合わせることもできる。
commonLabels: app.kubernetes.io/managed-by: kustomize
として
$ kustomize build | kubectl apply -f - --prune -l app.kubernetes.io/managed-by=kustomize
すれば二回目以降は prune される。ただ、
のでやめた。
その他の方法
GitOps 的な方面で色々ある。
terraform
Kustomize integraion がある。ドキュメントを読むとできそう。
ただそのために terraform を導入するのも面倒なのでやめた。
flux2
Git レポジトリ経由ではなく手元から実行できる方法が分からなかったのでやめた。削除してくれるかまでは見ていない。
Argo CD
Argo CD はパージしてくれる機能がありそう。ローカル実行もできそうだったけど、kpt のほうが(ほぼ)手元で完結してシンプルで良さそうに見えたのでやめた*2。