部署到 Google Kubernetes Engine

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

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 权限 服务账号。默认情况下,节点使用 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 代码库中的映像。

控制台

  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 --credsaccess_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. 使用以下代码生成 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"}
  5. 从返回的输出中复制 access_token 的值,不带 引号。

  6. 使用 crictl pull --credsaccess_token 值拉取映像 您在上一步中复制的配置文件。

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

    输出如下所示:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

借助 crictl,开发者无需设置即可调试运行时 Kubernetes 组件如需查看完整的命令列表,请参阅 crictl 文档Kubernetes 调试文档