使用 Filestore CSI 驱动程序访问 Filestore 实例


Filestore CSI 驱动程序是将 Filestore 实例与 Google Kubernetes Engine (GKE) 搭配使用的主要方式。Filestore CSI 驱动程序提供全代管式体验,由开源 Google Cloud Filestore CSI 驱动程序提供支持。

Filestore CSI 驱动程序版本与 Kubernetes 次要版本号相关联。Filestore CSI 驱动程序版本通常是发布 Kubernetes 次要版本时可用的最新驱动程序。当集群升级到最新的 GKE 补丁程序时,驱动程序会自动更新。

优势

Filestore CSI 驱动程序具有以下优势:

  • 您可以通过 Kubernetes API (kubectl) 访问全代管式 NFS 存储。

  • 您可以使用 GKE Filestore CSI 驱动程序来动态预配 PersistentVolume。

  • 您可以将卷快照与 GKE Filestore CSI 驱动程序结合使用。CSI 卷快照可用于创建 Filestore 备份

    Filestore 备份会创建文件共享的差分副本(包括所有文件数据和元数据),并将其与实例分开存储。您只能将此副本恢复到新的 Filestore 实例。不支持恢复到现有的 Filestore 实例。您可以使用 CSI 卷快照 API 来触发 Filestore 备份,只需在卷快照类中添加 type:backup 字段即可。

  • 您可以将卷扩展与 GKE Filestore CSI 驱动程序结合使用。通过卷扩展,您可以调整卷的容量。

  • 您可以在 Kubernetes 工作负载中使用预先预配的 Filestore 实例来访问现有的 Filestore 实例。您还可以动态创建或删除 Filestore 实例,并在具有 StorageClassDeployment 的 Kubernetes 工作负载中使用这些实例。

  • 支持 Filestore Multishares for GKE。此功能让您可以创建 Filestore 实例并在任何数量的 GKE 集群中同时为该实例分配多个较小的以 NFS 形式装载的 PersistentVolume。

使用要求

  • 如需使用 Filestore CSI 驱动程序,您的集群必须使用 GKE 1.21 版或更高版本。
  • 如需使用 Filestore Multishares 功能,您的集群必须使用 GKE 1.23 版或更高版本。
  • 只有使用 Linux 的集群支持 Filestore CSI 驱动程序;Windows Server 节点不支持。
  • Filestore 的最小实例大小至少为 1 TiB。最小实例大小取决于您选择的 Filestore 服务层级。如需了解详情,请参阅服务层级
  • Filestore 在 Filestore 实例上使用 NFSv3 文件系统协议,并支持任何与 NFSv3 兼容的客户端。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Cloud Filestore API 和 Google Kubernetes Engine API。
  • 启用 API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

在新集群上启用 Filestore CSI 驱动程序

如需在创建新的 Standard 集群时启用 Filestore CSI 驱动程序,请使用 Google Cloud CLI 或 Google Cloud 控制台执行以下步骤。

gcloud

gcloud container clusters create CLUSTER_NAME \
    --addons=GcpFilestoreCsiDriver \
    --cluster-version=VERSION

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • VERSION:GKE 版本号。 您必须选择 1.21 或更高版本才能使用此功能。或者,您可以使用 --release-channel 标志并指定发布渠道

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 选择标准集群模式,然后点击配置

  4. 根据需要配置集群。

  5. 在导航窗格的集群下,点击功能

  6. 选中启用 Filestore CSI 驱动程序复选框。

  7. 点击创建

如果要在共享 VPC 网络中使用 Filestore,请参阅在具有共享 VPC 的新集群上启用 Filestore CSI 驱动程序

启用 Filestore CSI 驱动程序后,您可以通过驱动程序和预配工具名称 filestore.csi.storage.gke.io 在 Kubernetes 卷中使用该驱动程序。

在现有集群上启用 Filestore CSI 驱动程序

如需在现有集群中启用 Filestore CSI 驱动程序,请使用 Google Cloud CLI 或 Google Cloud 控制台。

如需在现有集群上启用该驱动程序,请完成以下步骤:

gcloud

gcloud container clusters update CLUSTER_NAME \
   --update-addons=GcpFilestoreCsiDriver=ENABLED

CLUSTER_NAME 替换为现有集群的名称。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    前往 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 功能下,点击 Filestore CSI 驱动程序字段旁边的 修改 Filestore CSI 驱动程序

  4. 选中启用 Filestore CSI 驱动程序复选框。

  5. 点击保存更改

停用 Filestore CSI 驱动程序

您可以使用 Google Cloud CLI 或 Google Cloud 控制台在现有 Autopilot 或 Standard 集群上停用 Filestore CSI 驱动程序。

gcloud

gcloud container clusters update CLUSTER_NAME \
    --update-addons=GcpFilestoreCsiDriver=DISABLED \
    --region REGION

替换以下值:

  • CLUSTER_NAME:现有集群的名称。
  • REGION:集群的区域,例如 us-central1

