从私有仓库拉取镜像
本页介绍了如何创建使用 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
条目,其值为存储的名称。在这种情况下,你可以直接创建密钥。请参阅通过在命令行上提供凭据来创建密钥。基于现有凭据创建密钥
Kubernetes 集群使用 kubernetes.io/dockerconfigjson
类型的密钥对容器仓库进行身份验证,以拉取私有镜像。
如果已经运行了 docker login
,则可以将该凭据复制到 Kubernetes 中
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
如果你需要更多控制(例如,在新密钥上设置命名空间或标签),那么你可以在存储之前自定义该密钥。 请务必
- 将数据项的名称设置为
.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
文件。
通过在命令行上提供凭据来创建密钥
创建此密钥,命名为 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 凭据成功设置为名为 regcred
的密钥。
注意
在命令行上键入密钥可能会将它们以不受保护的方式存储在你的 shell 历史记录中,并且在kubectl
运行时,其他用户也可能会在你的 PC 上看到这些密钥。检查密钥 regcred
要了解你创建的 regcred
密钥的内容,请先以 YAML 格式查看该密钥
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
字段中的内容,请将密钥数据转换为可读的格式
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
输出类似于以下内容
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"[email protected]","auth":"c3R...zE2"}}}
要了解 auth
字段中的内容,请将 base64 编码的数据转换为可读的格式
echo "c3R...zE2" | base64 --decode
输出(用户名和密码与 :
连接)类似于以下内容
janedoe:xxxxxxxxxxx
请注意,密钥数据包含类似于你的本地 ~/.docker/config.json
文件的授权令牌。
你已在集群中将你的 Docker 凭据成功设置为名为 regcred
的密钥。
创建一个使用你的密钥的 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
的密钥获取凭据。
创建一个使用你的密钥的 Pod,并验证该 Pod 是否正在运行
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
注意
要对 Pod(或 Deployment 或其他具有你正在使用的 Pod 模板的对象)使用镜像拉取密钥,你需要确保在正确的命名空间中确实存在相应的密钥。要使用的命名空间是你在其中定义 Pod 的同一命名空间。此外,如果 Pod 未能以状态 ImagePullBackOff
启动,请查看 Pod 事件
kubectl describe pod private-reg
如果看到原因设置为 FailedToRetrieveImagePullSecret
的事件,则 Kubernetes 找不到名为(在此示例中为 regcred
)的密钥。
确保你指定的密钥存在,并且其名称拼写正确。
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
使用来自多个仓库的镜像
一个 Pod 可以有多个容器,每个容器镜像可以来自不同的仓库。你可以将多个 imagePullSecrets
与一个 Pod 一起使用,每个 imagePullSecrets
可以包含多个凭据。
将尝试使用与仓库匹配的每个凭据来拉取镜像。 如果没有凭据与仓库匹配,将尝试在没有授权的情况下或使用自定义运行时特定配置来拉取镜像。
下一步是什么
- 了解有关密钥的更多信息
- 或阅读 Secret 的 API 参考
- 了解有关使用私有仓库的更多信息。
- 了解有关将镜像拉取密钥添加到服务帐户的更多信息。
- 请参阅kubectl create secret docker-registry。
- 请参阅 Pod 的容器定义中的
imagePullSecrets
字段
此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对此类第三方产品或项目负责。有关更多详细信息,请参阅CNCF 网站指南。
在提出添加额外的第三方链接的更改之前,你应该阅读内容指南。