NAS 提供了共享存储和持久化存储的服务,满足您需要多个 Pod 共享数据的应用场景。本文以静态创建 PV 的方式介绍如何使用 NAS 实现共享存储和持久化存储。
NAS 支持同时被多个 Pod 挂载,此时多个 Pod 可能同时修改相同数据,需要应用自行实现数据的同步。
配置项 | 说明 |
---|---|
创建方式 | 选择存储卷的创建方式,支持 静态创建,即由管理员创建 PV。 |
名称 | 根据系统提示,自定义存储卷的名称。需确保存储卷名称在集群内唯一。 |
存储卷类型 | 存储卷类型包括:云盘、文件存储、对象存储。本场景选择 文件存储。 |
访问模式 | 选择存储卷的访问方式,目前支持 ReadWriteMany ,此访问方式支持多点读写。 |
文件系统类型 | 选择文件存储的文件系统类型。
说明 容量型文件存储在容器服务和文件存储 NAS 产品中均属于邀测特性,若需要使用此功能,需同时获取容器服务和文件存储 NAS 的邀测试用权限。 |
挂载点 | 选择已有 NAS 文件系统下存在,且与集群在同一个私有网络(VPC)内的挂载点。 |
子目录 | 根据系统提示的输入规范,输入待挂载文件系统的子目录信息,默认为根目录 说明 需要保证将要挂载的子目录在 NFS 中已经存在。 |
NFS 版本 | 选择所创建存储卷的网络文件系统(Network File System)版本,请按实际需求选择使用。
|
使用 Yaml 创建 PV 的示例如下:
apiVersion: v1 kind: PersistentVolume metadata: name: vke-nas-static-pv # PV 名称。 spec: accessModes: # 存储卷的访问方式,目前仅支持 ReadWriteMany(多点读写)。 - ReadWriteMany capacity: storage: 100Gi # NAS 存储容量。 csi: driver: nas.csi.volcengine.com # 驱动类型,本示例为`nas.csi.volcengine.com`,表示火山引擎 csi-nas 插件。 volumeAttributes: fsId: enas-cnbj1b9f******** # NAS 文件系统 ID,仅当文件系统类型为极速型时需要配置。 fsType: Extreme # 文件系统类型,Extreme:极速型;Capcity:容量型。 path: /enas-cnbj1b9f********/temp # NAS 文件系统挂载子目录。 server: cnbj1b9f********.r*********.nas.ivolces.com # NAS 文件系统挂载点地址。 volumeAs: subpath # 创建的子目录类型。subpath:子路径;filesystem:文件系统。 volumeHandle: vke-nas-static-pv # PV 的唯一标识符,与 PV 名称保持一致。如需同时使用多个 PV,则各个 PV 中该值必须不一致。 mountOptions: - nolock,proto=tcp,noresvport - vers=3 # 挂载 NAS 数据卷的 NFS 协议版本号。3:NFSv3;4:NFSv4;4.1:NFSv4.1。 persistentVolumeReclaimPolicy: Retain # PV 回收策略。Retain:保留策略,Delete:删除策略。 volumeMode: Filesystem # PV 类型。Filesystem:将卷作为文件系统使用,设置为 Filesystem 的卷会被 Pod 挂载到某个目录;Block:将卷作为块设备使用。
配置项 | 说明 |
---|---|
命名空间 | 选择存储卷声明所属的命名空间。建议选择您自定义的命名空间,或系统默认创建的 default 命名空间。命名空间相关介绍,请参见 命名空间概述。 |
名称 | 根据系统提示自定义存储卷声明的名称,需确保存储卷声明名称在集群内唯一。 |
存储类型 | 存储类型包括:云盘、文件存储、对象存储。本场景选择 文件存储。 |
访问模式 | 选择存储卷声明的访问方式,目前支持 ReadWriteMany ,此访问方式支持多点读写。 |
计费类型 | 按需选择资源计费类型,目前支持按量计费。 |
文件系统类型 | 选择文件存储的文件系统类型。
说明 容量型文件存储在容器服务和文件存储 NAS 产品中均属于邀测特性,若需要使用此功能,需同时获取容器服务和文件存储 NAS 的邀测试用权限。 |
创建方式 | 存储卷声明的创建方式包括:基于存储类创建、使用已有存储卷。本场景选择 使用已有存储卷。 |
存储卷 | 使用已有存储卷时需配置此参数。指定文件存储类型的存储卷进行关联挂载。 |
使用 Yaml 创建 PVC 的示例如下:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: vke-nas-static-pvc # PVC 名称。 spec: accessModes: - ReadWriteMany # PVC 访问模式。目前仅支持 ReadWriteMany ,表示多点读写。 resources: requests: storage: 100Gi # 声明的存储使用量。 volumeMode: Filesystem # PV 类型,本示例填写 Filesystem,表示文件存储。 volumeName: vke-nas-static-pv # 绑定到该 PVC 的 PV 名称。
文件存储类型的静态存储卷创建完成后,可通过添加卷的方式挂载到工作负载使用,包括:无状态负载、任务、定时任务、守护进程。
可通过创建工作负载或更新工作负载操作的容器配置步骤,为工作负载添加卷并挂载卷。以创建无状态负载为例,详细操作参见:创建无状态负载。
使用 Yaml 创建 Deployment 的示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: vke-nas-static-deployment # Deployment 名称。 namespace: default labels: app: nginx spec: replicas: 1 selector: matchLabels: app: vke-nas-static-deployment template: metadata: labels: app: vke-nas-static-deployment spec: containers: - image: nginx imagePullPolicy: IfNotPresent name: nginx volumeMounts: - mountPath: /tmp # NAS 在容器中挂载的位置。 name: nas-pv volumes: - name: nas-pv persistentVolumeClaim: claimName: vke-nas-static-pvc # 步骤二中创建的 PVC 名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE web-5c4d7f****-8f9qx 1/1 Running 0 2m53s web-5c4d7f****-brvch 1/1 Running 0 2m53s web-5c4d7f****-xltnr 1/1 Running 0 2m53s
/test
路径下的文件。kubectl exec web-5c4d7f****-8f9qx ls /test
预期输出:
kubectl exec web-5c4d7f****-8f9qx ls /test
说明
路径 /test
下为空,没有文件。
/test
路径下创建文件 nas
。kubectl exec web-5c4d7f****-8f9qx touch /test/nas
/test
路径下的文件。kubectl exec web-5c4d7f****-8f9qx ls /test
预期输出:
nas
/test
路径下的文件。kubectl exec web-5c4d7f****-brvch ls /test
预期输出:
nas
6. 在任意一个 Pod 的 `/test` 下创建的文件,两个 Pod 下的 `/test` 路径下均存在此文件,说明两个 Pod 共享一个 NAS。
kubectl delete pod web-5c4d7f****-8f9qx web-5c4d7f****-brvch web-5c4d7f****-xltnr
预期输出:
pod "web-5c4d7f****-8f9qx" deleted pod "web-5c4d7f****-brvch" deleted pod "web-5c4d7f****-xltnr" deleted
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE web-5c4d7f****-8l78w 1/1 Running 0 53s web-5c4d7f****-r5282 1/1 Running 0 53s web-5c4d7f****-vbswz 1/1 Running 0 53s
说明
可以看到 Pod 自动完成重建并且名称与原来不同。
Pod/test
路径下的文件。kubectl exec web-5c4d7f****-8l78w ls /test
预期输出:
nas
Pod/test
路径下的文件。kubectl exec web-5c4d7f****-vbswz ls /test
预期输出:
nas
nas
并没有被随着 Pod 的删除而删除,即 NAS 的数据可持久保存。