KubernetesのNamespaceをRuby DSLで管理できないか試してみた
普段、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オプションがあることに気づいた。まだアルファ版という状態だが、これを使えばマニフェストにないリソースを削除してくれるようだ…これでいいのではないか?