🦆

k0sで動いてるdistrolessコンテナにファイルを送り込む

2024/04/20に公開

はじめに

k0sで走ってるdistrolessコンテナpodがなにかおかしいときにshellを取りたいんだけどdistrolessだとbusyboxもない。

dockerで動いてる場合はcpbusyboxを流し込める[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を使います。

脚注
  1. kubernetes + distrolessはデバッグ可能か? ↩︎

  2. Runtime (CRI) - Documentationにあるとおり、k0sのdefault CRIはcontainerdです。 ↩︎

  3. Properties にあるように、この引数は環境変数CONTAINERD_ADDRESSおよびCONTAINERD_NAMESPACEで指定可能なので、恒常的に使うんだったらこっちで設定したほうが良いかも。 ↩︎

  4. Support the user flag from docker exec in kubectl exec · Issue #30656 · kubernetes/kubernetes ↩︎

Discussion