愛伊米

如何在 Kubernetes Pod 和您的機器之間複製檔案

如何在 Kubernetes Pod 和您的機器之間複製檔案

在 Kubernetes Pod 中執行的容器是不需要手動互動的獨立計算單元。

有時您可能需要將檔案複製到 Pod 的檔案系統或從 Pod 的檔案系統複製檔案,這可能是因為您正在除錯問題並希望存檔儲存在容器中的日誌、配置檔案或快取。

以下是如何使用 Kubectl 的內建傳輸功能或手動替代方法在您的機器和 Pod 中的容器之間移動檔案。

影印到您的機器或從您的機器影印

kubectl cp

命令

是複製到容器檔案系統或從容器檔案系統複製的最簡單方法。

它的工作原理與

docker cp

您可能已經在本地容器開發中熟悉的

類似

kubectl cp

需要源和目標引數。

源或目標之一必須是 Pod 引用。

這被格式化為 Pod 名稱,後跟一個冒號和容器內檔案系統路徑。

kubectl cp example-pod:/tmp/example-dir 。/example-dir

此示例將

/tmp/example-dir

from

的內容複製

example-pod

example-dir

本地檔案系統上。

反轉引數會將您的機器複製

example-dir

回 Pod。

命令引數

由於單個 Pod 可以容納多個容器,因此在使用

cp

Kubernetes 將預設複製到或從 Pod 中的第一個容器例項。

您可以透過新增

-c

標誌

來定位特定容器

kubectl cp example-pod:/tmp/example-dir 。/example-dir -c second-container

像所有其他的kubectl命令,cp有違透過定義群連線你的KUBECONFIG環境變數。這預設為~/。kube/conf。

引用名稱空間 Pod 時有兩個選項。

您可以

——namespace example-namespace

在檔案系統參考中

新增標準

標誌或使用完整的 Pod 路徑:

kubectl cp example-namespace/example-pod:/tmp/example-dir 。/example-dir

預設情況下保留檔案屬性。

——no-preserve

標誌

新增

到您的

cp

命令以從留在目的地的複製檔案中去除所有權和許可權資料。

與常規 Unix 不同

cp

,Kubectl 的實現始終是遞迴的,因此引用目錄也將包含其內容。

當 Kubectl Cp 不起作用時

kubectl cp

有一個很大的警告:在內部,它是一個簡單的

tar

該命令將壓縮源路徑,將存檔複製到目標,然後提取其內容。

您的容器映像必須

tar

在其路徑中

包含

二進位制檔案才能使其正常工作。

這意味著

kubectl cp

當您遵循 Docker 最佳實踐來

保持映象較小

時,

可能並不總是一種選擇

儘管流行的最小基礎(例如

alpine

do include)

tar

,它可能不會出現在每個影象中,並且如果您

從頭開始

組裝它們,則不會出現

使用

tar

也限制了

kubectl cp

可以複製的內容。

您無法解析符號連結或使用諸如

/tmp/*。log

當需要此功能時,您將不得不使用不同的方法。

一種選擇是將

kubectl exec

cat

命令和 shell 重定向

結合起來

,將

檔案的內容從叢集中流式傳輸到本地檔案中:

kubectl exec \ ——namespace 示例-namespace \ example-pod -c 第二個容器 \ —— cat /tmp/example-file > 本地檔案

kubectl exec

命令

在 Pod 中啟動一個 shell 會話。

之後的所有內容都在

——

容器內執行。

呼叫

cat

檔案

的輸出

將傳送到您的終端,在那裡它可以重定向到本地檔案。

當您複製少量相對較小的檔案時,此技術適用。

如果您需要檢索一個大目錄,它很快就會變得乏味。

不幸的是,如果不向容器中新增額外的軟體,就沒有更好的選擇。

如果你感覺大膽,你可以

在你的容器安裝SSH

使用

scp

,以

從您的主機訪問它的檔案系統。

這將為您提供完整的複製體驗,但代價是執行額外的守護程式併產生潛在的安全問題。

它應該只在受到適當保護的叢集上考慮。

新增

tar

到您的容器映像是一個更安全的選擇。

這使您可以

在需要額外功能時

使用

kubectl cp

和解鎖更高階的手動複製

kubectl exec

如果遇到

cp

語法

限制

,請

tar

直接

呼叫

via

kubectl exec

向命令新增額外的標誌:

kubectl exec \ ——namespace 示例-namespace \ example-pod -c 第二個容器 \ —— tar -cf /tmp/example-dir | tar xf - -C 。/extracted-dir

tar -cF

在您的容器內

執行

,並將結果透過管道傳輸到

tar xf

本地機器上

提取命令。

-

指示

tar

來提取透過標準輸入流饋送到它的資料。

-C

用於指定目標目錄。

概括

kubectl cp

命令允許您在 Kubernetes Pod 和您的機器之間複製檔案。

它適用於任一方向,但不能用於將檔案從 Pod 移動到 Pod。

如果您需要這樣做,最好使用兩階段程式,首先從 Pod A 複製到您的機器,然後再複製到 Pod B。

由於

cp

依賴於

tar

後臺,您需要確保您的容器映像包含它。

你會看到一個

No such file or directory tar

錯誤,如果你嘗試執行

cp

對抗吊艙沒有

tar

在這種情況下,無論是新增

tar

到容器或使用的組合

kubectl exec

cat

,如果你只需要找回一些檔案。

舉報/反饋