本指南介绍了如何从 Artifact Registry 拉取映像以部署到 Google Kubernetes Engine。如果您要部署到自托管或第三方 Kubernetes 服务,则必须先配置身份验证,然后才能从 Artifact Registry 拉取 映像。 Google Cloud 如需从外部 Kubernetes 工作负载 Google Cloud向进行身份验证,请参阅 使用 Kubernetes 配置工作负载身份联合。 Google Cloud
Google Kubernetes Engine 可以直接从 Docker 代码库拉取映像。某些版本预配置了从 Artifact Registry Docker 代码库拉取映像的支持。
要求
本部分介绍了与 GKE 集成的要求。
权限
创建节点池或集群时,GKE 会使用以下默认设置:
- Compute Engine 默认服务账号是节点的身份。
-
根据您的组织政策配置,默认服务帐号可能会 自动获得项目的 Editor 角色。我们强烈建议您通过强制执行
iam.automaticIamGrantsForDefaultServiceAccounts组织政策限制条件来停用自动角色授予功能。如果您的组织是在 2024 年 5 月 3 日之后创建的,则默认情况下会强制执行此限制条件。如果您停用自动角色授予功能,则必须决定向默认服务账号授予哪些角色,然后自行授予这些角色。
如果默认服务帐号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。如需安全地修改服务帐号的角色,请使用 Policy Simulator 查看更改的影响,然后 授予和撤消相应的角色。
- 使用默认服务帐号创建的节点具有 Compute Engine 默认访问权限范围,包括 对存储空间的只读访问权限。您无法更改现有节点的访问权限范围。
如果您已停用授予基本 Editor 角色,请
向 Compute Engine 默认服务帐号授予 Artifact Registry Reader 角色
(roles/artifactregistry.reader)。
如果您使用这些默认设置并向 Compute Engine 默认服务帐号授予 Artifact Registry Reader 角色 (roles/artifactregistry.reader),则 GKE 可以从同一 Google Cloud 项目中的 Artifact Registry 代码库拉取映像。如果您需要从节点推送映像、跨项目拉取或推送映像、使用
用户提供的服务帐号,或者有其他默认设置
不支持的需求,请参阅访问权限控制文档
,了解如何配置访问权限。
如果您遇到“permission denied”错误,请参阅 4xx 错误。
GKE 版本
下表列出了创建集群以使其拥有默认权限能够从同一项目的 Docker 代码库中拉取容器所需的最低 GKE 版本。
| 版本 | 必需补丁程序最低版本 |
|---|---|
| 1.14 | 1.14.10-gke.22 |
| 1.15 | 1.15.9-gke.8 |
如果您的 GKE 版本低于最低版本,则您 必须配置 Kubernetes imagePullSecrets,以 使 GKE 能够拉取映像。
如果 GKE 与 Artifact Registry 位于不同的项目中, 请向 GKE 节点使用的 服务帐号授予 Artifact Registry 权限。默认情况下,节点使用 Compute Engine 默认服务账号。
运行映像
您可以使用以下命令在 Google Kubernetes Engine 集群上运行 Artifact Registry 映像:
kubectl run [NAME] --image=LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
其中:
-
LOCATION是代码库的单区域或多区域 位置。 PROJECT是您的 Google Cloud 控制台 项目 ID。 如果您的项目 ID 包含英文冒号 (:),请参阅 网域级项目。REPOSITORY是存储了映像的代码库的名称。IMAGE是代码库中的映像名称。TAG是您要拉取的映像版本的标记。
如需详细了解 Kubernetes 命令,请参阅 kubectl 概览。
排查 containerd 节点映像问题
从 GKE 节点版本 1.19 开始,Linux 节点的默认节点映像
是带有 containerd 的 Container-Optimized OS
(cos_containerd) 变体,而不是带有
Docker (cos) 的 Container-Optimized OS 变体。
虽然 Docker 二进制文件可用于将 containerd 用作运行时的 Linux 节点,但我们不建议使用该文件。Docker 不管理 Kubernetes 在 containerd 节点上运行的容器,因此您无法使用 Docker 命令或 Docker API 查看或与正在运行的 Kubernetes 容器进行交互。
对于 Linux 节点上的调试或问题排查,您可以使用为 Kubernetes 容器运行时构建的可移植命令行工具 crictl 与 containerd 进行交互。crictl 支持查看容器和映像、读取日志以及在容器中执行命令的常用功能。
如需了解详情,请参阅 crictl 用户指南 和有关 containerd 的 GKE 文档。
对于 Windows Server 节点,containerd 守护程序作为名为 containerd 的 Windows 服务运行。日志位于以下日志目录中:
C:\etc\kubernetes\logs\containerd.log,并显示在Logs Explorer
的LOG NAME: "container-runtime"下。
从公共 Artifact Registry 代码库拉取
将映像部署到具有 containerd 节点的 GKE 集群后,您可以使用 SSH 连接到虚拟机实例并运行 crictl 命令进行问题排查。
公共 Artifact Registry 代码库不需要进行身份验证。crictl
也可用于拉取 私有 Artifact Registry 代码库 中的映像。
控制台
在 Google Cloud 控制台中,前往 虚拟机实例 页面。
在虚拟机实例列表中,点击要连接的实例所在行中 SSH 旁边的箭头。

从下拉选项中选择“在浏览器窗口中打开”或您选择的连接方法。
Google Cloud 控制台会打开一个新的终端窗口。使用
crictl从 Artifact Registry 拉取映像:crictl pull IMAGE_LOCATION:TAG
输出如下所示:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
从 Artifact Registry 私有代码库拉取映像时,您必须向该代码库进行身份验证。您可以使用访问令牌来提供凭据。
gcloud
确保您拥有最新版本的 Google Cloud CLI
gcloud components update
连接到虚拟机:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
请替换以下内容:
PROJECT_ID:包含虚拟机的项目 ID。ZONE:虚拟机所在区域的名称VM_NAME:虚拟机的名称
如果您已为 Google Cloud CLI 设置默认属性,则可以在此命令中省略
--project和--zone标志。例如:gcloud compute ssh VM_NAME
如果您尚未创建 SSH 密钥,SSH keygen 将为您生成一个。出现提示时,请输入口令或留空。
使用
crictl从 Artifact Registry 拉取映像:crictl pull IMAGE_LOCATION:TAG
输出如下所示:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
从 Artifact Registry 私有代码库拉取映像时,您必须向该代码库进行身份验证。您可以使用访问令牌来提供凭据。
从私有 Artifact Registry 代码库拉取
控制台
在 Google Cloud 控制台中,前往 虚拟机实例 页面。
在虚拟机实例列表中,点击要连接的实例所在行中 SSH 旁边的箭头。

从下拉选项中选择“在浏览器窗口中打开”。
Google Cloud 控制台会打开一个新的终端窗口。使用
curl生成 Compute Engine 服务帐号访问令牌。curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
输出类似于以下示例:
"access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T sh","expires_in":3526,"token_type":"Bearer"}
从返回的输出中复制
access_token的值(不带引号)。使用
crictl pull --creds和在上一步中复制的access_token值拉取映像。crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG
输出如下所示:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
gcloud
确保您拥有最新版本的 Google Cloud CLI
gcloud components update
连接到虚拟机:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
执行以下变量替换操作:
PROJECT_ID:包含虚拟机的项目 ID。ZONE:虚拟机所在区域的名称VM_NAME:虚拟机的名称
如果您已为 Google Cloud CLI 设置默认属性,则可以在此命令中省略
--project和--zone标志。例如:gcloud compute ssh VM_NAME
如果您尚未创建 SSH 密钥,SSH keygen 将为您生成一个。出现提示时,请输入口令或留空。
使用
curl生成 Compute Engine 服务帐号访问令牌。curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
输出如下所示:
"access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T sh","expires_in":3526,"token_type":"Bearer"}
从返回的输出中复制
access_token的值(不带引号)。使用
crictl pull --creds和在上一步中复制的access_token值拉取映像。crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG
输出如下所示:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
crictl 可让开发者调试其运行时,而无需设置 Kubernetes 组件。如需查看完整的命令列表,请参阅 crictl 文档
和 Kubernetes 调试文档。