GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Kubernetesポッドとマシン間でファイルをコピーする方法

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 いくつかのファイルを取得するだけでよい場合。


Docker
  1. SFTPプロトコルを使用してローカルマシンとリモートマシン間でファイルを転送する方法

  2. SCPとSFTPを使用してLinuxホスト間でファイルを安全にコピーする方法

  3. Ubuntu と Mac OS X の間でファイルを共有する方法

  1. LinuxとFreeDOSの間でファイルをコピーする

  2. Androidシェルでファイルをコピーして編集するには?

  3. ファイルを検索してコピーする

  1. Linuxでファイルとディレクトリをコピーする方法

  2. Kubernetesポッドを再起動する方法

  3. Linuxでファイルとディレクトリをコピーする方法