从私有仓库拉取镜像
本页展示了如何创建一个使用 Secret 从私有容器镜像仓库或存储库拉取镜像的 Pod。目前有许多私有仓库在使用。本任务以 Docker Hub 作为示例仓库。
开始之前
你需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与你的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场
要完成本练习,你需要
docker命令行工具,以及一个 Docker ID,并且知道密码。如果你正在使用不同的私有容器仓库,你需要该仓库的命令行工具以及任何登录信息。
登录 Docker Hub
在你的笔记本电脑上,你必须先向仓库进行身份验证,才能拉取私有镜像。
使用 docker 工具登录 Docker Hub。有关更多信息,请参阅 Docker ID 帐户 的登录部分。
docker login
系统会提示你输入 Docker ID,然后输入你想要使用的凭据(访问令牌或 Docker ID 的密码)。
登录过程会创建或更新一个 config.json 文件,其中包含授权令牌。请查看 Kubernetes 如何解释此文件。
查看 config.json 文件
cat ~/.docker/config.json
输出包含类似于以下的部分
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
说明
如果你使用 Docker 凭据存储,你将看不到该auth 条目,而会看到一个 credsStore 条目,其值为存储的名称。在这种情况下,你可以直接创建一个 Secret。请参阅 通过命令行提供凭据创建 Secret。基于现有凭据创建 Secret
Kubernetes 集群使用 kubernetes.io/dockerconfigjson 类型的 Secret 来验证与容器仓库的身份,以拉取私有镜像。
如果你已经运行了 docker login,你可以将该凭据复制到 Kubernetes
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
如果你需要更多控制权(例如,设置命名空间或新 Secret 上的标签),那么你可以自定义 Secret 之后再存储它。请确保
- 将数据项的名称设置为
.dockerconfigjson - 对 Docker 配置文件进行 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=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
其中
<your-registry-server>是你的私有 Docker 仓库 FQDN。对于 DockerHub,请使用https://index.docker.io/v1/。<your-name>是你的 Docker 用户名。<your-pword>是你的 Docker 密码。<your-email>是你的 Docker 电子邮件。
你已成功将 Docker 凭据设置为集群中的 Secret,名为 regcred。
说明
在命令行中键入 Secret 可能会将其存储在你的 shell 历史记录中,而这些 Secret 可能会在kubectl 运行时对你 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 数据包含与你本地 ~/.docker/config.json 文件类似的授权令牌。
你已成功将 Docker 凭据设置为集群中的 Secret,名为 regcred。
创建一个使用你的 Secret 的 Pod
这是一个需要访问 regcred 中 Docker 凭据的示例 Pod 的清单
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
将上述文件下载到你的计算机
curl -L -o my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
在文件 my-private-reg-pod.yaml 中,将 <your-private-image> 替换为私有仓库中镜像的路径,例如
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
说明
要为 Pod(或 Deployment,或使用 Pod 模板的任何其他对象)使用镜像拉取 Secret,你需要确保适当的 Secret 存在于正确的命名空间中。要使用的命名空间与你定义 Pod 的命名空间相同。此外,如果 Pod 无法启动,状态为 ImagePullBackOff,请查看 Pod 事件
kubectl describe pod private-reg
如果你看到一个事件,其原因设置为 FailedToRetrieveImagePullSecret,则 Kubernetes 找不到名为 (regcred,在本例中) 的 Secret。
确保你指定的 Secret 存在,并且其名称拼写正确。
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
使用来自多个仓库的镜像
一个 Pod 可以有多个容器,每个容器镜像可以来自不同的仓库。你可以使用带有单个 Pod 的多个 imagePullSecrets,并且每个 Secret 可以包含多个凭据。
将尝试使用与仓库匹配的每个凭据拉取镜像。如果没有凭据匹配仓库,则将尝试在不授权或使用自定义运行时特定配置的情况下拉取镜像。
接下来
- 了解更多关于 Secret 的信息
- 或阅读 Secret 的 API 参考
- 了解更多关于 使用私有仓库 的信息。
- 了解更多关于 将镜像拉取 Secret 添加到服务帐户 的信息。
- 请参阅 kubectl create secret docker-registry。
- 请参阅 Pod 的 容器定义 中的
imagePullSecrets字段
此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅 CNCF 网站指南。
在提出添加额外的第三方链接的更改之前,您应该阅读 内容指南。