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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 概要 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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
关系型数据库 MySQL 数据挖掘
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
DTS 作为阿里云核心的数据交互引擎,以其高效的实时数据流处理能力和广泛的数据源兼容性,为用户构建了一个安全可靠、可扩展、高可用的数据架构桥梁。阿里云数据库 SelectDB 通过与 DTS 联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL / RDS MySQL / PolarDB for MySQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
|
2月前
|
API
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
|
17天前
|
关系型数据库 Apache 流计算
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
本文介绍了如何将数据从 OceanBase 迁移到阿里云数据库 SelectDB 内核版 Apache Doris。提供 3 种数据同步方法 1. 使用 DataX,下载 DataX 并编写配置文件,通过 OceanBaseReader 和 DorisWriter 进行数据迁移。 2. 利用 Apache Doris 的 Catalog功 能,将 OceanBase 表映射到 Doris 并插入数据。 3. 通过Flink CDC,设置 OceanBase 环境,配置 Flink 连接器,实现实时数据同步。
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
|
2月前
|
SQL 人工智能 数据挖掘
阿里云DMS,身边的智能化数据分析助手
生成式AI颠覆了人机交互的传统范式,赋予每个人利用AI进行低门槛数据分析的能力。Data Fabric与生成式AI的强强联合,不仅能够实现敏捷数据交付,还有效降低了数据分析门槛,让人人都能数据分析成为可能!阿里云DMS作为阿里云统一的用数平台,在2021年初就开始探索使用Data Fabric理念构建逻辑数仓来加速企业数据价值的交付,2023年推出基于大模型构建的Data Copilot,降低用数门槛,近期我们将Notebook(分析窗口)、逻辑数仓(Data Fabric)、Data Copilot(生成式AI)进行有机组合,端到端的解决用数难题,给用户带来全新的分析体验。
110199 118
阿里云DMS,身边的智能化数据分析助手
|
10天前
|
分布式计算 大数据 BI
MaxCompute产品使用合集之MaxCompute项目的数据是否可以被接入到阿里云的Quick BI中
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2月前
|
机器学习/深度学习 存储 分布式计算
机器学习PAI常见问题之DLC的数据写入到另外一个阿里云主账号的OSS中如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
10天前
|
运维 数据管理 数据库
数据管理DMS产品使用合集之在阿里云DMS中,想对数据精度进行校验,有什么方法
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
10天前
|
NoSQL 数据管理 MongoDB
数据管理DMS产品使用合集之如何通过阿里云的数据管理服务(DMS)导出MongoDB数据
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
23天前
|
API
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
|
2月前
|
弹性计算 安全 容灾
【产品动态】阿里云弹性计算产品月刊-2024年2月
阿里云产品官网价格全线下调,ECS最多下降36%;容器服务 Kubernetes 版 v1.28开放升级;安全访问与管理ECS资源的最佳实践;超高性能第八代AMD实例低至68.66元/月、老用户限时续费优惠,续费享1年5折……更多前沿云产品动态,尽在弹性计算产品月刊。