從私有倉庫拉取映象

此頁面展示瞭如何建立一個 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 之前對其進行自定義。請確保

  • 將資料項的名稱設定為 .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 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 以 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 可以包含多個憑證。

映象拉取將嘗試使用與倉庫匹配的每個憑證。如果沒有憑證與倉庫匹配,映象拉取將嘗試在沒有授權的情況下或使用自定義執行時特定配置進行。

下一步

本頁面上的內容涉及第三方產品或專案,它們提供了 Kubernetes 所需的功能。Kubernetes 專案作者對這些第三方產品或專案不承擔責任。有關更多詳細資訊,請參閱 CNCF 網站指南

在提議新增額外第三方連結的更改之前,你應該閱讀內容指南

最後修改於 2024 年 11 月 20 日太平洋標準時間凌晨 12:22:澄清映象拉取 Secret 文件 (#48718) (22030b43ef)