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 をコンテナにコピーして実行…みたいなのもできると面白そうだなぁと思ったり(しかし、既存のライブラリを上書きしてしまうので工夫が必要そう)。