Kubernetes 從私有倉庫拉取鏡像

2022-06-10 11:20 更新

從私有倉庫拉取鏡像

本文介紹如何使用 Secret 從私有的鏡像倉庫或代碼倉庫拉取鏡像來創(chuàng)建 Pod。 有很多私有鏡像倉庫正在使用中。這個任務使用的鏡像倉庫是 Docker Hub

在開始之前

  • 你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構建:
  • 要進行此練習,你需要 ?docker ?命令行工具和一個知道密碼的 Docker ID。
  • 如果你要使用不同的私有的鏡像倉庫,你需要有對應鏡像倉庫的命令行工具和登錄信息。

登錄 Docker 鏡像倉庫 

在個人電腦上,要想拉取私有鏡像必須在鏡像倉庫上進行身份驗證。

docker login

當出現(xiàn)提示時,輸入你的 Docker ID 和登錄憑證(訪問令牌、 或 Docker ID 的密碼)。

登錄過程會創(chuàng)建或更新保存有授權令牌的 ?config.json? 文件。

查看 ?config.json? 文件:

cat ~/.docker/config.json

輸出結果包含類似于以下內(nèi)容的部分:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "c3R...zE2"
        }
    }
}

Note: 如果使用 Docker 憑證倉庫,則不會看到 ?auth ?條目,看到的將是以倉庫名稱作為值的 ?credsStore ?條目。

創(chuàng)建一個基于現(xiàn)有憑證的 Secret 

Kubernetes 集群使用 ?kubernetes.io/dockerconfigjson? 類型的 Secret 來通過鏡像倉庫的身份驗證,進而提取私有鏡像。

如果你已經(jīng)運行了 ?docker login? 命令,你可以復制該鏡像倉庫的憑證到 Kubernetes:

kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

如果你需要更多的設置(例如,為新 Secret 設置名字空間或標簽), 則可以在存儲 Secret 之前對它進行自定義。 請務必:

  • 將 data 項中的名稱設置為 ?.dockerconfigjson ?
  • 使用 base64 編碼方法對 Docker 配置文件進行編碼,然后粘貼該字符串的內(nèi)容,作為字段 ?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 ...? 的錯誤消息,則表示數(shù)據(jù)中的 base64 編碼字符串已成功解碼,但無法解析為 ?.docker/config.json? 文件。

在命令行上提供憑證來創(chuàng)建 Secret 

創(chuàng)建 Secret,命名為 ?regcred?:

kubectl create secret docker-registry regcred \
  --docker-server=<你的鏡像倉庫服務器> \
  --docker-username=<你的用戶名> \
  --docker-password=<你的密碼> \
  --docker-email=<你的郵箱地址>

在這里:

  • ?<your-registry-server>? 是你的私有 Docker 倉庫全限定域名(FQDN)。 DockerHub 使用 ?https://index.docker.io/v1/?。
  • ?<your-name> ?是你的 Docker 用戶名。
  • ?<your-pword> ?是你的 Docker 密碼。
  • ?<your-email>? 是你的 Docker 郵箱。

這樣你就成功地將集群中的 Docker 憑證設置為名為 ?regcred ?的 Secret。

Note: 在命令行上鍵入 Secret 可能會將它們存儲在你的 shell 歷史記錄中而不受保護, 并且這些 Secret 信息也可能在 ?kubectl ?運行期間對你 PC 上的其他用戶可見。

檢查 Secret regcred 

要了解你創(chuàng)建的 ?regcred ?Secret 的內(nèi)容,可以用 YAML 格式進行查看:

kubectl get secret regcred --output=yaml

輸出和下面類似:

apiVersion: v1
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
kind: Secret
metadata:
  ...
  name: regcred
  ...
type: kubernetes.io/dockerconfigjson

?.dockerconfigjson? 字段的值是 Docker 憑證的 base64 表示。

要了解 ?dockerconfigjson ?字段中的內(nèi)容,請將 Secret 數(shù)據(jù)轉(zhuǎn)換為可讀格式:

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

輸出和下面類似:

{"auths":{"yourprivateregistry.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}

要了解 ?auth ?字段中的內(nèi)容,請將 base64 編碼過的數(shù)據(jù)轉(zhuǎn)換為可讀格式:

echo "c3R...zE2" | base64 --decode

輸出結果中,用戶名和密碼用 ?:? 鏈接,類似下面這樣:

janedoe:xxxxxxxxxxx

注意,Secret 數(shù)據(jù)包含與本地 ?~/.docker/config.json? 文件類似的授權令牌。

這樣你就已經(jīng)成功地將 Docker 憑證設置為集群中的名為 ?regcred ?的 Secret。

創(chuàng)建一個使用你的 Secret 的 Pod 

下面是一個 Pod 配置清單示例,該示例中 Pod 需要訪問你的 Docker 憑證 ?regcred?:

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>?,例如:

janedoe/jdoe-private:v1

要從私有倉庫拉取鏡像,Kubernetes 需要憑證。 配置文件中的 ?imagePullSecrets ?字段表明 Kubernetes 應該通過名為 ?regcred ?的 Secret 獲取憑證。

創(chuàng)建使用了你的 Secret 的 Pod,并檢查它是否正常運行:

kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號