本指南介绍了如何使用动态预配在 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
以获取最新版本。
- 如需了解限制和要求,请参阅 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
替换以下内容:
CLUSTER_NAME
:集群的名称。PROJECT_ID
:您的 Trusted Cloud by S3NS 项目 ID。LUSTRE_NETWORK
:GKE 集群和 Managed Lustre 实例所在的共享虚拟私有云 (VPC) 网络。LUSTRE_IP_RANGE
:为与 Managed Lustre 进行 VPC 网络对等互连而创建的 IP 地址范围的名称。LUSTRE_FIREWALL_RULE
:防火墙规则的名称,用于允许来自 IP 地址范围的 TCP 流量。ZONE
:GKE 集群的地理可用区,例如us-central1-a
。
设置 VPC 网络
创建 Managed Lustre 实例和 GKE 集群时,您必须指定相同的 VPC 网络。
如需启用服务网络,请运行以下命令:
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
角色。- 前往 Trusted 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 驱动程序。
在新 GKE 集群上启用 Managed Lustre CSI 驱动程序
如需在创建新的 GKE 集群时启用 Managed Lustre CSI 驱动程序,请按照以下步骤操作:
Autopilot
gcloud container clusters create-auto "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=1.33.2-gke.1111000 \
--enable-lustre-csi-driver \
--enable-legacy-lustre-port
Standard
gcloud container clusters create "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=1.33.2-gke.1111000 \
--addons=LustreCsiDriver \
--enable-legacy-lustre-port
指定 enable-legacy-lustre-port
标志后,CSI 驱动程序会将 LNet
(Managed Lustre 内核模块的虚拟网络层)配置为使用端口 6988。此标志是必需的,用于解决 GKE 节点上 gke-metadata-server
的端口冲突问题。
在现有 GKE 集群上启用 Managed Lustre CSI 驱动程序
如需在现有 GKE 集群上启用 Managed Lustre CSI 驱动程序,请使用以下命令:
gcloud container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--enable-legacy-lustre-port
启用 Managed Lustre CSI 驱动程序可能会触发节点重新创建,以便更新 Managed Lustre CSI 客户端所需的内核模块。为了立即可用,我们建议您手动升级节点池。
发布渠道中的 GKE 集群会根据预定发布时间表进行升级,可能需要数周,具体取决于您的维护窗口。如果您使用的是静态 GKE 版本,则需要手动升级节点池。
节点池升级后,CPU 节点在Trusted 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 性能层级。GKE,并且属于以下类型之一:
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: 18000Gi 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 文档中的问题排查页面。
清理
为避免系统向您的 Trusted Cloud by S3NS 账号收取费用,请删除您在本指南中创建的存储资源。
删除 Pod 和 PersistentVolumeClaim。
kubectl delete pod my-pod kubectl delete pvc lustre-pvc
检查 PersistentVolume 状态。
kubectl get pv
输出类似于以下内容:
No resources found
底层 Managed Lustre 实例可能需要几分钟时间才能完全删除。