NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于大数据分析、共享数据、Web应用以及保存日志等场景。通过CSI组件可以使用已有的NAS创建PV和PVC,并在工作负载中挂载,实现数据的持久化存储和共享存储。
静态存储卷:需预先创建PV(如NAS文件系统)来代表已有的存储资源。应用通过创建PVC来“匹配”并申请使用此PV。常用于纳管存量存储资源。但其绑定的PVC默认不支持在线扩容。
动态存储卷:无需预先创建PV。应用创建PVC时,系统会根据PVC指定的StorageClass,按需自动创建一个全新的存储卷及与之对应的PV。此模式更灵活,且支持存储卷扩容。
前提条件
注意事项
NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上,可能出现多个Pod同时写入数据的问题,需应用自行确保数据一致性。
关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
若在应用模板中配置了
securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行chmod或chown操作,导致挂载时间延长。若已配置securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。挂载NAS存储卷后,请勿删除NAS挂载点,否则会造成系统无响应。
挂载NAS静态存储卷(kubectl)
步骤一:创建PV
修改以下YAML内容,并保存为pv-nas.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必须与PV Name保持一致。 volumeAttributes: server: "0c47****-mpk25.cn-shenzhen.nas.aliyuncs.com" # NAS挂载点地址。挂载点所属VPC必须与集群所属VPC一致。 path: "/csi" # 挂载子目录。 mountOptions: - nolock,tcp,noresvport - vers=3参数
说明
namePV的名称。
labels设置PV的标签。
storagePV的容量。
accessModes配置访问模式,默认为
ReadWriteMany,也支持ReadWriteOnce和ReadOnlyMany。driver驱动类型。此处必须配置为
nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。volumeHandle配置PV的唯一标识符,必须与PV Name保持一致。若需要同时使用多个PV,则各个PV中该值须唯一。
serverNAS挂载点地址。挂载点所属VPC必须与集群所属VPC一致。
关于如何查看挂载点地址,请参见管理挂载点。
path要挂载的NAS子目录。
如果未设置,则默认挂载到根目录。
如果NAS中没有该目录,会自动创建后再进行挂载。
说明通用型NAS的根目录为
/,极速型NAS的根目录为/share。挂载极速型NAS的子目录时,path必须以/share开头,如/share/data。mountOptionsNAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。
创建PV。
kubectl create -f pv-nas.yaml查看PV。
kubectl get pv预期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-nas 5Gi RWX Retain Available <unset> 25s
步骤二:创建PVC
将以下YAML内容保存至pvc-nas.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas参数
说明
namePVC名称。
accessModes访问模式。默认为
ReadWriteMany,也支持ReadWriteOnce或ReadOnlyMany。storage声明所需使用的存储卷的容量。
matchLabels输入PV的标签,用于关联PV。
创建PVC。
kubectl create -f pvc-nas.yaml查看PVC。
kubectl get pvc预期返回如下,可以看到PVC已关联PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-nas Bound pv-nas 5Gi RWX <unset> 5s
步骤三:创建应用并挂载NAS
将以下YAML内容保存为nas.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas参数
说明
mountPathNAS在容器中挂载的位置。
claimNamePVC的名称,用于绑定PVC。
创建Deployment并挂载NAS。
kubectl create -f nas.yaml查看Deployment中Pod的部署情况。
kubectl get pod -l app=nginx预期返回:
NAME READY STATUS RESTARTS AGE nas-test-****-***a 1/1 Running 0 32s nas-test-****-***b 1/1 Running 0 32s
验证NAS的共享存储和持久化存储
按照上文示例创建的Deployment中含有2个Pod,2个Pod挂载了同一NAS文件系统。您可以通过以下方式进行验证:
在一个Pod中创建文件,然后另一个Pod中查看文件,以此来验证共享存储。
重建Deployment,然后在新创建的Pod中查看文件系统中的数据是否存在,以此来验证持久化存储。
查看Pod信息。
kubectl get pod | grep nas-test返回示例如下:
nas-test-*****a 1/1 Running 0 40s nas-test-*****b 1/1 Running 0 40s验证共享存储。
在一个Pod中创建文件。
以名为
nas-test-*****a的Pod作为示例:kubectl exec nas-test-*****a -- touch /data/test.txt在另一个Pod中查看文件。
以名为
nas-test-*****b的Pod作为示例:kubectl exec nas-test-*****b -- ls /data预期返回如下,可以看到已共享新建的文件
test.txt。test.txt
验证持久化存储。
重建Deployment。
kubectl rollout restart deploy nas-test查看Pod,等待新Pod创建成功。
kubectl get pod | grep nas-test返回示例如下:
nas-test-*****c 1/1 Running 0 67s nas-test-*****d 1/1 Running 0 49s在新Pod中查看文件系统中的数据是否存在。
以名为
nas-test-*****c的Pod作为示例:kubectl exec nas-test-*****c -- ls /data预期返回如下,可以看到NAS文件系统中的数据依然存在,在新Pod的挂载目录下可以重新获取。
test.txt
常见问题
在挂载和使用NAS存储卷的过程中,如果遇到问题,可参考以下文档进行排查。