使用阿里云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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
623 0
|
7月前
LVM的底层pv数据迁移
LVM的底层pv数据迁移
41 7
|
7月前
|
存储 Linux
|
存储 Kubernetes Unix
k8s教程(Volume篇)-CSI存储机制详解
k8s教程(Volume篇)-CSI存储机制详解
1446 0
k8s教程(Volume篇)-CSI存储机制详解
|
存储 Kubernetes 监控
k8s csi存储机制
k8s csi存储机制详解
533 0
|
存储 运维
RH236扩缩容volumes--扩容volume
RH236扩缩容volumes--扩容volume
129 0
RH236扩缩容volumes--扩容volume
|
运维
RH236扩缩容volumes--缩容volume
RH236扩缩容volumes--缩容volume
208 0
RH236扩缩容volumes--缩容volume
|
存储 Kubernetes Cloud Native
实现 Kubernetes 动态LocalVolume挂载本地磁盘
在 Kubernetes 体系中,存在大量的存储插件用于实现基于网络的存储系统挂载,比如NFS、GFS、Ceph和云厂商的云盘设备。但在某些用户的环境中,可能无法或没有必要搭建复杂的网络存储系统,需要一个更简单的存储方案。另外网络存储系统避免不了性能的损耗,然而对于一些分布式数据库,其在应用层已经实现了数据同步和冗余,在存储层只需要一个高性能的存储方案。 在这些情况下如何实现Kubernetes 应用的数据持久化呢?
1693 0
|
存储 Shell Perl
使用阿里云Flexvolume插件实现云盘数据卷动态扩容
云盘扩容方案文章列表: 基于Flexvolume插件的云盘动态存储卷扩容方案(本文); 基于CSI插件的云盘动态存储卷扩容方案:参考; 不适合动态扩容的场景,可以使用手动扩容云盘存储卷方案:参考; 数据卷扩容说明: 符合以下要求的集群环境可以进行动态扩容操作: Kubernetes从1.
2426 0
使用阿里云Flexvolume插件实现云盘数据卷动态扩容