普段、KubernetesのNamespaceはNamespace毎にyamlファイルを用意し、kubectl applyコマンドでディレクトリを指定して更新したりしている。しかし、この方法だとyamlを削除してもKubernetes側のリソースは更新されず、不便だなと感じていた。そこで、codenize.toolsのようにRuby DSLを使ったNamespace管理を試してみた。作ったツールはtakaishi/heyaだ。
まず、以下のようにNamespaceが存在しているとする。
⟩ kubectl get namespace --show-labels NAME STATUS AGE LABELS default Active 35d <none> foo001 Active 1s service=foo,stage=development foo002 Active 1s service=foo,stage=staging,test=abcde foo004 Active 1s <none> kube-public Active 35d <none> kube-system Active 35d <none>
ここで、以下のようなHeyafileを用意する。
namespace 'default' do end namespace 'kube-system' do end namespace 'kube-public' do end namespace 'foo001' do labels stage: 'development', service: 'foo', test: 'hoge' end namespace 'foo002' do labels stage: 'staging', service: 'hoge' end namespace 'foo003' do labels stage: 'production', service: 'foo' end
heyaコマンドをドライ・ランする。Namespaceの新規作成、削除、ラベルの更新などを確認できる。
⟩ bundle exec ruby ./exe/heya --dry-run update: foo001 add label test: hoge update: foo002 delete label test: abcde update: foo002 update label service: hoge create: foo003 delete: foo004
ドライ・ランオプションを外して実行。
⟩ bundle exec ruby ./exe/heya update: foo001 add label test: hoge update: foo002 delete label test: abcde update: foo002 update label service: hoge create: foo003 delete: foo004
Namespace一覧を見ると、Heyafileで定義した通りになっていることがわかる。
⟩ kubectl get namespace --show-labels NAME STATUS AGE LABELS default Active 35d <none> foo001 Active 2m service=foo,stage=development,test=hoge foo002 Active 2m service=hoge,stage=staging foo003 Active 20s service=foo,stage=production kube-public Active 35d <none> kube-system Active 35d <none>
普段codenize.toolsを使っているので、Ruby DSLで定義した通りにKubernetes側の状態が収束してくれるのはなじみのある動きでわかりやすい。UserやRBACなども同じように管理できるとおもしろいかもしれないなー。
と、ここまでやってみて、applyコマンドに–pruneオプションがあることに気づいた。まだアルファ版という状態だが、これを使えばマニフェストにないリソースを削除してくれるようだ…これでいいのではないか?