使用阿里云CSI Plugin实现LVM数据卷动态扩容

简介: 概要 LVM存储类型为本地存储,并非可随着Pod迁移的可插拔的分布式存储方案,如果Pod期望在多个节点上使用相同的lvm卷,则需要在每个节点上都创建相同名字的lvm卷,这样Pod调度的时候可以继续使用相同的lvm卷名进行挂载。

概要

LVM存储类型为本地存储,并非可随着Pod迁移的可插拔的分布式存储方案,如果Pod期望在多个节点上使用相同的lvm卷,则需要在每个节点上都创建相同名字的lvm卷,这样Pod调度的时候可以继续使用相同的lvm卷名进行挂载。然而这样势必会造成有些节点上的lvm卷空间浪费,解决浪费的问题,可以通过将pod固定在某个节点运行,减少调度,这样只会在这个节点上创建需要的lvm卷。

阿里云容器服务CSI插件支持LVM数据卷的挂载、管理功能,可以动态创建LVM卷并挂载使用。且在最新的版本中可以通过修改pvc的大小,动态扩容lvm卷的大小,在重启应用Pod时进行文件系统扩容。

LVM实现原则:

Provision Lvm数据卷的过程中,只会创建lvm类型pv对象,不会真正在节点上创建lvm volume;

创建lvm卷需要在已有的vg基础上进行,即需要手动在集群中创建vg;

Pod启动的时候,检查本地是否有相应的LVM卷,如果没有这个卷,则会创建lvm卷并挂载;

如果Pod启动时,lvm卷已经存在,则检查卷大小和需求是否一致,实际卷小于pv需求时,进行lvm扩容;

目前没有实现删除lvm卷的功能,需要手动到节点删除;

部署CSI LVM插件

1. 创建K8S集群

在阿里云ACK控制台创建1.14版本k8s集群,创建集群时选择使用csi类型插件;

2. 调整集群参数,使支持CSI扩容

更新kube-controller参数,在/etc/kubernetes/manifests/kube-controller-manager.yaml中添加:

- --feature-gates=ExpandCSIVolumes=true

在所有负载节点更新kubelet参数,在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 添加:

--feature-gates=ExpandCSIVolumes=true

重启kubelet:

systemctl daemon-reload
service kubelet restart

3. 部署CSI LVM插件

下载LVM Plugin、Provisioner模板:

https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/lvm-plugin.yaml
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/lvm-provisioner.yaml
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/resizer/csi-resizer.yaml

创建CSI组件:

# kubectl create -f lvm-plugin.yaml
# kubectl create -f lvm-provisioner.yaml
# kubectl create -f csi-resizer.yaml

检查插件部署完成:

# kubectl get pod -nkube-system | grep lvm
csi-lvm-plugin-6kx6z                                  2/2     Running   0          16h
csi-lvm-plugin-cgd7j                                  2/2     Running   0          16h
csi-lvm-plugin-kg5pn                                  2/2     Running   0          16h
csi-lvm-plugin-ld7rz                                  2/2     Running   0          16h
csi-lvm-plugin-xjmmr                                  2/2     Running   0          16h
csi-lvm-provisioner-0                                 1/1     Running   1          16h
csi-lvm-resizer-0                                     1/1     Running   0          16h

# kubectl get csidriver | grep lvm
lvmplugin.csi.alibabacloud.com    2019-10-09T07:51:14Z

部署应用使用LVM卷

1. 创建StorageClass:

下载StorageClass模板:

https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/resizer/storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-lvm
provisioner: lvmplugin.csi.alibabacloud.com
parameters:
    vgName: vgtest
reclaimPolicy: Delete
allowVolumeExpansion: true

provisioner: 配置为lvmplugin.csi.alibabacloud.com 驱动;

parameters:定义生成lvm卷参数;vgName定义lvm数据卷依赖的vg名字,vg需要预先在集群中创建;

allowVolumeExpansion:配置为true时,允许数据卷实现扩容功能;

# kubectl get sc | grep lvm
csi-lvm                    lvmplugin.csi.alibabacloud.com    19h

2. 创建PVC

下载PVC模板:

https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/pvc.yaml

# kubectl create -f pvc.yaml

# kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
lvm-pvc   Bound    lvm-7726e77b-eb2b-11e9-a442-00163e07fb69   2Gi        RWO            csi-lvm        3s

# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
lvm-7726e77b-eb2b-11e9-a442-00163e07fb69   2Gi        RWO            Delete           Bound    default/lvm-pvc   csi-lvm                 14s

3. 创建应用

下载应用模板:

https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/deploy.yaml

可以在模板中添加nodeSelector(nodeName)来限制pod启动的节点;

# kubectl create -f deploy.yaml

# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
deployment-lvm-cddcd84fb-5rkrj   1/1     Running   0          12s

// Pod内部挂载的lvm卷大小为2G;
# kubectl exec deployment-lvm-cddcd84fb-5rkrj df | grep data
/dev/mapper/vgtest-lvm--7726e77b--eb2b--11e9--a442--00163e07fb69   1998672    6144   1871288   1% /data

到pod所在节点检查lvm卷信息,大小为2G:

# lvdisplay /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  --- Logical volume ---
  LV Path                /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  LV Name                lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  VG Name                vgtest
  LV UUID                hKsRqO-oG1w-0uE1-6Unz-hpP9-le4N-pGVzDS
  LV Write Access        read/write
  LV Creation host, time iZ8vb1wy4teeoa0ql4bjq3Z, 2019-10-10 14:59:23 +0800
  LV Status              available
  # open                 1
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3