控制台

  1. 在 Google Cloud 控制台中,转到 Google Kubernetes Engine 菜单。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 功能下,点击 Filestore CSI 驱动程序字段旁边的 修改 Filestore CSI 驱动程序

  4. 清除启用 Filestore CSI 驱动程序复选框。

  5. 点击保存更改

使用 Filestore CSI 驱动程序访问已有的 Filestore 实例

本部分介绍在 GKE 中使用 Kubernetes 卷和 Filestore CSI 驱动程序访问已有的 Filestore 实例的典型过程:

创建 PersistentVolume 和 PersistentVolumeClaim 以访问实例

  1. 创建一个如以下示例所示的清单文件,并将其命名为 preprov-filestore.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: PV_NAME
    spec:
      storageClassName: ""
      capacity:
        storage: 1Ti
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
      csi:
        driver: filestore.csi.storage.gke.io
        volumeHandle: "modeInstance/FILESTORE_INSTANCE_LOCATION/FILESTORE_INSTANCE_NAME/FILESTORE_SHARE_NAME"
        volumeAttributes:
          ip: FILESTORE_INSTANCE_IP
          volume: FILESTORE_SHARE_NAME
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      volumeName: PV_NAME
      resources:
        requests:
          storage: 1Ti
    
  2. 如需根据 preprov-filestore.yaml 清单文件创建 PersistentVolumeClaimPersistentVolume 资源,请运行以下命令:

    kubectl apply -f preprov-filestore.yaml
    

然后,继续创建使用该卷的 Deployment

使用 Filestore CSI 驱动程序创建卷

以下几个部分介绍了在 GKE 中使用 Filestore CSI 驱动程序支持的 Kubernetes 卷的典型过程:

创建一个 StorageClass

启用 Filestore CSI 驱动程序后,GKE 会自动安装以下 StorageClass 以预配 Filestore 实例:

您可以通过运行以下命令找到已安装的 StorageClass 的名称:

kubectl get sc

您还可以通过在 provisioner 字段中添加 filestore.csi.storage.gke.io 来安装其他使用 Filestore CSI 驱动程序的 StorageClass

  1. 将以下清单保存为 filestore-example-class.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: filestore-example
    provisioner: filestore.csi.storage.gke.io
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      tier: standard
      network: default
    

    从清单中,请考虑以下参数配置:

    • volumeBindingMode 设置为 Immediate 允许立即开始预配卷。之所以有这种可能性,是因为 Filestore 实例可以从任何可用区进行访问。因此,与 Compute Engine 永久性磁盘相比,GKE 不需要知道 Pod 被安排在哪个可用区。如果设置为 WaitForFirstConsumer,则只有在安排 Pod 后才能开始 GKE 预配。如需了解详情,请参阅 VolumeBindingMode
    • 任何层级都可以在 tier 参数中指定(例如 standardpremiumzonalenterprise)。+ 在非默认 VPC 上预配 Filestore 实例时,可以使用 network 参数。非默认 VPC 需要设置特殊的防火墙规则。
  2. 如需根据 filestore-example-class.yaml 清单文件创建 StorageClass 资源,请运行以下命令:

    kubectl create -f filestore-example-class.yaml
    

如果要在共享 VPC 网络中使用 Filestore,请参阅将 Filestore CSI 驱动程序与共享 VPC 一起使用时创建 StorageClass

使用 PersistentVolumeClaim 访问卷

您可以创建一个引用 Filestore CSI 驱动程序的 StorageClassPersistentVolumeClaim 资源。

您可以使用预安装或自定义的 StorageClass

以下示例清单文件创建了一个引用 StorageClass(名为 filestore-example)的 PersistentVolumeClaim

  1. 将以下清单文件保存为 pvc-example.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: filestore-example
      resources:
        requests:
          storage: 1Ti
    
  2. 如需根据 pvc-example.yaml 清单文件创建 PersistentVolume 资源,请运行以下命令:

    kubectl create -f pvc-example.yaml
    

创建使用该卷的 Deployment

以下示例 Deployment 清单使用名为 pvc-example.yamlPersistentVolume 资源。

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

  1. 将以下清单保存为 filestore-example-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: podpvc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: filestore-example
      resources:
        requests:
          storage: 1Ti
    
  2. 如需根据 filestore-example-deployment.yaml 清单文件创建 Deployment,请运行以下命令:

    kubectl apply -f filestore-example-deployment.yaml
    
  3. 确认已成功创建 Deployment:

    kubectl get deployment
    

    Filestore 实例可能需要一段时间才能完成预配。在此之前,Deployment 不会报告 READY 状态。您可以运行以下命令来监控 PVC 状态,以查看进度:

    kubectl get pvc
    

    卷预配完成后,您应该会看到 PVC 变为 BOUND 状态。

为 Filestore 实例添加标签

您可以使用标签对相关实例进行分组,并存储有关实例的元数据。标签是一种键值对,可帮助您组织 Filestore 实例。您可以将标签附加到各项资源,然后根据其标签对资源进行过滤。

