May 24, 2020

複数の Pod でコマンドを実行できる kubectl-multi-exec を作った

Kubernetes で遊んでいると、指定した Pod 全てで同じコマンドを実行したいというケースがありました。
kubectl exec -l app=test のような感じで label を指定して実行できれば良いのですが、今はできません。

上記 issue にありますが、頑張ってシェル芸をするというのが現状です。
そんなに使うこともないし、わざわざ覚えるのも面倒なので kubectl plugin として PoC レベルですが作りました。

PATH が通っているところにバイナリをコピーして kubectl plugin でインストールを確認します。

❯ kubectl plugin list
The following compatible plugins are available:

/usr/local/bin/kubectl-multi_exec

使い方ですが、例えば app=test というラベルを付けた Pod に対してコマンドを実行するには、次のように multi-exec サブコマンドで --selector option にラベルの key/value を指定することで、あとに続くコマンドが実行されます。

❯ kubectl get pod -l 'app=test'
NAME    READY   STATUS    RESTARTS   AGE
test    1/1     Running   0          25s
test2   1/1     Running   0          18s

❯ kubectl multi-exec --selector 'app=test' -- hostname
test
test2

❯ kubectl multi-exec --selector 'app=test' -- uname -a
Linux test 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Linux test2 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

https://github.com/fntlnz/falco-inject/ を参考にしながら(というかほとんどこれベースなのだけど…)書いていた。
falco-inject みたいに、例えば、任意のバイナリとその共有ライブラリや設定ファイルを含んだ scratch ベースの rootfs をコンテナにコピーして実行…みたいなのもできると面白そうだなぁと思ったり(しかし、既存のライブラリを上書きしてしまうので工夫が必要そう)。


このエントリーをはてなブックマークに追加

© Kohei Morita 2020