Kubernetes從私有鏡像倉庫中拉取鏡像


當我們嘗試從私有倉庫中拉取鏡像時,可能會收到這樣提示:requested access to the resource is denied

Error response from daemon: pull access denied for xxx repository does not exist or may require 'docker login': denied: requested access to the resource is denied 

這是由於訪問私有倉庫時是需要憑證的。接下來,一起看下如何用Secret創建一個Pod來從一個私有的Docker Registry 或  Repository 中 Pull 鏡像。

1. 登錄Docker

為了拉取一個私有鏡像,首先,需要進行身份認證

docker login 

這個登錄過程會創建或更新一個config.json文件來維護一個授權token

cat ~/.docker/config.json 

輸出可能是這樣的:

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

如果你使用的是Docker憑證(憑據)存儲,那么將不會看到那個認證條目,而是看到一個以該存儲的名稱作為值的credsStore條目。

例如:

2. 基於已經存在的Docker憑據創建一個Secret

Kubernetes集群使用docker-registry類型的Secret來進行一個容器registry的認證,以獲取一個私有鏡像。 

如果你已經執行了docker login,那么你可以把這個憑證復制到Kubernetes

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

3. 通過在命令行中提供憑據來創建一個Secret

創建一個Secret,並將其命名為myregcred

kubectl create secret docker-registry myregcred \
     --docker-server=<your-registry-server> \
     --docker-username=<your-name> \
     --docker-password=<your-password> \
     --docker-email=<your-email> 

在這里:

  • <your-registry-server> is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub)
  • <your-name> is your Docker username.
  • <your-pword> is your Docker password.
  • <your-email> is your Docker email.

不出意外的話,你已經成功的再集群中設置了你的Docker憑據作為一個Secret,名字叫myregcred

4. 查看Secret

kubectl get secret myregcred --output=yaml

.dockerconfigjson 字段的值是一個經過base64編碼后的你的Docker憑據

為了更好地理解.dockerconfigjson 字段,我們將它格式化一下:

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

輸出可能是這樣的:

{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"Y2hlb...29tOmt"}}} 

為了更好地理解上面輸出的auth字段,我們可以這樣:

echo "Y2hlb...29tOmt" | base64 --decode 

輸出的字符串格式為 username:password,例如:

janedoe:1234

不難看出,Secret數據中包含的授權token字符串與~/.docker/config.json文件中的相似 

5. 用你的Secret創建一個Pod

下面是一個Pod的配置文件private-reg-pod.yaml ,這個Pod將要使用你的Docker憑據myregcred

 apiVersion: v1
 kind: Pod
 metadata:
   name: private-reg
 spec:
   containers:
   - name: private-reg-container
     image: <your-private-image>
   imagePullSecrets:
   - name: myregcred

將文件my-private-reg-pod.yaml中的<your-private-image>替換成你自己的私有registry,例如:

 your.private.registry.example.com/janedoe/jdoe-private:v1

為了從registry中拉取鏡像,Kubernetes需要憑證。配置文件中的imagePullSecrets字段指明Kubernetes應該從名為myregcred的Secret中獲取憑證。 

用你的Secret創建一個Pod,並驗證它

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

6. 文檔

https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM