本指南介绍如何从 Artifact Registry 拉取映像以部署到 Google Kubernetes Engine如果您要将映像部署到自行托管的 Kubernetes 或第三方 Kubernetes 服务,您必须先向 Google Cloud 配置身份验证,然后才能拉取 Artifact Registry 中的映像从 Kubernetes 向 Google Cloud 进行身份验证 工作负载,请参阅 使用 Kubernetes 配置工作负载身份联合。
Google Kubernetes Engine 可以直接从 Docker 代码库拉取映像。某些版本预配置了从 Artifact Registry Docker 代码库拉取映像的支持。
使用要求
本部分介绍与 GKE 集成的要求。
权限
在您创建节点池或 集群:
- Compute Engine 默认服务账号是节点的身份。
此默认服务账号具有 Artifact Registry Reader 角色
(
roles/artifactregistry.reader
)(如果您有 已停用授予基本 Editor 角色的功能。 - 使用默认服务账号创建的节点具有 Compute Engine 默认访问权限范围,包括 对存储空间的只读权限。您无法更改现有项目的访问权限范围 节点。
如果您使用这些默认设置,GKE 可从以下位置拉取映像: 同一 Google Cloud 项目中的 Artifact Registry 代码库。如果 您需要从节点推送映像、跨项目拉取或推送映像、使用 或有使用默认设置的其他需求 不支持,请参阅访问权限控制文档 了解有关配置访问权限的信息。
如果您遇到“权限遭拒”的错误消息请参阅 权限遭拒错误。
GKE 版本
下表列出了创建集群以使其拥有默认权限能够从同一项目的 Docker 代码库中拉取容器所需的最低 GKE 版本。
版本 | 必需补丁程序最低版本 |
---|---|
1.14 | 1.14.10-gke.22 |
1.15 | 1.15.9-gke.8 |
如果您的 GKE 版本低于最低版本, 必须配置 Kubernetes imagePullSecrets 来 启用 GKE 拉取映像
如果 GKE 与 Artifact Registry 分属不同的项目, 授予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 开始,默认节点映像
是具有 containerd 的 Container-Optimized OS
(cos_containerd
) 变体,而不是 Container-Optimized OS,
Docker (cos
) 变体。
虽然 Docker 二进制文件可以在使用 将 containerd 用作运行时,我们不建议您使用它。Docker 不管理 容器 Kubernetes 在 containerd 节点上运行,因此您无法将其用于 使用 Docker 命令查看正在运行的 Kubernetes 容器或与之交互; Docker API
对于 Linux 节点上的调试或问题排查,您可以使用为 Kubernetes 容器运行时构建的可移植命令行工具 crictl
与 containerd 进行交互。crictl
支持查看容器的常用功能
读取日志以及在容器中执行命令
如需了解详情,请参阅 crictl 用户指南 以及关于 containerd 的 GKE 文档。
对于 Windows Server 节点,containerd 守护程序作为名为 containerd
的 Windows 服务运行。日志位于以下日志目录中:C:\etc\kubernetes\logs\containerd.log
,并显示在日志浏览器的 LOG NAME: "container-runtime"
下。
从公共 Artifact Registry 代码库中拉取
将映像部署到 GKE 集群后
containerd 节点,您可以使用 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 将生成一个 。输入口令或在系统提示时留空。
使用以下代码生成 Compute Engine 服务账号访问令牌
curl
。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 调试文档。