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

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

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 鏡像。json

1. 登陸Dockerapi

爲了拉取一個私有鏡像,首先,須要進行身份認證app

docker login 

這個登陸過程會建立或更新一個config.json文件來維護一個受權tokenjsonp

cat ~/.docker/config.json 

輸出多是這樣的:ui

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

若是你使用的是Docker憑證(憑據)存儲,那麼將不會看到那個認證條目,而是看到一個以該存儲的名稱做爲值的credsStore條目。編碼

例如:spa

2. 基於已經存在的Docker憑據建立一個Secret命令行

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

若是你已經執行了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/ 

相關文章
相關標籤/搜索