本指南介绍了如何从 Artifact Registry 拉取映像以部署到 Google Kubernetes Engine。如果您想部署到自托管或第三方 Kubernetes 服务,则必须先配置对 Google Cloud 的身份验证,然后才能从 Artifact Registry 拉取映像。从 Kubernetes 向 Google Cloud 进行身份验证 工作负载,请参阅 使用 Kubernetes 配置工作负载身份联合。
Google Kubernetes Engine 可以直接从 Docker 代码库拉取映像。某些版本预配置了从 Artifact Registry Docker 代码库拉取映像的支持。
使用要求
本部分介绍与 GKE 集成的要求。
权限
在您创建节点池或集群时,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 开始,Linux 节点的默认节点映像是使用 containerd (cos_containerd
) 变体的 Container-Optimized 操作系统,而不是使用 Docker (cos
) 变体的 Container-Optimized 操作系统。
虽然 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
,并显示在日志浏览器的 LOG NAME: "container-runtime"
下。
从公共 Artifact Registry 仓库拉取
将应用部署并映像到包含容器化节点的 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 会为您生成一个。输入密码或在出现提示时将其留空。
使用以下代码生成 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 调试文档。