從私有倉庫拉取映象
此頁面展示瞭如何建立一個 Pod,該 Pod 使用 Secret 從私有容器映象倉庫中拉取映象。有許多私有倉庫正在使用。本任務以 Docker Hub 作為示例倉庫。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議你在至少有兩個非控制平面主機的節點組成的叢集上執行本教程。如果你還沒有叢集,你可以使用 minikube 建立一個,或者你可以使用這些 Kubernetes 操場中的一個
要完成此練習,你需要
docker
命令列工具,以及你知道密碼的 Docker ID。如果你使用的是其他私有容器映象倉庫,則需要該倉庫的命令列工具以及任何登入資訊。
登入 Docker Hub
在你的筆記型電腦上,你必須向倉庫進行身份驗證才能拉取私有映象。
使用 docker
工具登入 Docker Hub。有關更多資訊,請參閱 Docker ID 賬戶 的“登入”部分。
docker login
出現提示時,輸入你的 Docker ID,然後輸入你要使用的憑據(訪問令牌,或你的 Docker ID 密碼)。
登入過程會建立或更新一個包含授權令牌的 config.json
檔案。請檢視 Kubernetes 如何解釋此檔案。
檢視 config.json
檔案
cat ~/.docker/config.json
輸出包含與此類似的部分
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
注意
如果你使用 Docker 憑證儲存,你將不會看到auth
條目,而是看到一個 credsStore
條目,其值為儲存的名稱。在這種情況下,你可以直接建立 Secret。請參閱透過在命令列提供憑證來建立 Secret。基於現有憑證建立 Secret
Kubernetes 叢集使用 kubernetes.io/dockerconfigjson
型別的 Secret 來向容器倉庫進行身份驗證,以拉取私有映象。
如果你已經運行了 docker login
,你可以將該憑證複製到 Kubernetes
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
如果你需要更多控制(例如,為新的 Secret 設定名稱空間或標籤),那麼你可以在儲存 Secret 之前對其進行自定義。請確保
- 將資料項的名稱設定為
.dockerconfigjson
- 對 Docker 配置檔案進行 base64 編碼,然後將該字串作為欄位
data[".dockerconfigjson"]
的值貼上,不得中斷 - 將
type
設定為kubernetes.io/dockerconfigjson
示例
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
如果你收到錯誤訊息 error: no objects passed to create
,則可能意味著 base64 編碼的字串無效。如果你收到類似 Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...
的錯誤訊息,則意味著資料中 base64 編碼的字串已成功解碼,但無法解析為 .docker/config.json
檔案。
透過在命令列提供憑證來建立 Secret
建立此 Secret,命名為 regcred
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
其中
<your-registry-server>
是你的私有 Docker 倉庫的完全限定域名。對於 DockerHub,請使用https://index.docker.io/v1/
。<your-name>
是你的 Docker 使用者名稱。<your-pword>
是你的 Docker 密碼。<your-email>
是你的 Docker 電子郵件。
你已成功將你的 Docker 憑證設定為名為 regcred
的 Secret。
注意
在命令列上輸入 Secret 可能會以未受保護的方式將它們儲存在你的 shell 歷史記錄中,並且在kubectl
執行時,這些 Secret 也可能對你電腦上的其他使用者可見。檢查 Secret regcred
要了解你建立的 regcred
Secret 的內容,首先以 YAML 格式檢視 Secret
kubectl get secret regcred --output=yaml
輸出類似於:
apiVersion: v1
kind: Secret
metadata:
...
name: regcred
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson
.dockerconfigjson
欄位的值是你的 Docker 憑證的 base64 表示。
要了解 .dockerconfigjson
欄位中的內容,請將 Secret 資料轉換為可讀格式
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
輸出類似於:
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}
要了解 auth
欄位中的內容,請將 base64 編碼的資料轉換為可讀格式
echo "c3R...zE2" | base64 --decode
輸出是使用者名稱和密碼用 :
連線而成,類似於
janedoe:xxxxxxxxxxx
請注意,Secret 資料包含與你本地 ~/.docker/config.json
檔案類似的授權令牌。
你已成功將你的 Docker 憑證設定為名為 regcred
的 Secret。
建立使用你的 Secret 的 Pod
這是一個示例 Pod 的清單,它需要訪問 regcred
中的 Docker 憑證
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
將上述檔案下載到你的電腦上
curl -L -o my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
在檔案 my-private-reg-pod.yaml
中,將 <your-private-image>
替換為私有倉庫中映象的路徑,例如
your.private.registry.example.com/janedoe/jdoe-private:v1
為了從私有倉庫拉取映象,Kubernetes 需要憑證。配置檔案中的 imagePullSecrets
欄位指定 Kubernetes 應從名為 regcred
的 Secret 中獲取憑證。
建立使用你的 Secret 的 Pod,並驗證 Pod 是否正在執行
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
注意
要為 Pod(或 Deployment,或其他使用 Pod 模板的物件)使用映象拉取 Secret,你需要確保相應的 Secret 存在於正確的名稱空間中。要使用的名稱空間與你定義 Pod 的名稱空間相同。此外,如果 Pod 以 ImagePullBackOff
狀態啟動失敗,請檢視 Pod 事件
kubectl describe pod private-reg
如果你看到事件的原因設定為 FailedToRetrieveImagePullSecret
,則表示 Kubernetes 找不到名稱為 regcred
的 Secret(在此示例中)。
確保你指定的 Secret 存在,並且其名稱拼寫正確。
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
使用來自多個倉庫的映象
一個 Pod 可以有多個容器,每個容器映象可以來自不同的倉庫。你可以為 Pod 使用多個 imagePullSecrets
,每個 Secret 可以包含多個憑證。
映象拉取將嘗試使用與倉庫匹配的每個憑證。如果沒有憑證與倉庫匹配,映象拉取將嘗試在沒有授權的情況下或使用自定義執行時特定配置進行。
下一步
- 瞭解有關 Secrets 的更多資訊
- 或者閱讀 Secret 的 API 參考
- 瞭解有關 使用私有倉庫 的更多資訊。
- 瞭解有關 向服務賬戶新增映象拉取 Secret 的更多資訊。
- 請參閱 kubectl create secret docker-registry。
- 請參閱 Pod 容器定義 中的
imagePullSecrets
欄位
本頁面上的內容涉及第三方產品或專案,它們提供了 Kubernetes 所需的功能。Kubernetes 專案作者對這些第三方產品或專案不承擔責任。有關更多詳細資訊,請參閱 CNCF 網站指南。
在提議新增額外第三方連結的更改之前,你應該閱讀內容指南。