k8s のpod の中のファイルをlocal にコピーしてくる方法

TL;DR;

k8s のpod 内にあるファイルは kubectl cp コマンドでローカルにコピーできるよ

何がしたかったか

サーバーにあるファイルをアップロードやダウンロードする場合、よくscp で行うかと思います。 本業の開発では、kubernetes (以下、k8s) を用いて運用しており、 pod に入ってコマンドを叩き、その結果をpod 内のファイルに標準出力した。 このファイルをローカルに引っ張ってくるときに、どうすればいいんだ?と思い、調べました。

kubectl cp

k8sクラスタを操作するにあたり、 kubectl があります。 kubectlk8s クラスタやデプロイされたpod を操作するための印象が強いかと思います。 実際にkubectl のリファレンスを見ても、pod へのアクセスがメインで記述されていることがわかります。

kubernetes.io

しかし、実は kubectl には cp コマンドがあり、コピーするコマンドが用意されています。

kubernetes.io

cp
Copy files and directories to and from containers.

と書かれています。 containers と書いてありますが、pod からファイルをコピーするのに役立ちそうです。

# namespace に展開されているpod 一覧から対象を絞ります
$ kubectl get pods -n <namespace> | grep <pod name>

# cp コマンドでファイルをローカルにコピーします。
$ kubectl cp -n <namespace> <pod name>:/path/to/file /path/to/local/file

でコピーすることができました。