配置私有容器注册表

本页面介绍了如何为 Google Distributed Cloud for VMware(纯软件)配置现有的容器注册表服务器。

本页面适用于设置、监控和管理技术基础架构的管理员、架构师和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

概览

默认情况下,在创建或升级集群期间,Google Distributed Cloud 会使用组件访问服务账号gcr.io/gke-on-prem-release 拉取系统映像。或者,您可以提供自己的容器注册表服务器,以便改为从您的私有注册表服务器拉取系统映像。

Google Distributed Cloud 不支持不安全的容器注册表。启动容器注册表服务器时,您必须提供证书和密钥。证书可由公共证书授权机构 (CA) 签名,也可以自签名。

创建容器注册表服务器

如需了解如何创建容器注册表服务器,请参阅 Docker 文档中的运行可外部访问的注册表

配置注册表

如需使用私有容器注册表,您可以使用 gkectl 命令行工具或 Terraform。

gkectl

  1. 在创建集群之前,将 privateRegistry 部分添加到管理员集群配置文件。

    填写此部分时:

    • 在创建或升级集群之前运行 gkectl prepare 命令时,该命令会从管理员集群配置文件的 bundlePath 字段中指定的 tar 文件中提取映像,并将映像推送到您的私有注册表服务器。

    • 在创建或升级集群期间,系统会从您的私有注册表服务器中拉取系统映像。

  2. 如果您的网络由代理服务器提供支持,请填写 proxy 部分。

Terraform

  1. 按照创建管理员集群的 Terraform 标签页中的步骤填写管理员集群配置文件。

  2. 将以下部分添加到管理员集群配置文件中:

    private_registry_config {
      address = "ADDRESS"
      ca_cert = "CA_CERT"
    }
    

    替换以下内容:

    • ADDRESS:运行您的私有注册表的机器的 IP 地址或 FQDN(完全限定域名)。

    • CA_CERT:私有注册表的 CA 证书公钥。

  3. 如果您的网络由代理服务器提供支持,请添加以下内容:

    proxy {
      url: "PROXY_SERVER_ADDRESS"
      no_proxy: "BYPASS_LIST"
    }
    

    替换以下内容:

    • PROXY_SERVER_ADDRESS:代理服务器的 HTTP 地址。即使端口号与该方案的默认端口相同,也要填写此端口号。

    • BYPASS_LIST:不应通过代理服务器的 IP 地址、IP 地址范围、主机名和域名的列表(以英文逗号分隔)。

    示例:

    url: "http://my-proxy.example.local:80"
    no_proxy: "192.0.2.0/24,my-host.example.local,198.51.100.0"
    

    当 Google Distributed Cloud 向这些地址、主机或网域之一发送请求时,该请求会绕过代理服务器,直接发送到目标。

  4. 继续执行创建管理员集群的 Terraform 标签页中的步骤,以验证 Terraform 配置文件和方案,然后创建引导集群。

  5. 运行 gkectl register bootstrap 命令时,gkectl 会提示您输入私有注册表的用户名和密码。

在创建集群期间,系统会从您的私有注册表服务器拉取系统映像。

高级集群和完整软件包的限制

Google Distributed Cloud 有两种软件包可供选择:完整和常规。如需确定哪个软件包位于管理员工作站上,请检查管理员集群配置文件中的 bundlePath 字段。如果文件名以 -full 结尾,则表示完整软件包位于管理员工作站上。如果文件名不以 -full 结尾,则表示常规软件包位于管理员工作站上。

如果您使用 gkeadm 命令创建了管理员工作站,则该命令会创建包含完整软件包的管理员工作站虚拟机,并在管理员集群配置文件中配置 bundlePath 字段。

如果启用了高级集群,则将完整软件包与私有注册表搭配使用时会受到以下限制:

  • 版本 1.31:私有注册表不支持完整软件包。如需在高级集群上使用私有注册表,请执行以下操作:

    1. 将常规大小的软件包下载到管理员工作站。
    2. 更新管理员集群配置文件的 bundlePath 字段中的文件名。
  • 版本 1.32:支持使用完整软件包,但 gkectl prepare 命令会从 gcr.io/gke-on-prem-release(而非 tar 文件)拉取映像。不过,该命令会将映像推送到您的私有注册表,以便在创建或升级集群期间从您的私有注册表中拉取系统映像。

常规集群与高级集群之间的区别

与标准集群相比,高级集群引入了以下几项主要差异:

  • 使用私有注册表时,映像似乎是从 gcr.io 拉取的,而不是从私有注册表的主机名拉取的。即使映像实际上是从您的私有注册表服务器拉取的,此更改也是预期行为。
  • 映像拉取操作使用连接到私有注册表的每台机器上 /etc/containerd/config.toml 文件中的凭证,而不是集群内 private-registry-creds Secret 中的凭证。
  • 对于所有 gcr.io 映像,集群会先尝试从私有注册表中拉取。如果私有注册表中没有该映像,系统会通过互联网从 gcr.io 中拉取该映像。如需停止此回退,请设置 noProxy 或使用防火墙规则来阻止 gcr.io 流量。

如需检查映像是否从正确的来源拉取,请参阅验证映像是否是从您的注册表服务器中拉取的

验证映像是否是从您的注册表服务器中拉取的

验证是否从注册表服务器中拉取映像的方式取决于是否已启用高级集群。

  • 如果未启用高级集群,请运行以下命令:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods \
        --all-namespaces -o jsonpath="{.items[*].spec['initContainers', 'containers'][*].image}"
    

    ADMIN_CLUSTER_KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。

    此命令的输出将显示集群中的所有映像。您可以验证所有 Google Distributed Cloud 映像是否均来自您自己的注册表服务器。

  • 如果已启用高级集群,请执行以下步骤:

    可以通过检查名为 config.toml 的文件的内容来确定 containerd 是否从本地注册表拉取映像,如以下步骤所示:

    1. 登录节点并检查以下 /etc/containerd/config.toml 文件的内容。
    2. 检查 config.toml 文件的 plugins."io.containerd.grpc.v1.cri".registry.mirrors 字段,查看您的注册表服务器是否列在 endpoint 字段中。

      以下代码摘自示例 config.toml 文件。

      version = 2
      root = "/var/lib/containerd"
      state = "/run/containerd"
      ...
      [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."gcr.io"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."privateregistry2.io".tls]
      ca_file = '/etc/containerd/certs.d/privateregistry2.io/ca.crt'
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
      endpoint = ["http://privateregistry.io", "http://privateregistry2.io"]
      ...
      
    3. 如果您的注册表镜像显示在 endpoint 字段中,则节点会从注册表镜像中拉取映像,而不是从 Artifact Registry 中拉取映像。