當我們嘗試從私有倉庫中拉取鏡像時,可能會收到這樣提示: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/