repl.info

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