從私有登錄檔拉取映像檔

此頁面說明如何建立一個 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"
        }
    }
}

根據現有憑證建立 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。

檢查 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 啟動失敗且狀態為 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,並且每個都可以包含多個憑證。

將嘗試使用與映像檔儲存庫匹配的每個憑證來提取映像檔。如果沒有憑證與映像檔儲存庫匹配,將嘗試在沒有授權或使用自訂執行階段特定組態的情況下提取映像檔。

接下來

此頁面上的項目參考了提供 Kubernetes 所需功能的協力廠商產品或專案。Kubernetes 專案作者不對這些協力廠商產品或專案負責。有關更多詳細資訊,請參閱 CNCF 網站指南

在提出新增額外協力廠商連結的變更之前,您應該閱讀內容指南

上次修改時間為太平洋標準時間 2024 年 11 月 20 日 00:22:Clarify image pull secret documentation (#48718) (22030b43ef)