本指南介绍如何将 Filestore Multishares for Google Kubernetes Engine 与 GKE Filestore CSI 驱动程序搭配使用。
须知事项
在开始之前,请完成使用 Filestore 所需的设置步骤。
启用 GKE Filestore CSI 驱动程序 1.23 版或更高版本:
驱动程序 1.23 版至 1.26 版支持每个实例最多 10 个共享。
驱动程序 1.27 版或更高版本支持每个实例最多 80 个共享。
如需了解最新的 GKE Filestore CSI 驱动程序要求,请参阅使用 Filestore CSI 驱动程序访问 Filestore 实例。
将 Filestore Multishares 与多个应用搭配使用
本部分介绍如何部署两个应用,即一个 Deployment 和一个 Statefulset,每个应用都使用 Filestore Multishares StorageClass。您还将了解 GKE 如何封装(一个高效地将应用打包到 GKE 节点的过程)同一底层 Filestore Enterprise 实例中的所有卷。
使用 GKE 提供的 StorageClass
enterprise-multishare-rwx
创建最多支持 10 个共享的实例。- 如果要创建最多支持 80 个共享的实例,您需要创建自定义 StorageClass。在本指南中,您将使用具有每个实例 10 个共享限制的 StorageClass。
启用 GKE Filestore CSI 驱动程序后,用户可以使用以下配置访问 GKE 提供的多共享 StorageClass
enterprise-multishare-rwx
。通过引用此 StorageClass,GKE Filestore CSI 驱动程序可使用动态卷预配自动为新的永久性卷声明 (PVC) 创建永久性卷 (PV) 以满足以下 GKE 工作负载需求:kubectl describe sc enterprise-multishare-rwx Name: enterprise-multishare-rwx IsDefaultClass: No Annotations: components.gke.io/component-name=filestorecsi,components.gke.io/component-version=0.7.2,components.gke.io/layer=addon Provisioner: filestore.csi.storage.gke.io Parameters: instance-storageclass-label=enterprise-multishare-rwx,multishare=true,tier=enterprise AllowVolumeExpansion: True MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>
创建自定义 StorageClass
如果您想要利用每个 Filestore 实例的最新容量限制(最多 80 个共享),请根据以下模板创建自定义 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-filestore-multishare-128
provisioner: filestore.csi.storage.gke.io
parameters:
tier: enterprise
multishare: "true"
max-volume-size: "128Gi"
network: default
allowVolumeExpansion: true
重命名 StorageClass 时,请考虑以下要求:
StorageClass 名称必须是有效的 DNS 子域名。
多共享 StorageClass 名称也用作实例标签,应遵循标签命名准则。
如果您的应用需要立即预配卷,请包含
Immediate
卷绑定模式:volumeBindingMode: Immediate
例如,如果您不希望卷预配依赖于 GKE 集群中的 Pod 创建,请使用此规范。
从驱动程序 1.27 版开始,如果要为每个实例分配超过 10 个共享,请包含
max-volume-size
参数并为其分配第一列中接受的值之一:卷大小上限(共享大小) 每个实例的共享数上限 128 GiB 80 256 GiB 40 512 GiB 20 1024 GiB 10 例如,添加键值对
max-volume-size: "128Gi"
可确保 StorageClass 最多将 80 个共享(每个共享的大小范围从 10 GiB 到 128 GiB)映射到单个 10 TiB 企业层级实例。此功能向后兼容 GKE Filestore CSI 驱动程序 1.23 至 1.26 版创建的 Filestore 实例。
现有实例可以创建新的 PVC 或共享,扩展的最小共享大小为 10 GiB。
GKE Filestore CSI 驱动程序 1.27 版或更高版本可识别旧版企业实例,并为其分配默认的最大共享大小 1024 GiB (1 TiB)。因此,旧版实例的最大共享数限制为每个实例 10 个共享。
如需了解详情,请参阅 Filestore Multishares for GKE。
使用单个 PVC 创建具有多个 pod 副本的 Deployment。
创建一个类似如下所示的 YAML 配置文件:
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: web-server-multishare labels: app: nginx spec: replicas: 5 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: test-pvc-fs --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc-fs spec: accessModes: - ReadWriteMany storageClassName: enterprise-multishare-rwx resources: requests: storage: 100Gi EOF
检查 Pod 副本。
a. 从命令行中,运行以下命令以检查 PVC 状态:
kubectl get pvc
您应该会看到类似于以下响应的内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc-fs Bound pvc-056d769d-a709-4bb2-b6d3-0361871b27a2 100Gi RWX enterprise-multishare-rwx 35m
b. 从命令行中,运行以下命令以检查 pod 状态:
kubectl get pod
您应该会看到类似于以下响应的内容:
NAME READY STATUS RESTARTS AGE web-server-multishare-76c9ffb4b5-2dhml 1/1 Running 0 35m web-server-multishare-76c9ffb4b5-7mtcb 1/1 Running 0 35m web-server-multishare-76c9ffb4b5-csdbd 1/1 Running 0 35m web-server-multishare-76c9ffb4b5-rgx82 1/1 Running 0 35m web-server-multishare-76c9ffb4b5-zjl27 1/1 Running 0 35m
扩缩副本。
a. 从命令行中,运行以下命令以修改 Deployment:
kubectl edit deployment web-server-multishare
b. 文件将在命令行中打开。找到
spec.replicas
字段,并将值更新为10
。c. 从命令行中,运行以下命令以查看应用的更改:
kubectl get pod
您应该会看到类似于以下响应的内容:
NAME READY STATUS RESTARTS AGE web-server-multishare-76c9ffb4b5-2dhml 1/1 Running 0 36m web-server-multishare-76c9ffb4b5-5ctkf 1/1 Running 0 3s web-server-multishare-76c9ffb4b5-7mtcb 1/1 Running 0 36m web-server-multishare-76c9ffb4b5-8dwmw 1/1 Running 0 2s web-server-multishare-76c9ffb4b5-csdbd 1/1 Running 0 36m web-server-multishare-76c9ffb4b5-lndcq 1/1 Running 0 2s web-server-multishare-76c9ffb4b5-rgx82 1/1 Running 0 36m web-server-multishare-76c9ffb4b5-vtd6p 1/1 Running 0 3s web-server-multishare-76c9ffb4b5-xm49s 1/1 Running 0 3s web-server-multishare-76c9ffb4b5-zjl27 1/1 Running 0 36m
请注意,有 10 个 Pod 正在运行。
d. 从命令行中,运行以下命令:
kubectl get deployment
您应该会看到类似于以下响应的内容:
NAME READY UP-TO-DATE AVAILABLE AGE web-server-multishare 10/10 10 10 36m
e。 从命令行中,运行以下命令以检查 PVC 绑定状态:
kubectl get pvc
您应该会看到类似于以下响应的内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc-fs Bound pvc-056d769d-a709-4bb2-b6d3-0361871b27a2 100Gi RWX enterprise-multishare-rwx 37m
f. 从命令行中,运行以下命令以修改 Deployment:
kubectl edit deployment web-server-multishare
g.文件将在命令行中打开。找到
spec.replicas
字段,并将值更新为2
。h.从命令行中,运行以下命令以查看应用的更改:
kubectl get pod
您应该会看到类似于以下响应的内容:
NAME READY STATUS RESTARTS AGE web-server-multishare-76c9ffb4b5-2dhml 1/1 Running 0 38m web-server-multishare-76c9ffb4b5-7mtcb 1/1 Running 0 38m
部署 Statefulset。
部署共享底层 Filestore 实例的第二个应用。
为此,请预配 200 GiB 的空间,并验证该空间使用与第一个应用相同的底层 Filestore 实例。
然后,使用总共 900 GiB 将应用扩容到九个副本(9 副本各使用 100 GiB),并验证 GKE 是否使用共享实例的相同 Filestore 实例。
创建一个类似如下所示的 YAML 配置文件:
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: test-pvc-multishare mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: test-pvc-multishare spec: accessModes: [ "ReadWriteMany" ] storageClassName: enterprise-multishare-rwx resources: requests: storage: 100Gi EOF
检查 Statefulset 副本和卷。
从命令行中,运行以下命令:
kubectl get pod
您应该会看到类似于以下响应的内容:
NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 4m48s web-1 1/1 Running 0 3m32s web-server-multishare-76c9ffb4b5-2dhml 1/1 Running 0 57m web-server-multishare-76c9ffb4b5-7mtcb 1/1 Running 0 57m
请注意,前两个 pod 与 Statefulset 相关联。最后两个 pod 与 Deployment 相关联。
从命令行中,运行以下命令:
kubectl get statefulset
您应该会看到类似于以下响应的内容:
NAME READY AGE web 2/2 2m8s
从命令行中,运行以下命令:
kubectl get pvc
您应该会看到类似于以下响应的内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc-fs Bound pvc-056d769d-a709-4bb2-b6d3-0361871b27a2 100Gi RWX enterprise-multishare-rwx 54m test-pvc-multishare-web-0 Bound pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7 100Gi RWX enterprise-multishare-rwx 114s test-pvc-multishare-web-1 Bound pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe 100Gi RWX enterprise-multishare-rwx 38s
PVC
test-pvc-fs
与 Deploymentweb-server-multishare
相关联。PVC
test-pvc-multishare-web-0
和test-pvc-multishare-web-1
与 Statefulset 相关联。扩缩 Statefulset 副本。
将副本数量增加到九个。随着数量增加,系统会创建相应的 PVC。
a. 从命令行中,运行以下命令:
kubectl edit statefulset web
b. 文件将在命令行中打开。找到
spec.replicas
字段,并将值更新为9
。c. 从命令行中,运行以下命令以查看应用的更改:
kubectl get statefulset
您应该会看到类似于以下响应的内容:
NAME READY AGE web 9/9 13m
d. 从命令行中,运行以下命令:
kubectl get deployment
您应该会看到类似于以下响应的内容:
NAME READY UP-TO-DATE AVAILABLE AGE web-server-multishare 2/2 2 2 65m
e。 从命令行中,运行以下命令:
kubectl get pvc
您应该会看到类似于以下响应的内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc-fs Bound pvc-056d769d-a709-4bb2-b6d3-0361871b27a2 100Gi RWX enterprise-multishare-rwx 65m test-pvc-multishare-web-0 Bound pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7 100Gi RWX enterprise-multishare-rwx 13m test-pvc-multishare-web-1 Bound pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe 100Gi RWX enterprise-multishare-rwx 12m test-pvc-multishare-web-2 Bound pvc-3fcbd132-939f-4364-807a-7c8ac6a3e64e 100Gi RWX enterprise-multishare-rwx 5m12s test-pvc-multishare-web-3 Bound pvc-5894afa5-2502-4ee7-9d5c-b7378cb85479 100Gi RWX enterprise-multishare-rwx 4m57s test-pvc-multishare-web-4 Bound pvc-ebbe452b-bc8f-4624-a830-a2094cce0d67 100Gi RWX enterprise-multishare-rwx 4m36s test-pvc-multishare-web-5 Bound pvc-5a73a698-d174-44cb-a3a1-e767966c3417 100Gi RWX enterprise-multishare-rwx 4m20s test-pvc-multishare-web-6 Bound pvc-102da6a9-2ca6-4f9e-9896-8fe14709db7a 100Gi RWX enterprise-multishare-rwx 3m55s test-pvc-multishare-web-7 Bound pvc-160e81cd-c5bf-4ae6-966e-518e8249e02d 100Gi RWX enterprise-multishare-rwx 3m38s test-pvc-multishare-web-8 Bound pvc-9b52d773-2e9a-40de-881c-dc06945ba3d7 100Gi RWX enterprise-multishare-rwx 118s
验证 Filestore 实例状态。
您现在有一个具有两个副本 pod 的 Deployment、一个具有九个副本 pod 的 Statefulset,以及总共 10 个 PVC,每个 PVC 大小为 100 GiB。所有卷都打包到单个 Filestore Multishare 实例上。
a. 从命令行中,运行以下
instances list
命令:gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
其中:
您应该会看到类似于以下响应的内容:
INSTANCE_NAME LOCATION TIER CAPACITY_GB FILE_SHARE_NAME IP_ADDRESS STATE CREATE_TIME fs-a767cef8-738e-4c8e-b70b-09cbb872d016 us-central1 ENTERPRISE 1024 N/A 10.192.53.2 READY 2022-06-21T21:15:30
b. 从命令行中,运行以下
instances describe
命令:gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION capacityGb: '1024' capacityStepSizeGb: '256' createTime: '2022-06-21T21:15:30.464237089Z' labels: storage_gke_io_created-by: filestore_csi_storage_gke_io storage_gke_io_storage-class-id: enterprise-multishare-rwx maxCapacityGb: '10240' maxShareCount: '10' multiShareEnabled: true name: projects/YOUR_PROJECT_ID/locations/REGION/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016 networks: - connectMode: DIRECT_PEERING ipAddresses: - 10.192.53.2 modes: - MODE_IPV4 network: csi-filestore-test-network reservedIpRange: 10.192.53.0/26 state: READY tier: ENTERPRISE
其中:
扩展 PVC 并验证 Filestore 实例
本部分介绍如何扩展现有 PVC 并验证 Filestore 实例的大小。
扩展 PVC。
由 Filestore Multishare 实例中的共享提供支持的 PVC 可以增加到
max-volume-size
参数中指定的大小上限。如需对此进行验证,请在 Pod 使用 Statefulset 时扩展与 Statefulset 关联的其中一个卷。从命令行中,运行以下命令以检查副本 0 的当前 PVC 大小:
kubectl get pvc test-pvc-multishare-web-0 -o json { "apiVersion": "v1", "kind": "PersistentVolumeClaim", "metadata": { "annotations": { "pv.kubernetes.io/bind-completed": "yes", "pv.kubernetes.io/bound-by-controller": "yes", "volume.beta.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io", "volume.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io" }, "creationTimestamp": "2022-06-21T22:07:42Z", "finalizers": [ "kubernetes.io/pvc-protection" ], "labels": { "app": "nginx" }, "name": "test-pvc-multishare-web-0", "namespace": "default", "resourceVersion": "48395", "uid": "7aa21b5a-5343-4547-b7d7-414c16af15a7" }, "spec": { "accessModes": [ "ReadWriteMany" ], "resources": { "requests": { "storage": "100Gi" } }, "storageClassName": "enterprise-multishare-rwx", "volumeMode": "Filesystem", "volumeName": "pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7" }, "status": { "accessModes": [ "ReadWriteMany" ], "capacity": { "storage": "100Gi" }, "phase": "Bound" } }
从命令行中,运行以下命令以将大小增加到 500 GiB:
kubectl edit pvc test-pvc-multishare-web-0
文件将在命令行中打开。找到
spec.resources.requests.storage
字段,并将值更新为500Gi
。从命令行中,运行以下命令以查看应用的更改:
kubectl get pvc test-pvc-multishare-web-0
您应该会看到类似于以下响应的内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc-multishare-web-0 Bound pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7 500Gi RWX enterprise-multishare-rwx 28m
Filestore CSI 驱动程序接受请求,首先扩展底层 Filestore 实例,然后扩展为 PVC 提供支持的共享。
具体来说,Filestore CSI 驱动程序会自动将实例扩展到 1536 Gi,以适应 500Gi 的新共享大小。
从命令行中,运行以下命令以
instances describe
命令来验证 Filestore 实例的容量:gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION capacityGb: '1536' capacityStepSizeGb: '256' createTime: '2022-06-21T21:15:30.464237089Z' labels: storage_gke_io_created-by: filestore_csi_storage_gke_io storage_gke_io_storage-class-id: enterprise-multishare-rwx maxCapacityGb: '10240' maxShareCount: '10' multiShareEnabled: true name: projects/YOUR_PROJECT_ID/locations/us-central1/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016 networks: - connectMode: DIRECT_PEERING ipAddresses: - 10.192.53.2 modes: - MODE_IPV4 network: csi-filestore-test-network reservedIpRange: 10.192.53.0/26 state: READY tier: ENTERPRISE
其中:
在共享 VPC 上动态预配
GKE 的 Filestore CSI 驱动程序支持在共享 VPC 下的服务项目中动态预配卷。以下部分介绍如何使用 Filestore CSI 驱动程序在共享 VPC 网络下的服务项目中的 Filestore Multishare 实例上动态预配卷。
完成共享 VPC 网络和专用服务访问通道的设置步骤。
创建 StorageClass,以在共享 VPC 上动态预配由 Filestore Multishares 实例提供支持的卷。
运行以下命令以部署
StorageClass
资源:cat <<EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-filestore-multishare-sharedvpc provisioner: filestore.csi.storage.gke.io parameters: network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME" connect-mode: PRIVATE_SERVICE_ACCESS tier: enterprise multishare: "true" allowVolumeExpansion: true EOF
其中:
HOST_PROJECT_ID 是共享 VPC 网络的宿主项目的 ID 或名称。例如
my-host-project
。SHARED_VPC_NAME 是共享 VPC 网络的名称。例如
my-shared-vpc
。
如果要在预留的 IP 地址范围内部署资源,请将以下行添加到命令中使用的参数中:
reserved-ip-range: RESERVED_NAME
其中 RESERVED_NAME 是可以在其中预配 Filestore 实例的预留 IP 地址范围的名称。例如
filestore-reserved-ip-range
。如果指定了预留的 IP 范围,则该范围必须是已命名的地址范围,而非直接 CIDR 值。如需了解详情,请参阅分配 IP 地址范围或配置预留的 IP 地址范围。如需查看如何使用 Google Cloud 控制台创建预留名称的示例,请参阅创建 IP 分配。
创建 Deployment
运行以下命令以创建
Deployment
资源:cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: web-server-multishare labels: app: nginx spec: replicas: 5 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: test-pvc-fs-sharedvpc --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc-fs-sharedvpc spec: accessModes: - ReadWriteMany storageClassName: csi-filestore-multishare-sharedvpc resources: requests: storage: 100Gi EOF
启用了 CMEK 的 Filestore 实例
您可以创建托管在启用了 CMEK 的 Filestore Multishare 实例上的 GKE 卷。在本部分中,您将了解如何为 Filestore 实例设置客户管理的加密密钥 (CMEK)。
您可以在 StorageClass 中提供客户管理的密钥详细信息。由 Filestore CSI 驱动程序动态引用的任何实例(它会引用此 StorageClass)都将启用 CMEK。
创建启用 CMEK 的 StorageClass。
a. 运行以下命令:
cat <<EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-filestore-multishare-cmek provisioner: filestore.csi.storage.gke.io parameters: tier: enterprise multishare: "true" instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/REGION/keyRings/RING_NAME/cryptoKeys/KEY_NAME allowVolumeExpansion: true EOF
其中:
创建 Deployment
b. 运行以下命令以创建
Deployment
资源:cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: web-server-multishare labels: app: nginx spec: replicas: 5 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: test-pvc-fs-cmek --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc-fs-cmek spec: accessModes: - ReadWriteMany storageClassName: csi-filestore-multishare-cmek resources: requests: storage: 100Gi EOF
将 PVC 映射到 Filestore 实例
在本部分中,您将了解如何将 PVC 映射到 Filestore 实例。
对于 Filestore Multishare 实例,每个 PVC 都由 Filestore CSI 驱动程序托管在 Filestore 实例上。托管卷的底层 Filestore 实例以及表示 Kubernetes 卷的共享的详细信息可在永久性卷规范的 volumeHandle
字段中捕获。卷句柄格式如下:
modeMultishare/<storageclass-prefix>/<project>/<region>/<filestore-instance-name>/<filestore-share-name>
以下 kubectl
命令可用于快速确定 PVC、PV、Filestore 实例和 Filestore 共享之间的映射。
从命令行中,运行以下命令:
kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'
您应该会看到类似于以下响应的内容:
pv=pvc-67ad9abd-f25e-4130-b7ca-64d28bd29525,pvc=test-pvc-multishare,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_67ad9abd_f25e_4130_b7ca_64d28bd29525
pv=pvc-c80f4de0-9916-4957-b8ae-b21206650ac0,pvc=test-pvc-fs-sharedvpc,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_c80f4de0_9916_4957_b8ae_b21206650ac0
其中:
- YOUR_PROJECT_ID 是所使用的项目的名称。例如
my-project
。
请注意,集群中的两个永久性卷托管在单个 Filestore 实例上。