部署到 Google Kubernetes Engine

本指南介绍如何从 Artifact Registry 中拉取映像以部署到 Google Kubernetes Engine。如果要部署到自托管或第三方 Kubernetes 服务,您必须先配置对 Google Cloud 的身份验证,然后再从 Artifact Registry 中拉取映像。如需从 Google Cloud 外部的 Kubernetes 工作负载向 Google Cloud 进行身份验证,请参阅使用 Kubernetes 配置 Workload Identity Federation

Google Kubernetes Engine 可以直接从 Docker 代码库拉取映像。某些版本预配置了从 Artifact Registry Docker 代码库拉取映像的支持。

使用要求

本部分介绍与 GKE 集成的要求。

权限

创建节点池或集群时,GKE 使用以下默认值:

如果您使用这些默认值,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 权限授予 GKE 节点使用的服务帐号。默认情况下,节点使用 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 OS,而不是带有 Docker (cos) 变体的 Container-Optimized OS。

虽然 Docker 二进制文件可以在使用 containerd 作为运行时的 Linux 节点上使用,但不建议使用。Docker 不管理 Kubernetes 在 containerd 节点上运行的容器,因此您无法通过 Docker 命令或 Docker API 通过 Docker 命令查看正在运行的 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 代码库拉取

将映像部署到具有 containerd 节点的 GKE 集群后,您可以使用 SSH 连接到虚拟机实例,并运行 crictl 命令进行问题排查。

公共 Artifact Registry 代码库不需要身份验证。crictl 还可用于在私有 Artifact Registry 代码库中拉取映像。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,找到要连接的实例,然后点击其所在行中 SSH 旁边的箭头。

    实例名称旁边的 SSH 按钮。

  3. 从下拉选项中选择“在浏览器窗口中打开”,或从下拉选项中选择您选择的连接方法。

  4. Google Cloud 控制台会打开一个新的终端窗口。使用 crictl 从 Artifact Registry 中拉取映像:

    crictl pull IMAGE_LOCATION:TAG
    

    输出如下所示:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    从 Artifact Registry 私有代码库拉取映像时,您必须向该代码库进行身份验证。您可以使用访问令牌来提供凭据。

gcloud

  1. 确保您拥有最新版本的 Google Cloud CLI

    gcloud components update
    
  2. 连接到虚拟机:

    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
    
  3. 如果您尚未创建 SSH 密钥,SSH keygen 将为您生成一个。在系统提示时,输入口令或留空。

  4. 使用 crictl 从 Artifact Registry 中拉取映像:

    crictl pull IMAGE_LOCATION:TAG
    
  5. 输出如下所示:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    从 Artifact Registry 私有代码库拉取映像时,您必须向该代码库进行身份验证。您可以使用访问令牌来提供凭据。

从私有 Artifact Registry 代码库拉取

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,找到要连接的实例,然后点击其所在行中 SSH 旁边的箭头。

    实例名称旁边的 SSH 按钮。

  3. 从下拉选项中选择“在浏览器窗口中打开”。

  4. 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"}
  5. 从返回的输出中复制 access_token 的值(不带引号)。

  6. 使用 crictl pull --creds 和上一步中复制的 access_token 值拉取映像。

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    输出如下所示:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

gcloud

  1. 确保您拥有最新版本的 Google Cloud CLI

    gcloud components update
    
  2. 连接到虚拟机:

    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
    
  3. 如果您尚未创建 SSH 密钥,SSH keygen 将为您生成一个。在系统提示时,输入口令或留空。

  4. 使用 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"}
  5. 从返回的输出中复制 access_token 的值(不带引号)。

  6. 使用 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 调试文档