從私有登錄檔拉取映像檔
此頁面說明如何建立一個 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 之前自訂 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 ...
的錯誤訊息,這表示 data 中的 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 映像檔儲存庫 FQDN。DockerHub 請使用https://index.docker.io/v1/
。<your-name>
是您的 Docker 使用者名稱。<your-pword>
是您的 Docker 密碼。<your-email>
是您的 Docker 電子郵件。
您已在叢集中成功將您的 Docker 憑證設定為名為 regcred
的 Secret。
注意
在命令列上輸入密碼可能會將它們以未受保護的方式儲存在您的 shell 歷史記錄中,並且在kubectl
執行期間,這些密碼也可能對您 PC 上的其他使用者可見。檢查 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 的 manifest,它需要存取 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 確實存在於正確的命名空間中。要使用的命名空間與您定義 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
,並且每個都可以包含多個憑證。
將嘗試使用與映像檔儲存庫匹配的每個憑證來提取映像檔。如果沒有憑證與映像檔儲存庫匹配,將嘗試在沒有授權或使用自訂執行階段特定組態的情況下提取映像檔。
接下來
- 深入了解 Secrets
- 或閱讀 Secret 的 API 參考文件
- 深入了解 使用私有映像檔儲存庫。
- 深入了解 將映像檔提取密鑰新增至服務帳戶。
- 請參閱 kubectl create secret docker-registry。
- 請參閱 Pod 的 容器定義中的
imagePullSecrets
欄位
此頁面上的項目參考了提供 Kubernetes 所需功能的協力廠商產品或專案。Kubernetes 專案作者不對這些協力廠商產品或專案負責。有關更多詳細資訊,請參閱 CNCF 網站指南。
在提出新增額外協力廠商連結的變更之前,您應該閱讀內容指南。