原理:Pod启动时在其运行的节点上,自动创建lvm数据卷(vg下面)并挂载使用;

4. lvm卷扩容

扩容PVC,从2G变成3G,扩容后PV已经变成了3G,但pvc需要pod重启后(文件系统扩容)才可以变成3G;

// expand pvc from 2G to 3G
# kubectl patch pvc lvm-pvc -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'
persistentvolumeclaim/lvm-pvc patched

# kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
lvm-pvc   Bound    lvm-7726e77b-eb2b-11e9-a442-00163e07fb69   2Gi        RWO            csi-lvm        9m33s

# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
lvm-7726e77b-eb2b-11e9-a442-00163e07fb69   3Gi        RWO            Delete           Bound    default/lvm-pvc   csi-lvm                 9m34s

原理:此时lvm数据卷并没有变化,只是pv对象的size变化;lvm卷大小和文件系统大小都是在pod启动挂载卷的时候执行扩容的。

重启Pod,实现lvm卷扩容:

# kubectl delete pod deployment-lvm-cddcd84fb-5rkrj

# kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
lvm-pvc   Bound    lvm-7726e77b-eb2b-11e9-a442-00163e07fb69   3Gi        RWO            csi-lvm        5m24s

// Pod内部挂载的lvm卷也已经扩容到3G;
# kubectl exec deployment-lvm-cddcd84fb-dsmxx df | grep data
/dev/mapper/vgtest-lvm--7726e77b--eb2b--11e9--a442--00163e07fb69   3030800    6144   2861476   1% /data

登陆pod所在节点,查看lvm卷信息:

# lvdisplay /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  --- Logical volume ---
  LV Path                /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  LV Name                lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
  VG Name                vgtest
  LV UUID                hKsRqO-oG1w-0uE1-6Unz-hpP9-le4N-pGVzDS
  LV Write Access        read/write
  LV Creation host, time iZ8vb1wy4teeoa0ql4bjq3Z, 2019-10-10 14:59:23 +0800
  LV Status              available
  # open                 1
  LV Size                3.00 GiB
  Current LE             768
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3

更多使用细节请参考:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/docs/lvm-resizer.md

欢迎加入CSI技术交流钉钉群:
image

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 Kubernetes Cloud Native
一文读懂容器存储接口 CSI
在《一文读懂 K8s 持久化存储流程》一文我们重点介绍了 K8s 内部的存储流程,以及 PV、PVC、StorageClass、Kubelet 等之间的调用关系。接下来本文将将重点放在 CSI(Container Storage Interface)容器存储接口上,探究什么是 CSI 及其内部工作原理。
一文读懂容器存储接口 CSI
|
存储 Kubernetes 数据可视化
|
8月前
|
存储 人工智能 JSON
构建AI智能体:十九、优化 RAG 检索精度:深入解析 RAG 中的五种高级切片策略
本文详细介绍了RAG(检索增强生成)系统中的文本切片策略。RAG切片是将长文档分割为语义完整的小块,以便AI模型高效检索和使用知识。文章分析了五种切片方法:改进固定长度切片(平衡效率与语义)、语义切片(基于嵌入相似度)、LLM语义切片(利用大模型智能分割)、层次切片(多粒度结构)和滑动窗口切片(高重叠上下文)。作者建议根据文档类型和需求选择策略,如通用文档用固定切片,长文档用层次切片,高精度场景用语义切片。切片质量直接影响RAG系统的检索效果和生成答案的准确性。
1578 11
|
JSON Go 数据格式
Golang 对象深拷贝的方案以及性能比较
文章探讨了在Go语言中实现对象深拷贝的三种方法:使用gob序列化、JSON序列化和定制化拷贝,并对比了它们在性能和代码复杂度方面的优劣,建议根据具体需求选择最适合的方法。
605 1
|
资源调度 分布式计算 Kubernetes
给 K8s 装上大数据调度引擎:伏羲架构升级 K8s 统一调度
飞天伏羲作为有着十多年历史的调度团队,在服务好 MaxCompute 大数据平台的过程中,一直在不断通过自我革新赶超业界先进水平,我们经历了 Fuxi 2.0 的这样的大规模升级,今天通过 K8s 统一调度项目又再次实现了系统架构的蜕变,将大数据平台强大的调度能力赋予 K8s 系统,同时去拥抱 K8s 周边丰富的生态。除了集团弹内集群,将来我们在公共云、专有云等多个场景,也会以 K8s 统一调度的方式进行输出,以更好地服务云上的用户,敬请期待!
3073 110
给 K8s 装上大数据调度引擎:伏羲架构升级 K8s 统一调度
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
机器学习/深度学习 安全 算法
《联邦学习:打破数据孤岛,实现隐私保护下的跨机构协作》
联邦学习是一种分布式机器学习技术,核心理念为“数据不动模型动”,即在不交换原始数据的前提下,各机构基于本地数据独立训练模型,并通过加密方式上传模型参数更新至中央服务器进行聚合,从而提升全局模型性能。它分为横向、纵向和联邦迁移学习三种类型,分别适用于不同场景下的数据协作。联邦学习有效解决了数据隐私保护与跨机构协作的难题,在医疗、金融等领域展现出巨大潜力,推动了智能化变革。尽管仍面临通信效率、安全性和可解释性等挑战,但其前景广阔。
1802 25
|
Kubernetes Cloud Native 安全
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
|
Kubernetes 安全 数据安全/隐私保护
【K8S系列】深入解析k8s网络插件—Weave Net
【K8S系列】深入解析k8s网络插件—Weave Net
2092 0
|
IDE 物联网 Unix
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上