Kubernetes应用通常需要持久化存储来保存数据。ACK通过标准的容器存储接口CSI,集成了多种阿里云存储服务(如云盘、OSS、NAS、CPFS等),并兼容Kubernetes原生存储机制,为不同业务场景提供存储解决方案。
存储方案选型
ACK的存储方案分为两类:
Kubernetes原生存储卷:用于临时数据、配置管理或与节点的交互。生命周期通常与Pod绑定,不适用于需要持久化保存应用数据的场景。
阿里云持久化存储卷:通过CSI组件集成,为工作负载提供稳定、可靠的数据持久化能力。生命周期独立于Pod,可用于有状态应用。
使用容器存储功能前,确保已了解相关概念,如存储卷、PV、PVC等,详见存储基础知识。
Kubernetes 原生存储卷
Kubernetes原生存储卷的生命周期通常与Pod绑定,不适用于需要持久化保存应用数据的场景。
类型 | 说明 | 核心特点 |
emptyDir | 与Pod生命周期相同的临时空目录。 | Pod删除后数据即丢失。可用于Pod内容器间数据交换或临时缓存。 |
HostPath | 将节点宿主机上的文件或目录挂载到Pod中。可通过 详见HostPath数据卷 | 数据与节点绑定,不随Pod迁移。不适用于需要高可用和持久化存储的有状态应用(如数据库、缓存)。 |
ConfigMap/Secret | 以文件形式挂载配置项或敏感凭据。 | 仅用于存储小体积配置数据,非业务数据。用于将配置与应用解耦。 |
阿里云持久化存储卷
对于需要持久化存储数据的有状态应用,应选择由阿里云存储服务提供的持久化存储卷。这些存储卷的生命周期独立于Pod,通过CSI实现与Kubernetes的集成。
方案对比
为便于快速选型,表格中各存储方案的标题下方提供了部分核心属性的快速索引。以云盘为例:
云盘:方案详细说明。单击可查看详情。静态/动态:方案支持的存储卷挂载方式,包括静态存储卷(PV/PVC)和动态存储卷(StorageClass/PVC)。单击可查看具体操作文档。
RWO:方案支持的存储卷访问模式(
accessModes),包括RWO(ReadWriteOnce)、RWX(ReadWriteMany)、ROX(ReadOnlyMany)。计费:方案计费说明。单击可查看详情。
存储方案 | 说明 | 权衡与限制 |
|
| |
|
| |
RWX、ROX | 计费 |
|
|
|
| |
|
|
除基础性能外,不同存储方案在故障恢复、容量管理和数据保护等运维场景中也存在差异,可从以下几个问题进一步规划选型。
关键组件与概念
CSI组件(csi-plugin、csi-provisioner)
Kubernetes社区推荐的存储插件实现方案,已在集群中默认部署。负责与阿里云存储服务的API进行交互,实现存储卷的自动创建、挂载、卸载等全生命周期管理。详见管理CSI组件。
容器网络文件系统 (CNFS)
ACK托管集群Pro版提供的存储增强功能,将NAS、OSS、CPFS等抽象为Kubernetes CRD对象,提供更精细化的管理能力,如子目录动态创建、配额管理、IO性能监控、回收站、分布式缓存等。详见容器网络文件系统CNFS。
使用说明
使用CSI时需注意以下使用限制。
集群版本:需为1.14及以上。如需升级,请参见手动升级集群。
集群环境:已在ACK集群中完成全面适配和验证。对于非ACK集群(非阿里环境集群、阿里云自建集群),由于配置、权限、网络等环境差异,CSI无法保证开箱即用。
建议参见alibaba-cloud-csi-driver源码并结合自身环境进行适配。
节点配置:kubelet运行参数
--enable-controller-attach-detach为true。操作系统:不支持Windows节点。
RBAC权限:PV是集群级别的资源,PVC是命名空间级别的资源。进行RBAC授权时,需注意不同角色对这两类资源的权限差异。
如果ACK默认提供的预置角色(管理员、运维人员等)无法满足需求,请配置自定义权限。例如,ACK默认的运维人员角色对PVC有读写权限,但对PV仅有只读权限,因此无法手动创建PV。详见使用RBAC为集群内资源操作授权。
FAQ
如何判断集群使用的存储插件模式?
可选择以下方式查看。
通过控制台查看节点注释
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在节点列表的操作列,单击详情,在基本信息页签下查看节点注释。
若存在
volumes.kubernetes.io/controller-managed-attach-detach: true,表示存储插件为CSI;若不存在,则为Flexvolume。
通过命令查看kubelet参数
登录节点,查看kubelet参数。
ps -ef | grep kubelet预期输出:
--enable-controller-attach-detach=truetrue:存储插件为CSI。false:存储插件为Flexvolume。
如何手动为CSI授权?
CSI在执行存储卷的挂载、卸载、创建、删除等操作时,需要被授予访问其他产品资源的相应权限。通常情况下,集群已默认安装CSI且配置相关权限。如需手动授权,可参见以下内容。
使用RAM角色授权(默认):CSI使用AliyunCSManagedCsiRole角色来访问其他云产品资源,详见容器服务ACK服务角色。
ACK托管集群:CSI使用的RAM角色权限的Token被保存在名为addon.csi.token的Secret中。可挂载该Secret,从而实现RAM角色授权。
ACK专有集群:CSI继承其Pod所在节点的RAM角色。
关于如何为RAM角色授权,请参见管理RAM角色的权限。
使用AccessKey授权
通过环境变量:将AccessKey创建为Kubernetes Secret,再通过环境变量的方式注入到CSI的Pod中,避免在部署模板中明文暴露密钥。
直接写入YAML:直接在CSI的YAML中写入AccessKey信息。不推荐在生产环境使用。