使用辅助启动磁盘预加载数据或容器映像


本页面介绍如何在 Google Kubernetes Engine (GKE) 中使用辅助启动磁盘缩短工作负载启动延迟时间。借助辅助启动磁盘,您可以在新节点上预加载数据或容器映像。这使工作负载能够实现快速冷启动,并提高预配资源的整体利用率。

概览

从 1.28.3-gke.1067000 版开始,您可以使用辅助启动磁盘配置节点池。您可以指示 GKE 预配这些节点并为其预加载数据,例如机器学习模型或容器映像。对于工作负载,使用辅助磁盘中的预加载数据或容器映像具有以下优势:

  • 更快的自动扩缩
  • 缩短了拉取大型映像时的延迟时间
  • 更快地从中断(例如维护事件和系统错误)中恢复

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

使用要求

使用辅助启动磁盘时需满足以下要求:

  1. GKE 1.28.3-gke.106700 版及更高版本中提供该功能。
  2. 修改磁盘映像时,您必须创建新的节点池。 您无法更新现有节点上的磁盘映像。

  3. 您必须配置映像流式传输才能使用辅助启动磁盘功能。

配置辅助启动磁盘

以下部分介绍如何配置辅助启动磁盘:

预加载数据

在创建 GKE 集群和具有辅助启动磁盘的节点池之前,在构建时间内,建议您在数据就绪时准备磁盘映像,最好是在 CI/CD 流水线中自动执行。

准备包含数据的磁盘映像

通过完成以下步骤创建自定义磁盘映像作为数据源:

  1. 创建具有空白磁盘的虚拟机
  2. 通过 SSH 连接到虚拟机
    1. 装载空白磁盘
    2. 将数据下载到空白磁盘上
  3. 通过该磁盘创建自定义映像

创建 GKE 集群和具有辅助启动磁盘的节点池

您可以使用 gcloud CLI 配置辅助启动磁盘:

  1. 使用 --enable-image-streaming 标志创建启用了映像流式传输的 GKE Standard 集群:

    gcloud container clusters create CLUSTER_NAME \
        --location LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • LOCATION集群位置
    • CLUSTER-VERSION:要使用的 GKE 版本。必须为 1.28.3-gke.106700 或更高版本。
  2. 使用 --secondary-boot-disk=disk-image 标志创建具有辅助启动磁盘的节点池:

    gcloud beta container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION \
        --enable-image-streaming \
        --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
    

    DISK_IMAGE_NAME 替换为您的磁盘映像名称。

    GKE 会创建一个节点池,其中每个节点都具有一个包含预加载数据的辅助磁盘。此操作会挂接辅助启动磁盘并将其装载到节点上。

  3. (可选)您可以使用 hostPath 卷装载将辅助磁盘映像装载到 Pod 容器中。使用以下清单可定义 Pod 资源,并使用 hostPath 卷装载在容器中预加载数据磁盘:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      ...
      volumeMounts:
      - mountPath: /usr/local/data_path_sbd
        name: data_path_sbd
    ...
    volumes:
      - name: data_path_sbd
        hostPath:
            path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
    

    DISK_IMAGE_NAME 替换为您的磁盘映像名称。

预加载容器映像

在本指南中,您将使用 gke-disk-image-builder 创建虚拟机实例并拉取磁盘上的容器映像。gke-disk-image-builder 通过该磁盘创建磁盘映像。我们建议您在容器映像构建步骤之后立即准备磁盘映像,最好在 CI/CD 流水线中自动执行。

  1. 创建一个 Cloud Storage 存储桶以存储 gke-disk-image-builder 的执行日志。
  2. 使用预加载的容器映像创建磁盘映像。

    go run ./cli \
        --project-name=PROJECT_ID \
        --image-name=DISK_IMAGE_NAME \
        --zone=LOCATION \
        --gcs-path=gs://LOG_BUCKET_NAME \
        --disk-size-gb=10 \
        --container-image=docker.io/library/python:latest \
        --container-image=docker.io/library/nginx:latest
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的名称。
    • DISK_IMAGE_NAME:磁盘映像的名称。例如:nginx-python-image
    • LOCATION集群位置
    • LOG_BUCKET_NAME:用于存储执行日志的 Cloud Storage 存储桶的名称。例如 gke-secondary-disk-image-logs/

  3. 创建启用了映像流式传输的 GKE Standard 集群:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    
  4. 创建具有辅助启动磁盘的节点池:

    gcloud beta container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \ \
    --enable-image-streaming \
    --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    
  5. nodeSelector 添加到 Pod 模板:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  6. 确认正在使用辅助启动磁盘缓存:

    kubectl get events --all-namespaces
    

    输出类似于以下内容:

    75s         Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm   Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    

    无论映像大小如何,缓存的容器映像的预期映像拉取延迟时间都不应超过几秒钟。您可以通过运行以下命令来检查映像拉取延迟时间:

    kubectl describe pod POD_NAME
    

    POD_NAME 替换为 Pod 的名称。

    输出类似于以下内容:

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

后续步骤