Elastic File System (EFS) 是用于为集群提供存储空间(磁盘空间)的底层 AWS 机制。PersistentVolume 是一种集群资源,可让 EFS 存储空间供工作负载使用,并确保它在即使没有工作负载相连的情况下持续存在。本主题介绍工作负载如何使用 PersistentVolumeClaim 访问 PersistentVolume。
GKE on AWS 支持为所有受支持的 Kubernetes 版本静态预配 PersistentVolume。对于 Kubernetes 1.24 版或更高版本的集群,GKE on AWS 还支持动态预配。如需使用动态预配,您的集群管理员必须进行相应配置。如需了解具体方法,请参阅配置 PersistentVolume
。
创建一个 PersistentVolumeClaim
选择下面适当的标签页,具体取决于您是希望将工作负载连接到静态还是动态预配的永久性卷。
静态
以下说明假定您的集群管理员已预配至少一个 PersistentVolume。如需访问此 PersistentVolume 并将其底层 EFS 与您的工作负载一起使用,请创建一个 PersistentVolumeClaim。
如需为静态预配的 PersistentVolume 创建 PersistentVolumeClaim,请将以下 YAML 清单复制到名为 efs-claim.yaml
的文件中。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: CLAIM_NAME
spec:
accessModes:
- ReadWriteMany
storageClassName: "" # Leave as empty string for static provisioning
resources:
requests:
storage: 5Gi
您需要将其中的:
- CLAIM_NAME:您为要绑定到的 PersistentVolumeClaim 选择的名称,例如
efs-claim1
。留空可绑定到默认存储类别
将 YAML 应用到您的集群。
kubectl apply -f efs-claim.yaml
此输出内容将确认 PersistentVolumeClaim 的创建。
persistentvolumeclaim/CLAIM_NAME created
Dynamic
以下说明假定您的集群管理员已为动态预配预配了至少一个 StorageClass。如需使用此 StorageClass 创建动态预配的 PersistentVolume,并将底层 EFS 接入点与工作负载结合使用,请创建 PersistentVolumeClaim。
如需创建 PersistentVolumeClaim,请按照以下步骤操作。EFS CSI 驱动程序将此 PersistentVolumeClaim 与指定的 StorageClass 结合使用来动态预配 PersistentVolume。
- 将以下 YAML 清单复制到名为
efs-claim.yaml
的文件中。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: CLAIM_NAME
spec:
accessModes:
- ReadWriteMany
storageClassName: "EFS_STORAGE_CLASS_NAME"
resources:
requests:
storage: 5Gi
您需要将其中的:
- CLAIM_NAME:您为 PersistentVolumeClaim 选择的名称,例如
efs-claim1
- EFS_STORAGE_CLASS_NAME:您希望 PersistentVolumeClaim 绑定到的 StorageClass 的名称。将此字段留空可绑定到默认存储类别
将 YAML 应用到您的集群。
kubectl apply -f efs-claim.yaml
输出内容将确认 PersistentVolumeClaim 的创建。
persistentvolumeclaim/CLAIM_NAME created
创建 StatefulSet
创建 PersistentVolumeClaim 后,您便可以在工作负载中使用它。本部分将创建一个使用 PersistentVolumeClaim 的示例 StatefulSet。您还可以通过引用 spec.volumes
中的声明,将 PersistentVolumeClaim 与其他工作负载类型(例如 Pod 和 Deployment)搭配使用。
如需创建 StatefulSet,并装载 PersistentVolumeClaim 中引用的 EFS 资源,请执行以下步骤。
将以下 YAML 清单复制到名为
efs-statefulset.yaml
的文件中。在此示例清单中,启动了一个 Ubuntu Linux 容器,用于将 EFS 资源装载到/efs-data
中。该容器每 5 秒向 EFS 资源上名为out.txt
的文件写入一次数据。apiVersion: apps/v1 kind: StatefulSet metadata: name: efs-shell spec: selector: matchLabels: app: test-efs serviceName: efs-app replicas: 1 template: metadata: labels: app: test-efs spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"] volumeMounts: - name: efs-volume mountPath: /efs-data volumes: - name: efs-volume persistentVolumeClaim: claimName: CLAIM_NAME
将 CLAIM_NAME 替换为您之前指定的 PersistentVolumeClaim 的名称,例如
efs-claim1
。将 YAML 应用到您的集群。
kubectl apply -f efs-statefulset.yaml
输出内容将确认 StatefulSet 的创建。
statefulset.apps/efs-shell created
StatefulSet 可能需要几分钟时间来下载和启动容器映像。
使用
kubectl get pods
确认 StatefulSet 的 Pod 处于Running
状态。kubectl get pods -l app=test-efs
输出包括 pod 的名称及其状态。在以下响应中,pod 的名称为
efs-shell-0
。NAME READY STATUS RESTARTS AGE efs-shell-0 1/1 Running 0 1m
pod 处于运行状态后,使用
kubectl exec
连接到托管 StatefulSet 的 pod。kubectl exec -it efs-shell-0 -- bash
kubectl
命令会在该 pod 上启动 shell。如需确认已装载 EFS 资源,请使用
tail
命令检查out.txt
文件的内容。tail /efs-data/out.txt
输出内容包含最近时间(以世界协调时间格式显示)。
使用
exit
命令断开与 pod 的连接。exit
Shell 返回到本地机器。
清理
如需移除 StatefulSet,请使用 kubectl delete
。
kubectl delete -f efs-statefulset.yaml
后续步骤
- 了解如何配置 EFS 资源
- 了解如何将 StorageClass 与工作负载配合使用