本页面介绍如何在 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
以获取最新版本。
启用 Container File System API。
确保您的集群有权访问磁盘映像,以便在节点中加载。
使用要求
使用辅助启动磁盘时需满足以下要求:
- GKE 1.28.3-gke.106700 版及更高版本中提供该功能。
修改磁盘映像时,您必须创建新的节点池。 您无法更新现有节点上的磁盘映像。
您必须配置映像流式传输才能使用辅助启动磁盘功能。
配置辅助启动磁盘
以下部分介绍如何配置辅助启动磁盘:
预加载数据
在创建 GKE 集群和具有辅助启动磁盘的节点池之前,在构建时间内,建议您在数据就绪时准备磁盘映像,最好是在 CI/CD 流水线中自动执行。
准备包含数据的磁盘映像
通过完成以下步骤创建自定义磁盘映像作为数据源:
创建 GKE 集群和具有辅助启动磁盘的节点池
您可以使用 gcloud CLI 配置辅助启动磁盘:
使用
--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
或更高版本。
使用
--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 会创建一个节点池,其中每个节点都具有一个包含预加载数据的辅助磁盘。此操作会挂接辅助启动磁盘并将其装载到节点上。
(可选)您可以使用 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 流水线中自动执行。
- 创建一个 Cloud Storage 存储桶以存储
gke-disk-image-builder
的执行日志。 使用预加载的容器映像创建磁盘映像。
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/
。
创建启用了映像流式传输的 GKE Standard 集群:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
创建具有辅助启动磁盘的节点池:
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
将
nodeSelector
添加到 Pod 模板:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
确认正在使用辅助启动磁盘缓存:
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 …
后续步骤
- 按照使用映像流式传输拉取容器映像中的说明,根据工作负载的需要流式传输映像数据,从而拉取容器映像。
- 请参阅使用 NCCL Fast Socket 提高工作负载效率,了解如何使用 NVIDIA Collective Communication Library (NCCL) Fast Socket 插件。