云容器引擎服务提供cstor-csi插件,支持通过LVM方式,基于容器集群节点上的硬盘,虚拟化成一个小型存储池,当需要特定份额的存储时,从中划分出对应份额的磁盘供业务容器使用。
使用LocalPV、HostPath都可以实现Pod对主机存储空间的访问,但均具有一定局限性,比如无法做到容量隔离、无法限制IOPS/吞吐等、无法直观了解各节点存储空间余量从而进行合理调度。基于此,云容器引擎提供LVM数据卷方案,以解决上述问题。
前提条件
- 已创建容器集群
- 该功能使用风险、限制较多,默认控制台不对外开放。如需使用,请通过工单方式联系相关人员添加功能白名单。
- 安装存储插件cstor-csi,插件配置参数localStorPlugins开启lvm插件。如插件已安装,可以通过“插件实例”——“cstor-csi”——“更新”,配置localStorPlugins: "lvm,localpv",实现插件配置更新。
使用限制
- cstor-csi插件安装版本要求3.4.0及以上;
- 如果节点池默认配置数据盘,那么新增节点的第一块数据盘(供容器运行时和Kubelet组件使用)不支持导入为存储池。
- 创建存储池将占用磁盘设备,必要时会进行格式化操作。为避免数据丢失,请务必确认磁盘设备存在,并可用于存储池。
- 存储池配置或者修改,默认10min生效,如需调整,可以更新cstor-csi插件配置参数configEffectInterval实现。
- 存储池不支持缩容和删除;如果删除节点上存储池的磁盘,会导致存储池异常。
- LVM本地存储卷,不支持数据的跨节点迁移,不适合在高可用场景中使用。
- 请勿自行对节点上的本地存储资源(例如VG,PV,LV)以及插件运行需要的CRD(包括NodeStorageManager、CStorLocalStorage)进行修改或删除;
流程概述
步骤 |
操作 |
---|---|
1 | 确定要使用LVM数据卷的节点以及磁盘设备。推荐对指定节点新增数据盘,专用于存储池。 |
2 | 创建本地存储池 |
3 | 创建本地存储类StorageClass |
4 | 创建本地存储类型PVC |
5 | 基于已创建PVC,创建工作负载 |
通过控制台使用LVM动态存储卷
1、创建存储池
- 登录“云容器引擎管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“存储”——“本地存储池”,单击左上角“创建存储池”;
- 在创建对话框,配置存储池相关参数。配置项说明如下:
配置项 |
说明 |
---|---|
名称 | 存储池名称 |
存储类型 | 这里选择LVM |
选择节点 | 选择用于添加到存储池的节点。 |
磁盘设备 | 选择用于添加到存储池的磁盘设备。 说明: 创建存储池将占用磁盘设备,必要时会进行格式化操作。为避免数据丢失,请务必确认磁盘设备存在,并可用于存储池 |
参数配置完成后,点击“确定”。创建成功后,可以在存储池列表查看。
2、创建存储类(StorageClass)
- 登录“云容器引擎管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“存储”——“存储类”,单击左上角“创建”;
- 在创建对话框,配置存储类StorageClass的相关参数。配置项说明如下:
配置项 | 说明 |
---|---|
名称 | StorageClass的名称。 |
存储类型 | 当前支持云盘、弹性文件、对象存储、本地存储、并行文件,这里选择本地存储。 具体创建页中展示的存储类型由当前资源池支持情况决定。 |
存储驱动 | 对应StorageClass yaml中provisioner,值为local.csi.cstor.com |
回收策略 | 回收策略,默认为Deleted。Retained(保留):用户可以手动回收资源。当PVC对象被删除时,PV 卷仍然存在,对应的数据卷被视为"已释放(released)"。 Deleted(删除):对于支持 Delete 回收策略的卷插件,删除动作会将PV对象从 Kubernetes 中移除,同时也会从外部基础设施中移除所关联的存储资产。如果对数据安全性要求高,推荐使用Retain方式,以免误删数据。 |
绑定策略 | 绑定策略,默认为Immediate。 Immediate 模式:表示一旦创建了 PVC,也就完成了卷绑定和动态供应。 对于由于拓扑限制而非集群所有节点可达的存储后端,PV会在不知道 Pod 调度要求的情况下绑定或者制备。WaitForFirstConsumer模式: 该模式将延迟 PV的绑定和制备,直到使用该 PVC的 Pod 被创建。 PV会根据 Pod 调度约束指定的拓扑来选择或供应。 |
参数 | 本地存储类型:参数键为type;该场景下选择lvm。存储池:参数键为baseStor,选择上一步创建的存储池。 挂在类型:参数键为csi.storage.k8s.io/fstype,支持参数值包括ext4、xfs。 |
挂载选项 | 挂载参数,用户可根据自己的情况实际定制相关参数。 |
- 参数配置完成后,点击“确定”。创建成功后,可以在存储类列表查看。
2、创建持久卷声明(PVC)
- 进入主菜单“存储”——“持久卷声明”,单击左上角“创建持久卷声明”;
- 在创建对话框,配置持久卷声明PVC的相关参数。配置项说明如下:
配置项 |
说明 |
---|---|
名称 | PVC的名称 |
存储声明类型 | 当前支持云盘、弹性文件、对象存储、本地存储、并行文件,这里选择本地存储。具体创建页中展示的存储类型由当前资源池支持情况决定。 |
分配模式 | 这里选择“使用存储类” |
StorageClass名称 | 选择上一步创建的StorageClass |
容量 | 根据业务需求自定义容量 |
卷模式 | * 文件系统(Filesystem):默认方式,该类型卷会被 Pod 挂载(Mount) 到某个目录。 如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前在设备上创建文件系统。* 块设备(Block):这类卷以块设备的方式交给 Pod 使用,其上没有任何文件系统。 这种模式对于为 Pod 提供一种使用最快可能方式来访问卷而言很有帮助, Pod 和卷之间不存在文件系统层。 |
访问模式 | * ReadWriteOnce:卷可以被一个节点以读写方式挂载 |
- 参数配置完成后,点击“确定”。创建成功后,可以在持久卷声明列表查看。
- 进入持久卷声明列表页,等待PVC状态为“已绑定” 。此时,进入主菜单“存储”——“持久卷“,可以看到对应的PV创建 。
如果PVC一直未绑定,可以查看进入对应PVC详情页查看事件,或者查看cstor-csi日志进行定位。
3、创建工作负载
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“工作负载”——“有状态”,单击左上角“创建SatefulSet”;
- 在创建对话框,数据卷栏中,选择添加数据卷,卷类型选择“使用已有PVC”,操作栏选择“添加已有PVC”;
- 在实例内容器栏,为容器设置挂载点。选择添加挂载点,选择数据卷为上一步创建,根据需要配置容器路径和权限;
- 所有的信息都配置完成后,单击 “提交” 。
创建成功后,您就可以正常使用数据卷。
通过kubectl命令行使用LocalPV动态存储卷
1、创建存储类(StorageClass)
- 使用kubectl连接集群,创建示例yaml文件sc-example.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cstor-csi-local-lvm-sc
provisioner: local.csi.cstor.com
parameters:
# 产品类型
type: lvm
# 所需挂载文件系统,当前支持ext4和xfs
csi.storage.k8s.io/fstype: xfs
# 基础存储
baseStor: vg2
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
- 执行以下命令,创建StorageClass
kubectl apply -f sc-example.yaml
-
查看创建的StorageClass:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“存储类”,在存储类列表查看。
2、创建持久卷声明(PVC)
- 使用kubectl连接集群,创建示例yaml文件pvc-example.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cstor-pvc-local-lvm
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: cstor-csi-local-lvm-sc
- 执行以下命令,创建PVC
kubectl apply -f pvc-example.yaml
- 查看创建的PVC:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“持久卷声明”,在存储类列表查看。
3、创建工作负载
- 使用kubectl连接集群,创建示例yaml文件sts-example.yaml:
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
name: "lvm-sts"
namespace: "default"
spec:
podManagementPolicy: "OrderedReady"
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: "lvm-sts"
serviceName: ""
template:
metadata:
labels:
app: ""
ccse_app_name: ""
kubernetes.io/qos: "None"
name: "lvm-sts"
source: "CCSE"
spec:
containers:
- image: "nginx:1.23.2-alpine"
imagePullPolicy: "IfNotPresent"
name: "container1"
resources:
limits:
cpu: "100m"
memory: "128Mi"
requests:
cpu: "100m"
memory: "128Mi"
terminationMessagePath: "/dev/termination-log"
terminationMessagePolicy: "File"
volumeMounts:
- mountPath: "/tmp"
name: "volume1"
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: "cstor-pvc-local-lvm"
updateStrategy:
rollingUpdate:
partition: 0
type: "RollingUpdate"
- 执行以下命令,创建StatefulSet
kubectl apply -f sts-example.yaml
- 查看创建的有状态负载:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“有状态”,在存储类列表查看。
验证数据持久化
-
登录“云容器引擎”管理控制台;
-
在集群列表页点击进入指定集群;
-
进入主菜单“工作负载”——“有状态”,进入负载详情;
-
在Pod列表页,选择“远程登录”,进入到容器内执行以下命令:
1、向/tmp 目录下写一个文件,执行echo "Hello World" > /tmp/test.log
2、查看/tmp目录下文件,执行ls /tmp,预期结果如下:
lost+found test.log
- 退出pod的“远程登录”,对上一步中的Pod执行“销毁重建”,等待Pod重新运行正常;
- 对新建Pod,继续执行“远程登录”,进入到容器内查看数据。执行cat /tmp/test.log,预期结果如下:
Hello World
- 以上步骤说明,pod删除重建后,数据仍然存在,说明数据可持久化保存。