企业级运维之云原生与Kubernetes实战课程
第二章第5讲 阿里云容器服务集群存储
视频地址:https://developer.aliyun.com/learning/course/913/detail/14651
摘要:本讲主要内容为阿里云容器服务集群存储,包括CSI概述、存储卷特点、存储卷应用场景、集群存储常见问题。
目录
- CSI概述
- 存储卷特点和应用场景
- 集群存储常见问题
一、CSI概述
1. 阿里云容器服务集群存储概述
- CSI Controller的主要功能,是提供存储服务视角对存储资源和存储卷进行管理和操作。在Kubernetes中被部署为单实例Pod,使用StatefulSet控制器进行部署,设置副本数量为1,保证为一种存储插件只运行一个控制器实例。
- 存储插件持续监测PV和物理存储介质之间的关系,根据集群apiserver中的请求,当发现Pod需要挂载PVC时,会指挥节点内的kubelet组件把物理存储介质挂载到宿主机对应容器的目录内。
2. 常见存储插件类型
目前阿里云容器服务ACK (Alibaba Cloud Container Service for Kubernetes) 集群支持两种存储插件:Flexvolume和CSI,二者的区别和特点如下:
a. Flexvolume插件
Flexvolume插件是Kubernetes社区较早实现的存储卷扩展机制。ACK从上线起, 即支持Flexvolume类型数据卷服务。Flexvolume插件包括以下三部分:
- Flexvolume:负责数据卷的挂载、卸载功能。ACK默认提供云盘、NAS、OSS三种存储卷的挂载能力;
- Disk-Controller:负责云盘卷的自动创建能力;
- Nas-Controller:负责NAS卷的自动创建能力;
b. CSI插件
CSI插件是当前Kubernetes社区推荐的插件实现方案。ACK集群提供的CSI存储插件兼容社区的CSI特性。CSI插件包括以下两部分:
- CSI-Plugin:实现数据卷的挂载、卸载功能。ACK默认提供云盘、NAS、OSS三种存储卷的挂载能力;
- CSI-Provisioner:实现数据卷的自动创建能力,目前支持云盘、NAS两种存储卷创建能力。
使用推荐
- 针对新建集群,推荐使用CSI插件。ACK会跟随社区持续更新CSI插件的各种能力。
- 针对已经创建的集群,仍然使用已经安装的存储插件类型。ACK会持续支持Flexvolume插件。
存储有三种对象:PV、PVC、Storage class(存储类)。
3. 如何为Pod挂载云盘或OSS存储呢?
登录阿里云平台,在容器服务集群中,依次创建存储类、存储卷、存储声明;然后创建无状态应用,在选择数据卷时进行存储挂载,依次点击“下一步”将应用创建成功。
注意:
- 如果使用存储类型的是云盘存储,则在创建应用时不能创建多副本,因为云盘不是共享存储,无法挂载到多个副本上;
- 如果创建过程中出现报错,可以点击“事件”查看报错信息,如:Pending 0/4 nodes are avaliable:1 insuffcient cpu xxx的报错信息,根据报错进行分析处理。
4. 存储CSI概述
阿里云容器服务ACK的容器存储功能,基于Kubernetes存储系统,深度融合阿里云存储服务,并完全兼容Kubernetes原生的存储服务,例如EmptyDir、HostPath、Secret、ConfigMap等存储。ACK基于社区容器存储接口(CSI),通过部署CSI插件实现了阿里云存储服务接入能力。
块存储和文件存储支持动态挂载到Pod上,而对象存储不支持动态存储,文件存储和对象存储是共享存储,支持多个Pod同时挂载,而块存储不支持该功能。
二、存储卷特点和应用场景
1. 阿里云云盘
- 特点:支持动态和静态存储卷,但非共享存储,每个云盘只能在单个节点上挂载。
- 应用场景:
- 高IO、低延时场景。云盘块存储设备适用于对IO、延迟要求较高的应用场景,例如:数据库、中间件等服务;
- 非共享场景云盘卷是独享模式,同时只能给一个Pod使用,在非共享数据业务场景可以考虑使用云盘卷。
2. 本地卷
- 特点:低延迟、高IO,非高可用。
- 应用场景:
- 本地临时文件存储如果您期望将非高可用数据保存在本地,可以通过LVM卷进行存储管理。
- IO要求高、自带高可用场景有些业务对IO要求很高,且应用自带高可用方案,例如:MySQL;可以使用LVM卷。
- 大数据分析场景Spark等类型的大数据分析场景,可以用LVM卷替代共享本地盘的方案。
三、CSI常见问题
1. 使用云盘时,提示The specified disk is not a portable disk。
- 问题原因:申请了包年包月的云盘,或者在升级ECS时,把ECS关联的云盘一起升级为包年包月。
- 解决方法:将云盘的付费方式改为按量付费。
2. 在启动挂载云盘的Pod的时候,出现Pod无法启动的情况并报错had volume node affinity conflict。
- 问题原因:PV中编写了nodeaffinity属性,这个属性与Pod中声明的属性不一致,导致Pod无法被调度到正确的节点上。
- 解决方法:修改PV或者Pod的属性,使二者属性保持一致。
3. 在启动挂载云盘的Pod时,无法找到对应diskid。
- 问题原因:在编写PV的时候输入了错误的diskid或者账号无权限操作diskid,可能不是当前账号的diskid。
- 解决方法:更换diskid。
4. 创建PV失败,PVC Event提示The specified AZone inventory is insufficient。
- 问题原因: ECS库存不足,导致创建云盘失败。
- 解决方法:更换云盘类型或者更换Azone。
5. 动态创建PV失败, 提示disk size is not supported。
- 问题原因:在PVC中指定的云盘大小不符合规范,要求最小20 Gi。
- 解决方法:调整PVC中云盘的大小,使其符合规范。
6. 磁盘出现阻塞, kubelet日志出现下以下大量报错。
Operation for "{volumeName:kubernetes.io/csi/diskplugin.csi.alibabacloud.com^d-2zejaz33icbp2vvc9le PodName: nodeName:}" failed. No retriespermitted until 2020-11-0514:38:12.653566679 +0800 CST m=+9150650.781033052 (durationBeforeRetry 2m2s). Error:"Mou\"d-2zejaz33icbp2vvvc9le\"(UniqueName:\"kubernetes.io/csi/diskplugin.csi.alibabacloud.com^d-2zejaz33icbp2vvvc9le\") Pod\"Pod-e5ee2d454cdb4d1d916d933495e56cbe-3584893\"(UID:\"f8d71e90-d934-4d5a-b54f-62555da5df22\"): rpc error: code= Aborted desc =NodeStageVolume: Previous attach action is still in processntVolume.MountDevice failed for volume
- 问题原因:使用的是旧版本的CSI, 旧版本的CSI使用了blkid通过uuid获取盘符。由于使用快照恢复的云盘有着相同的uuid,导致blkid命令卡死。
- 解决方法:重启当前节点,或升级CSI到最新版本。
7. 启动Pod时,出现FailedMount警告。
- 问题原因:一般出现在新增的节点。由于CSI的Pod是和业务Pod一起启动, 且CSI注册需要一定时间,所以业务Pod开始挂载的时候, CSI还没有注册完成,导致出现警告。
- 解决方法:无需处理,不影响Pod启动。
8. Pod卸载失败,并且Kubelet出现不受ACK管理的Pod日志。
- 问题原因:Pod异常退出,导致数据卷挂载点在卸载过程中没有清理干净,最终导致Pod无法删除。Kubelet的GC流程对数据卷垃圾回收实现并不完善,目前需要手动或脚本自动化实现垃圾挂载点的清理工作。
- 解决方法:在问题节点运行以下脚本,对垃圾挂载点进行清理。
sh kubelet.sh
9. 使用NAS时,提示chown:option not permitted。
- 问题原因:您的容器没有权限使用该NAS。
- 解决方法:使用root权限启动容器。