當咱們嘗試從私有倉庫中拉取鏡像時,可能會收到這樣提示: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>
在這裏:
不出意外的話,你已經成功的再集羣中設置了你的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/