本指南介绍了如何使用动态预配在 GKE 中创建由 Managed Lustre CSI 驱动程序支持的新 Kubernetes 卷。借助 Managed Lustre CSI 驱动程序,您可以按需创建由 Managed Lustre 实例提供支持的存储,并将其作为有状态工作负载的卷进行访问。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Cloud Managed Lustre API 和 Google Kubernetes Engine API。 启用 API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 如需了解限制和要求,请参阅 CSI 驱动程序概览。
- 请务必启用 Managed Lustre CSI 驱动程序。在 Standard 和 Autopilot 集群中,此功能默认处于停用状态。
设置环境变量
设置以下环境变量:
export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION
替换以下内容:
CLUSTER_NAME
:集群的名称。PROJECT_ID
:您的 Google Cloud 项目 ID。LUSTRE_NETWORK
:GKE 集群和 Managed Lustre 实例所在的共享虚拟私有云 (VPC) 网络。LUSTRE_IP_RANGE
:为与 Managed Lustre 进行 VPC 网络对等互连而创建的 IP 地址范围的名称。LUSTRE_FIREWALL_RULE
:防火墙规则的名称,用于允许来自 IP 地址范围的 TCP 流量。ZONE
:GKE 集群的地理可用区,例如us-central1-a
。CLUSTER_VERSION
:GKE 集群版本。
设置 VPC 网络
创建 Managed Lustre 实例和 GKE 集群时,您必须指定相同的 VPC 网络;如果使用对等互连的 VPC 网络,则必须通过 Network Connectivity Center 进行连接。
如需启用服务网络,请运行以下命令:
gcloud services enable servicenetworking.googleapis.com \ --project=${PROJECT_ID}
创建 VPC 网络。将
--mtu
标志设置为8896
可使性能提升 10%。gcloud compute networks create ${NETWORK_NAME} \ --subnet-mode=auto --project=${PROJECT_ID} \ --mtu=8896
创建 IP 地址范围。
gcloud compute addresses create ${IP_RANGE_NAME} \ --global \ --purpose=VPC_PEERING \ --prefix-length=20 \ --description="Managed Lustre VPC Peering" \ --network=${NETWORK_NAME} \ --project=${PROJECT_ID}
获取与您在上一步中创建的范围关联的 CIDR 范围。
CIDR_RANGE=$( gcloud compute addresses describe ${IP_RANGE_NAME} \ --global \ --format="value[separator=/](address, prefixLength)" \ --project=${PROJECT_ID} )
创建一条防火墙规则,以允许来自您创建的 IP 地址范围的 TCP 流量。
gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \ --allow=tcp:988,tcp:6988 \ --network=${NETWORK_NAME} \ --source-ranges=${CIDR_RANGE} \ --project=${PROJECT_ID}
如需为项目设置网络对等互连,请验证您是否拥有必要的 IAM 权限,特别是
compute.networkAdmin
或servicenetworking.networksAdmin
角色。- 前往 Google Cloud 控制台 > IAM 和管理,然后搜索您的项目所有者主账号。
- 点击铅笔图标,然后点击 + 添加其他角色。
- 选择 Compute Network Admin 或 Service Networking Admin。
- 点击保存。
连接对等互连。
gcloud services vpc-peerings connect \ --network=${NETWORK_NAME} \ --project=${PROJECT_ID} \ --ranges=${IP_RANGE_NAME} \ --service=servicenetworking.googleapis.com
配置 Managed Lustre CSI 驱动程序
本部分介绍了如何视需要启用和停用 Managed Lustre CSI 驱动程序。
Lustre 通信端口
GKE Managed Lustre CSI 驱动程序使用不同的端口与 Managed Lustre 实例进行通信,具体取决于您的 GKE 集群版本和现有的 Managed Lustre 配置。
默认端口(推荐):对于运行
1.33.2-gke.4780000
版或更高版本的新 GKE 集群,驱动程序默认使用端口988
进行 Lustre 通信。旧版端口:在以下情况下,通过将
--enable-legacy-lustre-port
标志附加到gcloud
命令来使用端口6988
:- 早期 GKE 版本:如果您的 GKE 集群运行的版本低于
1.33.2-gke.4780000
,则--enable-legacy-lustre-port
标志可解决 GKE 节点上gke-metadata-server
的端口冲突问题。 - 现有 Lustre 实例:如果您要连接到使用
gke-support-enabled
标志创建的现有 Managed Lustre 实例,则无论集群版本如何,都必须在gcloud
命令中添加--enable-legacy-lustre-port
。如果没有此标志,您的 GKE 集群将无法挂载现有的 Lustre 实例。如需了解gke-support-enabled
标志,请参阅创建实例中的可选标志说明。
- 早期 GKE 版本:如果您的 GKE 集群运行的版本低于
您可以将新集群和现有集群配置为使用默认端口 988
或旧版端口 6988
。
在新 GKE 集群上启用 Managed Lustre CSI 驱动程序
以下部分介绍了如何在新的 GKE 集群上启用 Managed Lustre CSI 驱动程序。
使用默认端口 988
如需在创建运行 1.33.2-gke.4780000
版或更高版本的新 GKE 集群时启用 Managed Lustre CSI 驱动程序,请运行以下命令:
Autopilot
gcloud container clusters create-auto "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--enable-lustre-csi-driver
Standard
gcloud container clusters create "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--addons=LustreCsiDriver
使用旧版端口 6988
如需在创建运行低于 1.33.2-gke.4780000
版本的新的 GKE 集群时启用 Managed Lustre CSI 驱动程序,请运行以下命令:
Autopilot
gcloud container clusters create-auto "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--enable-lustre-csi-driver \
--enable-legacy-lustre-port
Standard
gcloud container clusters create "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--addons=LustreCsiDriver \
--enable-legacy-lustre-port
在现有 GKE 集群上启用 Managed Lustre CSI 驱动程序
以下部分介绍了如何在现有 GKE 集群上启用 Managed Lustre CSI 驱动程序。
使用默认端口 988
如需在运行 1.33.2-gke.4780000
版或更高版本的现有 GKE 集群上启用 Managed Lustre CSI 驱动程序,请运行以下命令:
gcloud container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--update-addons=LustreCsiDriver=ENABLED
使用旧版端口 6988
如需在现有 GKE 集群上启用 Managed Lustre CSI 驱动程序,您可能需要通过添加 --enable-legacy-lustre-port
标志来使用旧版端口 6988
。在以下情况下,此标志是必需的:
- 如果您的 GKE 集群运行的版本低于
1.33.2-gke.4780000
。 如果您打算将此集群连接到使用
gke-support-enabled
标志创建的现有 Managed Lustre 实例。gcloud container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-legacy-lustre-port
现有集群需要进行节点升级
在现有集群上启用 Managed Lustre CSI 驱动程序可能会触发节点重新创建,以便更新 Managed Lustre CSI 客户端所需的内核模块。为了立即可用,我们建议您手动升级节点池。
发布渠道中的 GKE 集群会根据预定发布时间表进行升级,可能需要数周,具体取决于您的维护窗口。如果您使用的是静态 GKE 版本,则需要手动升级节点池。
节点池升级后,CPU 节点在Google Cloud 控制台或 CLI 输出中可能显示为使用 GPU 映像。例如:
config:
imageType: COS_CONTAINERD
nodeImageConfig:
image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda
这是预期行为。 GPU 映像正在 CPU 节点上重复使用,以安全地安装 Managed Lustre 内核模块。您无需为 GPU 使用付费。
停用 Managed Lustre CSI 驱动程序
您可以使用 Google Cloud CLI 在现有 GKE 集群上停用 Managed Lustre CSI 驱动程序。
gcloud container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--update-addons=LustreCsiDriver=DISABLED
停用 CSI 驱动程序后,GKE 会自动重新创建节点并卸载 Managed Lustre 内核模块。
使用 Managed Lustre CSI 驱动程序创建新卷
以下几个部分介绍了在 GKE 中创建由 Managed Lustre 实例支持的 Kubernetes 卷的典型过程:
创建一个 StorageClass
启用 Managed Lustre CSI 驱动程序后,GKE 会自动创建一个 StorageClass,以便预配 Managed Lustre 实例。StorageClass 取决于 Managed Lustre 性能层级,可以是以下值之一:
lustre-rwx-125mbps-per-tib
lustre-rwx-250mbps-per-tib
lustre-rwx-500mbps-per-tib
lustre-rwx-1000mbps-per-tib
GKE 为每个受支持的 Managed Lustre 性能层级提供默认的 StorageClass。这样一来,您就可以使用内置的 StorageClass,而无需定义自己的 StorageClass,从而简化了对 Managed Lustre 实例的动态预配。
对于可用区级集群,CSI 驱动程序会在与集群相同的可用区中预配 Managed Lustre 实例。对于区域级集群,它会在相应区域内的某个可用区中预配实例。
以下示例展示了如何创建具有特定拓扑要求的自定义 StorageClass:
将以下清单保存在名为
lustre-class.yaml
的文件中:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: lustre-class provisioner: lustre.csi.storage.gke.io volumeBindingMode: Immediate reclaimPolicy: Delete parameters: perUnitStorageThroughput: "1000" network: LUSTRE_NETWORK allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - us-central1-a
如需查看 StorageClass 中支持的字段的完整列表,请参阅 Managed Lustre CSI 驱动程序参考文档。
运行以下命令以创建 StorageClass:
kubectl apply -f lustre-class.yaml
使用 PersistentVolumeClaim 访问卷
本部分介绍如何创建引用 Managed Lustre CSI 驱动程序的 StorageClass 的 PersistentVolumeClaim 资源。
将以下清单保存在名为
lustre-pvc.yaml
的文件中:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: lustre-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 9000Gi storageClassName: lustre-class
如需查看 PersistentVolumeClaim 中支持的字段的完整列表,请参阅 Managed Lustre CSI 驱动程序参考文档。
运行以下命令以创建 PersistentVolumeClaim:
kubectl apply -f lustre-pvc.yaml
创建使用该卷的工作负载
本部分展示了如何创建使用您之前创建的 PersistentVolumeClaim 资源的 Pod 的示例。
多个 Pod 可以共享同一 PersistentVolumeClaim 资源。
将以下清单保存在名为
my-pod.yaml
的文件中。apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx volumeMounts: - name: lustre-volume mountPath: /data volumes: - name: lustre-volume persistentVolumeClaim: claimName: lustre-pvc
将清单应用于集群。
kubectl apply -f my-pod.yaml
验证 Pod 是否正在运行。Pod 在 PersistentVolumeClaim 预配后运行。此操作可能需要几分钟才能完成。
kubectl get pods
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE my-pod 1/1 Running 0 11s
将 fsGroup 与 Managed Lustre 卷搭配使用
您可以更改已装载文件系统的根级目录的群组所有权,以匹配 Pod 的 SecurityContext 中指定的用户请求的 fsGroup。fsGroup 不会以递归方式更改整个已装载的 Managed Lustre 文件系统的所有权,只会影响装载点的根目录。
问题排查
如需获取问题排查指导,请参阅 Managed Lustre 文档中的问题排查页面。
清理
为避免系统向您的 Google Cloud 账号收取费用,请删除您在本指南中创建的存储资源。
删除 Pod 和 PersistentVolumeClaim。
kubectl delete pod my-pod kubectl delete pvc lustre-pvc
检查 PersistentVolume 状态。
kubectl get pv
输出类似于以下内容:
No resources found
底层 Managed Lustre 实例可能需要几分钟时间才能完全删除。