我有一個使用 kubeadm(不是 minikube)安裝了 kubernetes 的虛擬機。VM 充當集群的單個節點,洗掉了污點以允許它同時充當主節點和作業節點(如 kubernetes 檔案中所示)。我已經保存、傳輸并加載了我的app:test影像。我可以使用 docker run 輕松地運行容器。當我運行sudo docker images時它會出現。
當我創建一個使用這個鏡像的部署/pod 并指定Image-PullPolicy: IfNotPresent或Never 時,我仍然有ImagePullBackoff錯誤。describe 命令告訴我它試圖從 dockerhub 拉取影像......
請注意,當我嘗試使用因創建另一個 pod而被拉取的本地影像時,ImagePullPolicies 似乎可以正常作業,沒問題。雖然當我運行 sudo docker images --all 時沒有出現影像。
如何在 kubernetes 中為 pod 使用本地映像?有沒有辦法在不使用私有存盤庫的情況下做到這一點?
uj5u.com熱心網友回復:
當我運行 sudo 時影像沒有出現
docker images --all
根據您的評論,您使用的是 K8s v1.22,這意味著您的集群很可能正在使用containerd容器運行時而不是docker(您可以使用 進行檢查kubectl get nodes -o wide,并查看最后一列)。
嘗試列出您的影像crictl images并拉動以crictl pull <image_name>在節點上預加載影像。
uj5u.com熱心網友回復:
如果使用 containerd,可以結合使用 crictl 和 ctr 來做到這一點。
TLDR: 這些步驟,在 crictl github 檔案中也有描述:
1- 在節點(在我的情況下是 VM)上獲得映像后,請確保它位于存檔 (.tar) 中。你可以用docker saveorctr image export命令來做到這一點。
2-sudo ctr -n=k8s.io images import myimage.tar在與存檔鏡像相同的目錄中使用while 將其添加到 kubernetes 用于跟蹤其鏡像的命名空間中的 containerd。它現在應該在您運行時出現sudo crictl images。
按照建議,我嘗試使用 crictl 列出影像,但我的 app:test 沒有出現。但是,嘗試通過 crictl 匯入我的本地影像似乎也不起作用。我使用crictl pull app:test并顯示以下錯誤訊息:
FATA[0000] 拉取鏡像失敗:rpc 錯誤:代碼 = 未知描述 = 無法拉取和解壓鏡像“docker.io/library/app:test”:無法決議參考“docker.io/library/app:test”:拉取訪問被拒絕,存盤庫不存在或可能需要授權:服務器訊息:不足范圍:授權失敗。
但是,當按照這些步驟進行時,我的影像最終在 kubernetes 中被識別為現有的本地影像。它們實際上與 crictl github 檔案中的建議相同
人們如何解釋這一點?影像如何在 kubernetes 集群中“注冊”?為什么不能 crictl 匯入影像?我可能會發布另一個問題來詢問...
uj5u.com熱心網友回復:
你的集群被裝在你的虛擬機內,所以你稱之為本地的對于那個虛擬機中的那個集群來說永遠是遠程的。kubernetes 嘗試拉取這些鏡像的原因是它在 VM 中找不到它們。
Dockerhub 是下載容器的默認位置,但您可以將 kubernetes 設定為從 azure (ACR)、github 包 (GCR) 和您自己的私有服務器的 aws (ECR) 中提取。
你有大約 100 種方法來解決這個問題,但沒有一種是容易的,也不會奏效。
1 - 最簡單的方法,將你的鏡像推送到 Dockerhub 并讓你的集群從中提取。
2 - 設定本地私有容器注冊表并將您的 kubernetes VM 設定為從中提取(請參閱此內容)
3 - 在您的 kubernetes 集群中設定一個私有容器注冊表,并在您的本地環境中設定腳本以推送到它 (見這個)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359004.html
標籤:Kubernetes 容器 云 编排
