🦆
k0sで動いてるdistrolessコンテナにファイルを送り込む
はじめに
k0sで走ってるdistrolessコンテナpodがなにかおかしいときにshellを取りたいんだけどdistrolessだとbusyboxもない。
dockerで動いてる場合はcpでbusyboxを流し込める[1]というので、dockerで出来るんだったらcontainerd[2]でも出来るだろうと思って調べたところ、nerdctl cpを使うことで無事達成。
具体例
と言っても、nerdctl標準と違うsocketとnamespaceを指定[3]するだけ。
$ sudo nerdctl -a unix:///run/k0s/containerd.sock -n k8s.io ps
これでファイル送り込みたいpodのidを調べて、そこに向かって流し込む。
$ sudo nerdctl -a unix:///run/k0s/containerd.sock -n k8s.io cp ./busybox 17339f010b5c:/usr/bin
あとはnerdctl execなりkubectl execで実行。なお、kubeectl exec
は実行ユーザを指定できない[4]ので、無理やりroot shellを取る必要があるなど指定したい場合はnerdctl exec
を使います。
-
Runtime (CRI) - Documentationにあるとおり、k0sのdefault CRIはcontainerdです。 ↩︎
-
Properties にあるように、この引数は環境変数
CONTAINERD_ADDRESS
およびCONTAINERD_NAMESPACE
で指定可能なので、恒常的に使うんだったらこっちで設定したほうが良いかも。 ↩︎ -
Support the user flag from docker exec in kubectl exec · Issue #30656 · kubernetes/kubernetes ↩︎
Discussion