使用 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 命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

设置环境变量

设置以下环境变量:

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 进行连接。

  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. 前往 Google 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 驱动程序。

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 标志,请参阅创建实例中的可选标志说明。

您可以将新集群和现有集群配置为使用默认端口 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 卷的典型过程:

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

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

  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: 9000Gi
      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 文档中的问题排查页面

清理

为避免系统向您的 Google Cloud 账号收取费用,请删除您在本指南中创建的存储资源。

  1. 删除 Pod 和 PersistentVolumeClaim。

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

    kubectl get pv
    

    输出类似于以下内容:

    No resources found
    

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

后续步骤