从私有注册表拉取镜像

此页面展示如何创建一个使用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"
        }
    }
}

基于现有凭据创建 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 设置到集群中。

检查 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 无法启动,状态为 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.

下一步

此页面上的项目引用了第三方产品或项目,这些产品或项目提供了 Kubernetes 所需的功能。Kubernetes 项目作者对这些第三方产品或项目不负责任。有关更多详细信息,请参阅CNCF 网站指南

您应该在建议添加额外第三方链接的更改之前阅读内容指南

上次修改时间:2023 年 12 月 24 日下午 9:00 PST:修复拼写错误 (d536e46dbd)