从私有仓库拉取镜像
浏览 0
扫码
分享
2019-10-27 17:16:54
origin_last_modified:2019-06-06 06:18(#14740) 译文原文 英文原文
版权声明:本文为 码农文档 原创译文,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。
公告:如果您也想加入翻译队伍,或者您有相关中文文档想要贡献给大家,请联系coderdocument@163.com ,谢谢!
这个页面展示了如何创建一个Pod,它使用一个secret从私有Docker reigstry或仓库中拉取镜像。
开始之前
你需要有一个Kubernetes集群,并且必须配置kubectl命令行工具来与集群通信。如果你还没有集群,你可以使用Minikube创建一个集群,或者你可以使用一个Kubernetes游乐场:
要检查版本,请输入kubectl version。
要完成这个练习,你需要Docker ID和密码。
登录Docker
在你的笔记本电脑上,你必须在镜像仓库上进行认证,才能拉取私有镜像:
docker login
当提示时,输入Docker用户名和密码。
登录后会创建或更新config.json,其包含授权令牌。
查看config.json文件:
cat ~/.docker/config.json
其输出包含类似如下部分内容:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
@alert_info@注意:如果你使用Docker凭据store,你将不会看到该auth条目,但是会看到以store名称作为值的 credsStore 条目。
根据已有的Docker凭据创建secret
Kubernetes集群使用docker-registry类型的secret与容器仓库进行认证,以获取私有镜像。
如果你已经运行了 docker login命令,你可以复制其凭据至Kubernetes:
kubectl create secret generic regcred \
--from-file=.dockerconfigjson= \
--type=kubernetes.io/dockerconfigjson
如果需要更多的控制(例如,在新secret上设置命名空间或标签),那么可以在存储secret之前自定义该secret。请确保:
将数据项的名称设置为.dockerconfigjson。
对dockerd文件进行base64编码并粘贴该字符串,完整字符串作为 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 ...,这意味着数据中的base64编码字符串已成功解码,但不能解析为.docker/config.json文件。
根据命令行提供的凭据创建secret
将这个创建的secret命名为 regcred:
kubectl create secret docker-registry regcred --docker-server= --docker-username= --docker-password= --docker-email=
其中:
是你的私有Docker registryFQDN(对于DockerHub是https://index.docker.io/v1/ )
是Docker用户名
是Docker密码
是Docker邮箱
你已经成功地将集群中的Docker凭据设置为一个名为regcred的secret。
@alert_info@注意:在命令行上键入secret可能会将它们存储在不受保护的shell历史记录中,而且在kubectl运行期间,这些secret也可能对PC上的其他用户可见。
检查secret regcred
要了解你刚刚创建的regcred Secret的内容,可以从查看YAML格式的secret开始:
kubectl get secret regcred --output=yaml
输出类似如下:
apiVersion: v1
kind: Secret
metadata:
...
name: regcred
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson
.dockerconfigjson字段的值是Docker凭据的base64编码值。
要理解.dockerconfigjson字段值,请将secret数据转换成可读格式:
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
输出类似如下:
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}
要理解 auth 字段是什么,请将base64编码的数据转换成可读格式:
echo "c3R...zE2" | base64 --decode
输出内容中,户名和密码使用:字符进行连接,类似如下:
janedoe:xxxxxxxxxxx
注意,secret数据包含的授权token类似于本地的~/.docker/config.json 文件。
你已经成功地将Docker凭据设置为集群中名为regcred的secret。
创建pod使用secret
这是一个Pod的配置文件,需要访问你的Docker凭证所在的regcred secret:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image:
imagePullSecrets:
- name: regcred
下载上面的文件:
wget -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
在 my-private-reg-pod.yaml文件中,将 替换为包含镜像的私有registry(仓库)路径,例如:
your.private.registry.example.com/janedoe/jdoe-private:v1
要从私有仓库拉取镜像,Kubernetes需要凭证。配置文件中的imagePullSecrets字段指定Kubernetes应该从名为regcred的secret获取凭据。
创建一个使用secret的Pod,并验证该Pod正在运行:
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
接下来