Kubernetesポッドで実行されているコンテナは、手動で操作する必要のない自己完結型のコンピューティングユニットであることが意図されています。ただし、問題をデバッグしていて、コンテナに保存されているログ、構成ファイル、またはキャッシュをアーカイブしたい場合などは、ポッドのファイルシステムとの間でファイルをコピーする必要がある場合があります。
Kubectlの組み込みの転送機能または手動の代替機能を使用して、マシンとポッド内のコンテナ間でファイルを移動する方法は次のとおりです。
kubectl cp
コマンドは、コンテナファイルシステムとの間でコピーする最も簡単な方法です。 docker cp
と同様に機能します すでにローカルコンテナ開発に精通しているかもしれません。
kubectl cp
ソース引数と宛先引数が必要です。ソースまたは宛先の1つはポッド参照である必要があります。これはポッド名としてフォーマットされ、その後にコロンとコンテナ内のファイルシステムパスが続きます。
kubectl cp example-pod:/tmp/example-dir ./example-dir
この例では、 / tmp / example-dir
の内容をコピーします example-pod
から example-dir
へ ローカルファイルシステム上。引数を逆にすると、マシンの example-dir
がコピーされます ポッドに戻ります。
1つのポッドで複数のコンテナを保持できるため、 cp
を使用する場合はこの点に注意することが重要です。 。 Kubernetesは、デフォルトでポッド内の最初のコンテナインスタンスとの間でコピーを行います。 -c
を追加することで、代わりに特定のコンテナをターゲットにすることができます フラグ:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
他のすべてのkubectl
と同様に コマンド、 cp
KUBECONFIG
で定義されたクラスター接続に対して実行されます 環境変数。これはデフォルトで〜/ .kube / conf
。
名前付きポッドを参照する場合、2つのオプションがあります。標準の-namespaceexample-namespace
を追加することができます ファイルシステム参照でフラグを立てるか、完全なポッドパスを使用します:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
ファイル属性はデフォルトで保持されます。 -no-preserve
を追加します cp
にフラグを立てます 宛先に残されたコピーされたファイルから所有権と権限のデータを取り除くコマンド。通常のUnixcp
とは異なり 、Kubectlの実装は常に再帰的であるため、ディレクトリを参照するとその内容も含まれます。
KubectlCpが機能しない場合
kubectl cp
大きな注意点が1つあります。内部的には、 tar
の単純なラッパーです。 。このコマンドは、ソースパスを圧縮し、アーカイブを宛先にコピーしてから、そのコンテンツを抽出します。コンテナイメージにはtar
が含まれている必要があります これが機能するためのパスにバイナリがあります。
これは、 kubectl cp
を意味します Dockerのベストプラクティスに従って画像を小さく保つ場合、常にオプションになるとは限りません。 alpine
などの人気のある最小限の塩基ですが tar
を含めてください 、すべての画像に表示されるとは限らず、最初から組み立てる場合は表示されません。
tar
の使用 kubectl cp
も制限します コピーできます。シンボリックリンクを解決したり、 /tmp/*.log
のようなワイルドカードを使用したりすることはできません 。この機能が必要な場合は、別のアプローチを使用する必要があります。
1つのオプションは、 kubectl exec
を組み合わせることです。 、 cat
コマンド、およびシェルリダイレクトを使用して、ファイルのコンテンツをクラスターからローカルファイルにストリーミングします。
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
kubectl exec
コマンドはポッドでシェルセッションを開始します。 -
以降のすべて コンテナ内で実行されます。 cat
の呼び出しの出力 ファイル上のファイルは端末に送信され、ローカルファイルにリダイレクトできます。
この手法は、少数の比較的小さなファイルをコピーする場合に適しています。大きなディレクトリを取得する必要がある場合は、すぐに面倒になります。残念ながら、コンテナにソフトウェアを追加しない限り、これ以上の選択肢はありません。
大胆に感じている場合は、SSHをコンテナにインストールして、 scp
を使用できます。 ホストからファイルシステムにアクセスします。これにより、追加のデーモンを実行し、潜在的なセキュリティ問題を作成することを犠牲にして、完全なコピーエクスペリエンスを提供できます。適切に保護されたクラスターでのみ検討する必要があります。
tar
を追加する コンテナイメージに追加する方がはるかに安全なオプションです。これにより、 kubectl cp
を使用できます kubectl exec
を介してより高度な手動コピーのロックを解除します 追加の機能が必要な場合。 cp
で制限に遭遇した場合 構文、 tar
を呼び出します kubectl exec
を介して直接 コマンドにフラグを追加するには:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
これはtar-cF
を実行します コンテナ内で結果をtarxf
にパイプします ローカルマシンでの抽出コマンド。 -コード>
tar
に指示します 標準の入力ストリームを介して供給されたデータを抽出します。 -C
宛先ディレクトリを指定するために使用されます。
kubectl cp
コマンドを使用すると、Kubernetesポッドとマシン間でファイルをコピーできます。どちらの方向にも機能しますが、ポッドからポッドにファイルを移動するために使用することはできません。それを行う必要がある場合は、最初にポッドAからマシンにコピーし、次にポッドBにコピーするという2段階の手順を使用するのが最善です。
cp
として tar
に依存しています 内部では、コンテナイメージにそれが含まれていることを確認する必要があります。 そのようなファイルやディレクトリのtarはありません
が表示されます cp
を実行しようとするとエラーが発生します tar
のないポッドに対して 。この状況では、 tar
を追加します コンテナに追加するか、 kubectl exec
の組み合わせを使用します およびcat
いくつかのファイルを取得するだけでよい場合。