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

Leave a Reply

Your email address will not be published. Required fields are marked *