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 实例,并在具有 StorageClass 或 Deployment 的 Kubernetes 工作负载中使用这些实例。
支持 Filestore Multishares for GKE。借助此功能,您可以创建 Filestore 实例并 多个较小的 NFS 装载 PersistentVolume 任意数量的 GKE 集群
使用要求
如需使用 Filestore CSI 驱动程序,您的集群必须使用正确的 GKE 版本号。仅以下服务层级 :
- 具有 GKE 1.21 版或更高版本的基本 HDD 层级
- 具有 GKE 1.21 版或更高版本的基本 SSD 层级
- 具有 GKE 1.27 版或更高版本的可用区层级(10 TiB 到 100 TiB)
- 具有 GKE 1.25 版或更高版本的 Enterprise 层级
- 如需使用 Filestore 多共享功能,您的集群必须使用 GKE 1.25 或更高版本。
只有使用 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
以获取最新版本。
- 如果要在共享 VPC 网络中使用 Filestore,请参阅将 Filestore 与共享 VPC 搭配使用中的其他设置说明。
在新集群上启用 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 版本号。 您必须选择支持的版本号才能使用此功能。请参阅 [#requirements]。 或者,您可以使用--release-channel
标志并指定发布渠道。
控制台
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
点击 add_box 创建。
选择标准集群模式,然后点击配置。
根据您的需求配置集群。
在导航窗格的集群下,点击功能。
选中启用 Filestore CSI 驱动程序复选框。
点击创建。
如果要在共享 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
替换为现有项目的名称
集群。
控制台
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
在功能下,点击 Filestore CSI 驱动程序字段旁边的 edit 修改 Filestore CSI 驱动程序。
选中启用 Filestore CSI 驱动程序复选框。
点击保存更改。
停用 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
。
控制台
在 Google Cloud 控制台中,转到 Google Kubernetes Engine 菜单。
在集群列表中,点击您要修改的集群的名称。
在功能下,点击 Filestore CSI 驱动程序字段旁边的 edit 修改 Filestore CSI 驱动程序。
清除启用 Filestore CSI 驱动程序复选框。
点击保存更改。
使用 Filestore CSI 驱动程序访问已有的 Filestore 实例
本部分介绍使用 Kubernetes 的 卷以通过 Filestore CSI 驱动程序访问先前存在的 Filestore 实例 :
创建 PersistentVolume 和 PersistentVolumeClaim 以访问实例
创建一个清单文件(如下例所示),并将名称命名为 它
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
为了基于
PersistentVolumeClaim
和PersistentVolume
资源创建 针对preprov-filestore.yaml
清单文件,运行以下命令:kubectl apply -f preprov-filestore.yaml
然后,继续创建使用该卷的 Deployment。
使用 Filestore CSI 驱动程序创建卷
以下几个部分介绍了在 GKE 中使用 Filestore CSI 驱动程序支持的 Kubernetes 卷的典型过程:
创建一个 StorageClass
启用 Filestore CSI 驱动程序后,GKE 会自动安装 以下 StorageClasses 预配 Filestore 实例:
zonal-rwx
,使用 Filestore 可用区级。 仅适用于较高的容量范围(10 TiB 到 100 TiB)。enterprise-rwx
(使用 Filestore 企业版层级), 其中每个 Kubernetes PersistentVolume 映射到一个 Filestore 实例enterprise-multishare-rwx
(使用 Filestore 企业版层级), 其中,每个 Kubernetes PersistentVolume 映射到指定 Filestore 的一个共享 实例。如需了解详情,请参阅 Filestore Multishares for Google Kubernetes Engine。standard-rwx
,使用 Filestore 基本 HDD 服务层级。premium-rwx
,使用 Filestore 基本 SSD 服务层级。
每个 StorageClass 仅在 它们各自支持的 GKE 版本号有关 请参阅要求。
您可以通过运行以下命令找到已安装的 StorageClass
的名称:
kubectl get sc
您还可以通过在 provisioner
字段中添加 filestore.csi.storage.gke.io
来安装其他使用 Filestore CSI 驱动程序的 StorageClass
。
Filestore 需要知道在哪个网络上创建 新实例。自动安装的 StorageClass 使用默认 为 GKE 集群创建的网络如果您已经将其删除 或想要使用其他网络,则必须创建一个新的 StorageClass 如以下步骤所述。否则,系统会自动安装 StorageClass 不起作用。
将以下清单保存为
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。 - 任何受支持的 Filestore 层级
可在
tier
参数中指定 (例如BASIC_HDD
、BASIC_SSD
、ZONAL
或ENTERPRISE
)。 network
参数 在非默认上预配 Filestore 实例时可以使用 VPC。非默认 VPC 需要特殊的防火墙规则 进行设置
- 将
如需根据
filestore-example-class.yaml
清单文件创建StorageClass
资源,请运行以下命令:kubectl create -f filestore-example-class.yaml
如果要在共享 VPC 网络中使用 Filestore,请参阅将 Filestore CSI 驱动程序与共享 VPC 一起使用时创建 StorageClass。
使用 PersistentVolumeClaim 访问卷
您可以创建一个引用 Filestore CSI 驱动程序的 StorageClass
的 PersistentVolumeClaim
资源。
您可以使用预安装或自定义的 StorageClass
。
以下示例清单文件会创建一个 PersistentVolumeClaim
,
引用名为 filestore-example
的 StorageClass
。
将以下清单文件保存为
pvc-example.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany storageClassName: filestore-example resources: requests: storage: 1Ti
如需根据
pvc-example.yaml
清单文件创建PersistentVolume
资源,请运行以下命令:kubectl create -f pvc-example.yaml
创建使用该卷的 Deployment
以下示例 Deployment 清单使用 PersistentVolume
名为“pvc-example.yaml
”的资源
多个 Pod 可以共享同一 PersistentVolumeClaim
资源。
将以下清单保存为
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
如需根据
filestore-example-deployment.yaml
清单文件创建 Deployment,请运行以下命令:kubectl apply -f filestore-example-deployment.yaml
确认已成功创建 Deployment:
kubectl get deployment
Filestore 实例可能需要一段时间才能完成预配。在此之前,部署不会报告
READY
状态。您可以运行以下命令来监控 PVC 状态,以查看进度:kubectl get pvc
卷预配完成后,您应该会看到 PVC 变为
BOUND
状态。
为 Filestore 实例添加标签
您可以使用标签对相关实例进行分组,并存储有关实例的元数据。标签是一种键值对,可帮助您组织 Filestore 实例。您可以将标签附加到 然后根据标签过滤资源。
您可以使用 StorageClass.parameters
中的 labels
键提供标签。Filestore 实例可以使用有关创建实例的 PersistentVolumeClaim
/PersistentVolume
的信息进行标记。自定义标签键和值必须遵循标签的命名惯例。请参阅 Kubernetes 存储类别示例,将自定义标签应用于 Filestore 实例。
将 fsgroup 与 Filestore 卷搭配使用
Kubernetes 使用 fsGroup
更改卷的权限和所有权,以匹配 Pod 的 SecurityContext 中用户请求的 fsGroup
。fsGroup
是适用于 Pod 中的所有容器的补充组。您可以将 fsgroup 应用于由 Filestore CSI 驱动程序预配的卷。
配置 Filestore 卷的 IP 访问规则
Filestore 支持基于 IP 的访问权限控制 规则 存储卷。此功能适用于 1.29.5 或更高版本。
借助此功能,管理员可以指定 通过 Google Cloud Armor GKE这样可以限制只有获得授权的用户才能访问,从而提高了安全性 特别是在 GKE 集群的 IP 范围过大的情况下 可能会导致 Filestore 实例遭到未经授权的访问 用户或应用
这些规则可以直接通过 Filestore API 进行配置,也可以
通过 Filestore CSI 驱动程序创建卷。你可以提供
使用
nfs-export-options-on-create
参数。
以下示例清单展示了如何指定配置:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: filestore-example
provisioner: filestore.csi.storage.gke.io
volumeBindingMode: Immediate
allowVolumeExpansion: true
parameters:
tier: "enterprise"
nfs-export-options-on-create: '[
{
"accessMode": "READ_WRITE",
"ipRanges": [
"10.0.0.0/24"
],
"squashMode": "ROOT_SQUASH",
"anonUid": "1003",
"anonGid": "1003"
},
{
"accessMode": "READ_WRITE",
"ipRanges": [
"10.0.0.0/28"
],
"squashMode": "NO_ROOT_SQUASH"
}
]'
安全选项
Filestore IP 访问规则简化了共享文件存储空间的配置 GKE 工作负载的权限。不过,了解它是如何管理 文件所有权和访问权限需要掌握几个关键概念:
NFS 和用户映射 NFS(网络文件系统)是 Filestore。其运作方式是将用户映射到客户端系统 Pod)传送给 Filestore 服务器上的用户。如果服务器上某个文件的所有者是 并且客户端与用户 ID 1003 进行了连接 文件。
根用户废除和
anonUid
:根用户废除
ROOT_SQUASH
是一项安全功能,可防止 以阻止客户端访问具有完整 root 权限的 Filestore 实例。 启用根用户废除 (root squash) 后,客户端系统上的 root 用户会被映射到anonUid
设置指定的非特权用户。禁止根用户废除 (
NO_ROOT_SQUASH
) 允许客户端访问 具有完整根权限的 Filestore 实例,这很方便 但对于常规操作而言安全性较低。
初始设置和权限:默认情况下,新的 Filestore 实例是 完全根用户所有。如果不先启用根用户废除 为其他用户设置权限,则会失去访问权限。这就是为什么 您至少需要一条具有
NO_ROOT_SQUASH
的 NFS 导出规则才能开始 为其他用户和群组配置访问权限。
建议
- 初始设置:始终从至少一条 NFS 导出规则开始,
指定具有
READ_WRITE
权限的管理员范围,并允许NO_ROOT_SQUASH
访问权限。使用此访问权限可创建目录、 权限,并根据需要分配所有权。 - 安全性:启用根用户废除 (
ROOT_SQUASH
) 以增强安全性。 请注意,创建卷后,您只能修改访问权限规则 存储数据 - 共享访问权限:在 Pod 安全性中使用
fsGroup
上下文 管理共享卷的群组所有权。请勿与 设置为ROOT_SQUASH
模式。这样做会返回Access denied
错误消息。
将 Filestore 与共享 VPC 搭配使用
本部分介绍如何在服务项目的共享 VPC 网络中使用 Filestore 实例。
设置具有共享 VPC 的集群
如需设置具有共享 VPC 网络的集群,请按以下步骤操作:
- 创建宿主和服务项目。
- 在宿主项目和服务项目上启用 Google Kubernetes Engine API。
- 在宿主项目中创建网络和子网。
- 在宿主项目中启用共享 VPC。
- 在宿主项目中,针对
HostServiceAgent
服务项目的 GKE 服务账号。 - 在共享 VPC 网络上启用专用服务访问通道。
在具有共享 VPC 的新集群上启用 Filestore CSI 驱动程序
如需在具有共享 VPC 的新集群上启用 Filestore CSI 驱动程序,请按照下列步骤操作: 具体步骤:
验证可用子网和次要范围。创建集群时 必须指定子网和次要 IP 地址范围,以用于 集群的 Pod 和 Service
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 │ └──────────────────────┴───────────────┴─────────────────────────────┘
创建 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
创建防火墙规则以允许在集群中的节点、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 值。
如果要在 Cloud Storage 中预配由 Filestore 多共享支持的卷, GKE 集群运行 1.23 或更高版本,请参阅 通过适用于 GKE 的 Filestore 多共享功能优化存储空间。
重新连接 Filestore 单共享卷
将 Filestore 与基本 HDD、基本 SSD 还是企业版搭配使用 (单共享)层级,则可以按照以下说明重新连接您的 将现有 Filestore 实例复制到您的 GKE 工作负载。
按以下条件查找预预配的 Filestore 实例的详细信息: 按照获取特定实例的相关信息中的说明操作。
重新部署您的 PersistentVolume 规范。在
volumeAttributes
字段中, 修改以下字段以使用与 Filestore 相同的值 实例:ip
:将此值修改为预预配的 Filestore 实例 IP 地址。volume
:将此值修改为预预配的 Filestore 实例的共享名称。
重新部署您的 PersistentVolumeClaim 规范。在
volumeName
中 确保引用第 2 步中相同的 PersistentVolume 名称。检查 PersistentVolumeClaim 和 PersistentVolume 的绑定状态 运行
kubectl get pvc
。重新部署您的 Pod 规范,并确保您的 Pod 能够访问 Filestore 共享。
后续步骤
- 了解如何在 GKE 上部署有状态 Filestore 工作负载。
- 了解如何与多个永久性卷共享 Filestore Enterprise 实例。
- 了解如何使用卷扩展功能。
- 了解如何使用卷快照。
- 在 GitHub 上详细了解 CSI 驱动程序。