从私有注册表拉取镜像
此页面展示如何创建一个使用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>
其中
<您的仓库服务器>
是您的私有 Docker 仓库 FQDN。对于 DockerHub,请使用https://index.docker.io/v1/
。<您的用户名>
是您的 Docker 用户名。<您的密码>
是您的 Docker 密码。<您的电子邮件>
是您的 Docker 电子邮件。
您已成功将您的 Docker 凭据作为名为 regcred
的 Secret 设置到集群中。
注意
在命令行中键入密码可能会将它们存储在您的 shell 历史记录中而没有保护,并且这些密码在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":"[email protected]","auth":"c3R...zE2"}}}
要了解 auth
字段中的内容,请将 base64 编码的数据转换为可读格式
echo "c3R...zE2" | base64 --decode
输出(用户名和密码用 :
连接)类似于以下内容
janedoe:xxxxxxxxxxx
请注意,Secret 数据包含类似于您本地 ~/.docker/config.json
文件的授权令牌。
您已成功将您的 Docker 凭据作为名为 regcred
的 Secret 设置到集群中。
创建一个使用您的 Secret 的 Pod
以下是一个示例 Pod 的清单,该 Pod 需要访问 regcred
中的 Docker 凭据
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.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(或部署,或其他具有您使用的 Pod 模板的对象)使用镜像拉取 Secret,您需要确保相应的 Secret 存在于正确的命名空间中。要使用的命名空间与您定义 Pod 的命名空间相同。此外,如果 Pod 无法启动,状态为 ImagePullBackOff
,请查看 Pod 事件
kubectl describe pod private-reg
如果您看到一个原因设置为 FailedToRetrieveImagePullSecret
的事件,则表示 Kubernetes 找不到名为(在本例中为 regcred
)的 Secret。如果您指定 Pod 需要镜像拉取凭据,则 kubelet 会在尝试拉取镜像之前检查它是否可以访问该 Secret。
确保您指定的 Secret 存在,并且其名称拼写正确。
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
下一步
- 详细了解Secret
- 或阅读Secret的 API 参考
- 详细了解使用私有仓库。
- 详细了解向服务帐户添加镜像拉取 Secret。
- 请参阅kubectl create secret docker-registry。
- 请参阅 Pod 的容器定义中的
imagePullSecrets
字段
此页面上的项目引用了第三方产品或项目,这些产品或项目提供了 Kubernetes 所需的功能。Kubernetes 项目作者对这些第三方产品或项目不负责任。有关更多详细信息,请参阅CNCF 网站指南。
您应该在建议添加额外第三方链接的更改之前阅读内容指南。