阿里云 ACK 使用 NAS 在 Pod 间共享数据
当您在ACK集群中运行工作负载时,您可能会有应用数据持久化存储、敏感和配置数据存储、存储资源动态供应等存储需求。ACK集群基于CSI插件实现了容器存储功能,借助阿里云存储服务提供并管理静态或动态存储卷资源。
准备条件
- 已创建ACK托管集群、ACK Serverless集群 v1.28.3+
- 已通过 kubectl 工具连接集群
ACK 存储方案
方案选型
容器存储接口(CSI)插件是当前Kubernetes社区推荐的插件实现方案。容器服务ACK的容器存储功能基于CSI插件实现,深度融合块存储EBS、文件存储NAS、CPFS、对象存储OSS、本地盘等,完全兼容Kubernetes原生的存储卷类型,例如EmptyDir、HostPath、Secret、ConfigMap等。CSI插件支持的存储卷如下。
阿里云NAS 支持静态、动态存储卷,常用于以下业务场景:
业务场景 | 场景描述 |
---|---|
共享数据场景 | NAS支持多个Pod同时访问一份数据,如果您有共享数据需求,推荐使用NAS。 |
大数据分析场景 | NAS提供了较高的数据吞吐能力,能满足大批量作业对共享存储访问的需求。 |
Web应用场景 | 为Web应用、内容管理系统提供存储支撑。 |
保存日志场景 | 如果您希望将日志保存到存储卷,推荐使用NAS存储卷。 |
本案例以 NAS 文件存储 + K8S 社区 csi-plugin 和 csi-provisioner 组件来实现 Pod 间共享数据,满足 90% 以上业务场景。
NAS存储卷使用限制:
- NAS为共享存储,可以同时为多个Pod提供共享存储服务,即一个PVC可以同时被多个Pod使用。
- CSI组件不支持挂载SMB协议的NAS文件系统,推荐使用NFSv3协议的文件系统挂载。
- NAS不支持跨VPC挂载,仅支持挂载到同一VPC的集群中。
- 通用型NAS与极速型NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。|
ACK 组件安装或升级
存储相关组件 csi-plugin、csi-provisioner、storage-operator已升级至最新版本。
通过CNFS管理NAS文件系统
容器网络文件系统CNFS(Container Network File System)将阿里云的文件存储抽象为一个K8s对象(CRD)进行独立管理,包括创建、删除、描述、挂载、监控及扩容等运维操作,为了提升NAS文件系统的性能,您可以通过CNFS管理NAS文件系统,以提升NAS文件系统的性能和QoS控制,实现对文件系统层的独立管理。本文介绍如何使用CNFS托管NAS文件系统及CNFS在工作负载中的应用。
方式一:使用CNFS创建默认NAS文件系统
-
创建容器网络文件系统CNFS
配置说明:
-
创建动态存储类StorageClass
配置说明:
-
创建PVC
配置说明:
-
在目标应用中挂载PVC
查看 cnfs 状态
$ kubectl get cnfs
NAME AGE
cnfs-nas-c27e277860bce4ef48ef172ef509320d5 108d
cnfs-nas1-c27e277860bce4ef48ef172ef509320d5 7h47m
$ kubectl describe cnfs cnfs-nas1-c27e277860bce4ef48ef172ef509320d5
Name: cnfs-nas1-c27e277860bce4ef48ef172ef509320d5
Namespace:
Labels: <none>
Annotations: <none>
API Version: storage.alibabacloud.com/v1beta1
Kind: ContainerNetworkFileSystem
Metadata:
Creation Timestamp: 2024-08-08T05:50:59Z
Finalizers:
protection.alibabacloud.com/cnfs
Generation: 6
Resource Version: 62222883
UID: 661b81d0-e8fc-4f72-bf3a-6b1f7f943ade
Spec:
Create Storage Class: true
Description: cnfs-nas1
Parameters:
Storage Type: Capacity
Reclaim Policy: Retain
Type: nas
Status:
Conditions:
Last Probe Time: 2024-08-08 13:51:29
Reason: The nas filesystem and mount target complete initialization.
Status: Ready
Fs Attributes:
Access Group Name: DEFAULT_VPC_GROUP_NAME
Enable Trash Can: true
Encrypt Type: None
Filesystem Id: 1298584bdeb
Filesystem Type: standard
Protocol Type: NFS
Region Id: cn-hongkong
Server: 1298584bdeb-brt65.cn-hongkong.nas.aliyuncs.com
Storage Type: Capacity
Trash Can Reserved Days: 7
Use Client: NFSClient
V Switch Id: vsw-j6cxc0ie95khrb8tv8k7f
Vpc Id: vpc-j6cai8c8engjtf7zhbxl9
Status: Available # 状态正常
Events: <none>
查看存储卷 PV:
查看 NAS:
查看 Pod 挂载目录:
$ kubectl exec -it reborn-crmeb-pc-nuxt2ssr-0 -- /bin/bash
root@reborn-crmeb-pc-nuxt2ssr-0:/usr/src/app# ls -l lang/
total 272
-rw-r--r-- 1 root root 97789 Aug 8 11:10 en.json
-rw-r--r-- 1 root root 89514 Aug 8 11:10 zh-Hans.json
-rw-r--r-- 1 root root 88592 Aug 8 11:10 zh-Hant.json
# 容器内部查看挂载
root@reborn-crmeb-pc-nuxt2ssr-0:/usr/src/app# mount|grep nfs
1298584bdeb-brt65.cn-hongkong.nas.aliyuncs.com:/nas-ff8ac65e-a608-4cf4-8a32-a1af6c54aa5a on /usr/src/app/lang type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.15.208,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=10.0.15.208)
root@reborn-crmeb-pc-nuxt2ssr-0:/usr/src/app# exit
exit
$ kubectl exec -it reborn-crmeb-pc-nuxt2ssr-1 -- /bin/bash
root@reborn-crmeb-pc-nuxt2ssr-1:/usr/src/app# ls -l lang/
total 272
-rw-r--r-- 1 root root 97789 Aug 8 11:10 en.json
-rw-r--r-- 1 root root 89514 Aug 8 11:10 zh-Hans.json
-rw-r--r-- 1 root root 88592 Aug 8 11:10 zh-Hant.json
将 nas 挂载到一台主机看方便查看:
$ cd /mnt/
$ ls -l
total 1
drwxrwxrwx 2 root root 4096 Aug 8 19:10 nas-ff8ac65e-a608-4cf4-8a32-a1af6c54aa5a
$ ls -l nas-ff8ac65e-a608-4cf4-8a32-a1af6c54aa5a/
total 272
-rw-r--r-- 1 root root 97789 Aug 8 19:10 en.json
-rw-r--r-- 1 root root 89514 Aug 8 19:10 zh-Hans.json
-rw-r--r-- 1 root root 88592 Aug 8 19:10 zh-Hant.json