🔧

Kustomizeの依存関係を可視化するツールを作った

2021/01/13に公開

はじめに

先日、こんな記事を書いたのですが、ツールの紹介もしておこうと思います。
https://qiita.com/hourglasshoro/items/cd8cc1fc986c7dedfcaf

TL;DR

Graphmize

https://github.com/hourglasshoro/graphmize

  • 探した所、Kustomizeの可視化ツールで人気なものはなさそうだったので作った(もしあったら教えてください)
  • このツールのモチベーションはKustomizeのファイル同士の依存関係を木構造で見れたらいいなという所にあります。特に、base, overlaysのようなディレクトリ構成で複雑になってしまった時などに使えると思います。
  • 例えばターミナルで実行すると以下のような出力になります。実際のディレクトリ構造はこちら
/
├── overlays/production
│   └── base
│       └── base/a_service
│           ├── deployment.yaml
│           └── service.yaml
└── overlays/staging
    └── base
        └── base/a_service
            ├── deployment.yaml
            └── service.yaml

  • インストールはgo modulesかhomebrewでできます。
# homebrew
brew tap hourglasshoro/homebrew-graphmize
brew install graphmize

# go
go get github.com/hourglasshoro/graphmize

実装について

現在

現在のv0.1.1ではresourcesのみ表示することができます。patchなどに関しては今後の機能追加で実装するつもりです。

参考にしたもの

https://github.com/jpreese/kustomize-graph
こちらを参考にkustomizeファイルを読み込む部分を作りました。このライブラリは実行するディレクトリにあるkustomization.yamlからしか読み込めません。それだと使いにくいので、ルートディレクトリを指定したら探索して全ての依存関係のツリーを作るよう拡張をしました。

https://github.com/hourglasshoro/graphmize/blob/master/pkg/graph/graph.go#L111
具体的には実装のこのあたりになります。また、すでに出てきた子のツリーに関してはメモリ上に保存し探索効率をあげています。

使ったライブラリ

spf13/cobra

https://github.com/spf13/cobra
もともとCLIツールを作ったことがなかったのですが、おなじみ(?)のcobraのテンプレートを使い簡単に作ることができました

spf13/afero

https://github.com/spf13/afero
同じ作者のaferoも優秀で、ファイルシステムの抽象化ライブラリです。以下の記事にも書いてありますがos パッケージのファイル系関数や io/ioutil の代わりに使うもので、テスト時にOSのファイルシステムではなくモックのファイルシステムを使うことのできるものです。
https://qiita.com/izumin5210/items/7604f290785bc3f8f86a#afero---spf13afero

たとえば以下のようなディレクトリ構成にしたい場合

   /app
   ├── kustomization.yaml
   └── sub
	   ├── kustomization.yaml
	   ├── a.yaml
	   └── b.yaml

以下のようにします。

func TestExampleFiles(t *testing.T) {
	fakeFileSystem := afero.NewMemMapFs()
	fakeFileSystem.Mkdir("app", 0755)
	fakeFileSystem.Mkdir("app/sub", 0755)

	fileContents := `
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- sub
`
	afero.WriteFile(fakeFileSystem, "app/kustomization.yaml", []byte(fileContents), 0644)

	fileContents = `
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- a.yaml
- b.yaml
`
	afero.WriteFile(fakeFileSystem, "app/sub/kustomization.yaml", []byte(fileContents), 0644)

	fileContents = `
apiVersion: apps/v1
kind: Deployment
`
	afero.WriteFile(fakeFileSystem, "app/sub/a.yaml", []byte(fileContents), 0644)
	afero.WriteFile(fakeFileSystem, "app/sub/b.yaml", []byte(fileContents), 0644)
}

まとめ

Graphmizeという自作ツールの紹介でした。もし使えそうであれば活用していただけると幸いです。contributeも歓迎していますので、よろしくお願いします!

Discussion