使用 Managed Lustre CSI 驱动程序访问 GKE 上的 Managed Lustre 实例


本指南介绍了如何使用动态预配在 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 以获取最新版本。

设置环境变量

设置以下环境变量:

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 网络。

  1. 如需启用服务网络,请运行以下命令:

    gcloud services enable servicenetworking.googleapis.com \
        --project=${PROJECT_ID}
    
  2. 创建 VPC 网络。将 --mtu 标志设置为 8896 可使性能提升 10%。

    gcloud compute networks create ${NETWORK_NAME} \
        --subnet-mode=auto --project=${PROJECT_ID} \
        --mtu=8896
    
  3. 创建 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}
    
  4. 获取与您在上一步中创建的范围关联的 CIDR 范围。

    CIDR_RANGE=$(
      gcloud compute addresses describe ${IP_RANGE_NAME} \
          --global  \
          --format="value[separator=/](address, prefixLength)" \
          --project=${PROJECT_ID}
    )
    
  5. 创建一条防火墙规则,以允许来自您创建的 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}
    
  6. 如需为项目设置网络对等互连,请验证您是否拥有必要的 IAM 权限,特别是 compute.networkAdminservicenetworking.networksAdmin 角色。

    1. 前往 Trusted Cloud 控制台 > IAM 和管理,然后搜索您的项目所有者主账号。
    2. 点击铅笔图标,然后点击 + 添加其他角色
    3. 选择 Compute Network AdminService Networking Admin
    4. 点击保存
  7. 连接对等互连。

    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 卷的典型过程:

  1. 创建一个 StorageClass
  2. 使用 PersistentVolumeClaim 访问该卷
  3. 创建使用该卷的工作负载

创建一个 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:

  1. 将以下清单保存在名为 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 驱动程序参考文档

  2. 运行以下命令以创建 StorageClass:

    kubectl apply -f lustre-class.yaml
    

使用 PersistentVolumeClaim 访问卷

本部分介绍如何创建引用 Managed Lustre CSI 驱动程序的 StorageClass 的 PersistentVolumeClaim 资源。

  1. 将以下清单保存在名为 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 驱动程序参考文档

  2. 运行以下命令以创建 PersistentVolumeClaim:

    kubectl apply -f lustre-pvc.yaml
    

创建使用该卷的工作负载

本部分展示了如何创建使用您之前创建的 PersistentVolumeClaim 资源的 Pod 的示例。

多个 Pod 可以共享同一 PersistentVolumeClaim 资源。

  1. 将以下清单保存在名为 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
    
  2. 将清单应用于集群。

    kubectl apply -f my-pod.yaml
    
  3. 验证 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 账号收取费用,请删除您在本指南中创建的存储资源。

  1. 删除 Pod 和 PersistentVolumeClaim。

    kubectl delete pod my-pod
    kubectl delete pvc lustre-pvc
    
  2. 检查 PersistentVolume 状态。

    kubectl get pv
    

    输出类似于以下内容:

    No resources found
    

    底层 Managed Lustre 实例可能需要几分钟时间才能完全删除。

后续步骤