在 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
,如果你只需要找回一些檔案。
舉報/反饋