本页面介绍如何使用从注册表镜像(而非从 gcr.io
等公共注册表)中拉取的映像创建和更新集群。您可以在集群生命周期中随时启用或停用此功能。
本页面适用于配置和管理存储性能、用量和费用的运维人员和存储专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
注册表镜像是公共注册表的本地副本,它会复制或镜像公共注册表的文件结构。例如,假设本地注册表镜像的路径为 172.18.0.20:5000
。当 containerd
遇到拉取 gcr.io/kubernetes-e2e-test-images/nautilus:1.0
等映像的请求时,containerd
会尝试从位于以下路径的本地注册表(而非从 gcr.io
)中拉取该映像:172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0
。如果该映像不在此本地注册表路径中,则系统会自动从公共注册表 gcr.io
中拉取该映像。
使用注册表镜像具有以下优势:
- 保护您免受公共注册表服务中断的影响。
- 加速 Pod 创建。
- 使您可以执行自己的漏洞扫描。
- 避免公共注册表对发出命令的频率施加限制。
准备工作
- 您必须在网络中设置容器注册表服务器。
- 如果您的注册表服务器运行专用 TLS 证书,则您必须拥有证书授权机构 (CA) 文件。
- 如果您的注册表服务器需要身份验证,则您必须具有适当的登录凭据或 Docker 配置文件。
- 如需使用注册表镜像,您必须将容器运行时设置为 containerd。
下载 Google Distributed Cloud 的所有必需映像
从下载页面下载最新版本的 bmctl
工具和映像软件包。
将容器映像上传到您的注册表服务器
通过运行以下命令将映像软件包中的映像上传到您的注册表服务器:
[HTTPS_PROXY=http://PROXY_IP:PORT] ./bmctl push images \
--source=./bmpackages_VERSION.tar.xz \
--private-registry=REGISTRY_IP:PORT \
[--cacert=CERT_PATH] \
[--need-credential=false]
替换以下内容:
- 将
PROXY_IP:PORT
替换为代理的 IP 地址和端口(如果您需要使用代理来将映像从工作站上传到注册表服务器)。 - 将
VERSION
替换为从下载页面下载的映像软件包的版本。 - 将
REGISTRY_IP:PORT
替换为私有注册表服务器的 IP 地址和端口。 - 将
CERT_PATH
替换为 CA 证书文件的路径(如果您的注册表服务器使用私有 TLS 证书)。
出现提示时,输入您的用户名和密码,或选择 Docker 配置文件。如果您的注册表服务器不需要凭据,请指定 --need-credential=false
。
如需详细了解 bmctl push images
命令,请运行以下命令:
bmctl push images --help
使用您自己的命名空间
如果您想要在注册表服务器中使用您自己的命名空间(而非根命名空间),则可在 registryMirrors.endpoint
中提供您的私有注册表的 API 端点,以便 containerd
可以从此命名空间执行拉取。端点通常采用 <REGISTRY_IP:PORT>/v2/<NAMESPACE>
格式。请参阅私有注册表用户指南,以了解特定详细信息。
例如,如果您只拥有 172.18.0.20:5000/test-namespace/
的访问权限,则可以使用以下命令上传命名空间 test-namespace
下的所有映像:
./bmctl push images \
--source=./bmpackages_VERSION.tar.xz \
--private-registry=172.18.0.20:5000/test-namespace \
--username=<USERNAME> \
--password=<PASSWORD> \
--cacert <path/to/cert.crt>
然后,在集群配置文件中,添加以下内容,以便 containerd
从该命名空间执行拉取:
registryMirrors:
- endpoint: https://172.18.0.20:5000/v2/test-namespace
将集群配置为使用注册表镜像
您可以在创建集群时或每次更新现有集群时为集群配置注册表镜像。您使用的配置方法取决于集群类型,对于用户集群,还取决于您是创建集群还是更新集群。以下两个部分介绍了配置注册表镜像的两种方法。
在集群配置文件中使用标头部分
借助 Google Distributed Cloud,您可以在集群配置文件的标头部分中指定集群规范之外的注册表镜像:
对于管理员集群、混合集群和独立集群,配置注册表镜像的唯一方法是使用集群配置文件中的标头部分。此方法适用于集群创建或集群更新。
对于用户集群,您只能在创建集群期间使用此方法配置注册表镜像。或者,如需为现有用户集群配置注册表镜像,您可以使用集群规范中的
nodeConfig.registryMirrors
部分。
以下示例集群配置文件指定从端点为 https://172.18.0.20:5000
的本地注册表镜像中拉取映像。以下部分会介绍在此配置文件开头出现的一些字段。
# Sample cluster config with registry mirror:
---
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
sshPrivateKeyPath: /root/ssh-key/id_rsa
registryMirrors:
- endpoint: https://172.18.0.20:5000
caCertPath: /root/ca.crt
pullCredentialConfigPath: /root/.docker/config.json
hosts:
- somehost.io
- otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: admin1
namespace: cluster-admin1
spec:
nodeConfig:
containerRuntime: containerd
...
使用集群规范中的 nodeConfig.registryMirrors
部分
这种创建或更新注册表镜像的方法仅适用于用户集群。由于您可以与用户集群共享为管理集群创建的 Secret,因此您可以使用管理员集群或混合集群中的 nodeConfig.registryMirrors
在用户集群的集群规范中指定注册表镜像。
如需将用户集群配置为使用与管理员集群相同的注册表镜像,请按以下步骤操作:
从管理员集群资源的
nodeConfig.registryMirrors
中获取nodeConfig.registryMirror
部分(包括 Secret 引用):kubectl get CLUSTER_NAME -n CLUSTER_NAMESPACE \ --kubeconfig ADMIN_KUBECONFIG \ -o yaml
替换以下内容:
CLUSTER_NAME
:管理用户集群的管理员集群或混合集群的名称。CLUSTER_NAMESPACE
:管理集群的命名空间名称。ADMIN_KUBECONFIG
:管理集群的 kubeconfig 文件的路径。
将管理员集群中的
nodeConfig.registryMirrors
配置添加到用户集群的集群配置文件中。用户集群配置文件中的
registryMirrors
部分应类似于以下示例:--- gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json sshPrivateKeyPath: /root/ssh-key/id_rsa --- apiVersion: v1 kind: Namespace metadata: name: cluster-user1 --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user1 namespace: cluster-user1 spec: nodeConfig: containerRuntime: containerd registryMirrors: - caCertSecretRef: name: the-secret-created-for-the-admin-cluster namespace: anthos-creds endpoint: https://172.18.0.20:5000 hosts: - somehost.io - otherhost.io pullCredentialSecretRef: name: the-image-pull-creds-created-for-the-admin-cluster namespace: anthos-creds ...
如需对用户集群的注册表镜像配置进行后续更改,请修改用户集群配置文件中的 nodeConfig.registryMirrors
,然后使用 bmctl update
应用更改。
您无法使用集群配置文件的标头部分更新用户集群的仓库镜像配置。
hosts
字段
containerd
会检查集群配置文件的 hosts
部分,以发现具有本地镜像的主机。在示例配置文件中,hosts
部分中列出的公共注册表是 somehost.io
和 otherhost.io
。由于这些公共注册表显示在 hosts
部分中,因此 containerd
在遇到来自 somehost.io
或 otherhost.io
的映像拉取请求时,会先检查私有注册表镜像。
例如,假设 containerd
收到针对 somehost.io/kubernetes-e2e-test-images/nautilus:1.0
的拉取命令。由于 somehost.io
在集群配置文件的 hosts
部分中被列作主机之一,因此 containerd
会在本地注册表镜像中查找 kubernetes-e2e-test-images/nautilus:1.0
映像。如果 somehost.io
未在 hosts
部分中列出,则 containerd
不知道存在 somehost.io
的本地镜像。在这种情况下,containerd
不会检查映像的镜像,而是从 somehost.io
公共注册表中拉取映像。
请注意,默认情况下,Google Distributed Cloud 会自动镜像 gcr.io
中的映像,因此您无需在 hosts
部分中将 gcr.io
列为主机。
gcrKeyPath
字段
如果您希望 Google Distributed Cloud 自动使用 Container Registry (gcr.io
) 拉取本地注册表中未显示的映像,则必须指定 Container Registry 服务账号密钥的路径。Google Distributed Cloud 没有为其他公共注册表提供密钥的机制。
如果您不打算使用在本地注册表中未显示映像时从 gcr.io
中拉取映像的功能,则无需将 gcrKeyPath
添加到集群配置文件。
caCertPath
字段
如果您的仓库需要私有传输层安全协议 (TLS) 证书,则此字段会使用服务器根 CA 证书文件的路径。此证书文件应位于管理员工作站上,即运行 bmctl
命令的机器。如果您的仓库不需要私有 TLS 证书,则可以将 caCertPath
字段留空。
pullCredentialConfigPath
字段
如果您的注册表服务器不需要身份验证 Docker 配置文件,则可以将 pullCredentialConfigPath
字段留空。 请注意,这是运行 bmctl
命令的机器上的配置文件的路径。
将注册表镜像与用户集群搭配使用
如果管理员集群已配置为自动从注册表镜像中拉取映像,则用户集群不会自动从注册表镜像中拉取映像。如需让用户集群从注册表镜像中拉取映像,您需要按照将集群配置为使用注册表镜像中的说明单独配置用户集群。
更新注册表镜像端点、证书和拉取凭据
如需更新注册表镜像端点、证书或拉取凭据,请执行以下操作:
在集群配置文件中,更新端点、CA 证书文件和拉取凭据配置文件路径。
通过运行以下命令来应用更改:
bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
替换以下内容:
将
CLUSTER_NAME
替换为要更新的集群的名称。将
ADMIN_KUBECONFIG
替换为管理员集群配置文件的路径。
验证映像是否是从注册表镜像中拉取的
可以通过检查 config.toml
文件的内容来确定 containerd
是否从本地注册表拉取映像,如以下步骤所示:
登录节点并检查以下文件的内容:
/etc/containerd/config.toml
检查
config.toml
文件的plugins."io.containerd.grpc.v1.cri".registry.mirrors
部分,查看您的注册表服务器是否列在endpoint
字段中。以下摘录自示例config.toml
文件,其中endpoint
字段以粗体显示: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"] ...
如果您的注册表镜像显示在
endpoint
字段中,则该节点会从注册表镜像中拉取映像,而不是从公共注册表中拉取映像。