您可以使用 StorageClass.parameters 中的 labels 键提供标签。Filestore 实例可以使用有关创建实例的 PersistentVolumeClaim/PersistentVolume 的信息进行标记。自定义标签键和值必须遵循标签的命名惯例。请参阅 Kubernetes 存储类别示例,将自定义标签应用于 Filestore 实例。

将 fsgroup 与 Filestore 卷搭配使用

Kubernetes 使用 fsGroup 更改卷的权限和所有权,以匹配 Pod 的 SecurityContext 中用户请求的 fsGroupfsGroup 是适用于 Pod 中的所有容器的补充组。您可以将 fsgroup 应用于由 Filestore CSI 驱动程序预配的卷。

将 Filestore 与共享 VPC 搭配使用

本部分介绍如何在服务项目的共享 VPC 网络中使用 Filestore 实例。

设置具有共享 VPC 的集群

如需设置具有共享 VPC 网络的集群,请按以下步骤操作:

  1. 创建宿主和服务项目
  2. 在宿主项目和服务项目上启用 Google Kubernetes Engine API
  3. 在宿主项目中创建网络和子网
  4. 在宿主项目中启用共享 VPC
  5. 在宿主项目中,向服务项目的 GKE 服务账号授予 HostServiceAgent 用户角色绑定
  6. 在共享 VPC 网络上启用专用服务访问通道

在具有共享 VPC 的新集群上启用 Filestore CSI 驱动程序

如需在具有共享 VPC 的新集群上启用 Filestore CSI 驱动程序,请按以下步骤操作:

  1. 验证可用子网和次要范围。创建集群时,您必须指定要用于集群 Pod 和 Service 的子网和次要 IP 地址范围。

    gcloud container subnets list-usable \
       --project=SERVICE_PROJECT_ID \
       --network-project=HOST_PROJECT_ID
    

    输出类似于以下内容:

    PROJECT                   REGION       NETWORK     SUBNET  RANGE
    HOST_PROJECT_ID  us-central1  shared-net  tier-1  10.0.4.0/22
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ tier-1-pods          │ 10.4.0.0/14   │ usable for pods or services │
    │ tier-1-services      │ 10.0.32.0/20  │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘
    
  2. 创建 GKE 集群。以下示例展示了如何使用 gcloud CLI 创建配置为使用共享 VPC 的 Autopilot 或 Standard 集群。以下示例使用创建网络和两个子网中的网络、子网和范围名称。

    Autopilot

    gcloud container clusters create-auto tier-1-cluster \
       --project=SERVICE_PROJECT_ID \
       --region=COMPUTE_REGION \
       --network=projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME \
       --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME \
       --cluster-secondary-range-name=tier-1-pods \
       --services-secondary-range-name=tier-1-services
    

    Standard

    gcloud container clusters create tier-1-cluster \
       --project=SERVICE_PROJECT_ID \
       --zone=COMPUTE_REGION \
       --enable-ip-alias \
       --network=projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME \
       --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME \
       --cluster-secondary-range-name=tier-1-pods \
       --services-secondary-range-name=tier-1-services \
       --addons=GcpFilestoreCsiDriver
    
  3. 创建防火墙规则以允许在集群中的节点、Pod 和 Service 之间进行通信。以下示例展示了如何创建名为 my-shared-net-rule-2 的防火墙规则。

    gcloud compute firewall-rules create my-shared-net-rule-2 \
       --project HOST_PROJECT_ID \
       --network=NETWORK_NAME \
       --allow=tcp,udp \
       --direction=INGRESS \
       --source-ranges=10.0.4.0/22,10.4.0.0/14,10.0.32.0/20
    

    在此示例中,来源范围 IP 值来自您验证了可用子网和次要范围的之前步骤。

在将 Filestore CSI 驱动程序与共享 VPC 搭配使用时创建 StorageClass

以下示例展示了如何在将 Filestore CSI 驱动程序与共享 VPC 搭配使用时创建 StorageClass:

cat <<EOF | kubectl apply -f -

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: filestore-sharedvpc-example
provisioner: filestore.csi.storage.gke.io
parameters:
  network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
  connect-mode: PRIVATE_SERVICE_ACCESS
  reserved-ip-range: RESERVED_IP_RANGE_NAME
allowVolumeExpansion: true

EOF

请替换以下内容:

  • HOST_PROJECT_ID:共享 VPC 网络的宿主项目的 ID 或名称。
  • SHARED_VPC_NAME:您之前创建的共享 VPC 网络的名称。
  • RESERVED_IP_RANGE_NAME:要在其中预配 Filestore 实例的特定预留 IP 地址范围的名称。此字段是可选字段。如果指定了预留的 IP 地址范围,则该范围必须是已命名的地址范围,而非直接 CIDR 值。

如果要在运行 v1.23 或更高版本的 Filestore Multishares on GKE 集群上预配由 Filestore 多共享提供支持的卷,请参阅使用 Filestore multishares for GKE 优化存储空间

后续步骤