LVM在Kubernetes下的最佳实践方案--TopoLVM

news2024/12/26 11:39:06

TopoLVM介绍及实践

LVM在Kubernetes下的最佳实践方案–TopoLVM。

1. 简介

TopoLVM 是一种基于 LVM(Logical Volume Manager)的 CSI(Container Storage Interface)插件,专为 Kubernetes 环境设计,旨在提供拓扑感知的逻辑卷管理。它允许用户在特定节点上创建逻辑卷,并利用 LVM 的灵活性和高效性来管理 Kubernetes 集群中的存储资源。

TopoLVM 的主要特点包括:

  1. 拓扑感知: 支持在特定节点上创建逻辑卷,可以避免跨节点的数据移动,提升性能。

  2. 动态卷管理: 支持动态卷创建、删除和调整大小。

  3. 存储资源优化: 使用 LVM 的特性,可以实现对物理存储资源的更细粒度的管理和优化。

  4. 按需申请:以 PVC+StorageClass 的模式来提供服务,做到 PV 动态创建。而要实现这点,容量感知是关键,因为若调度到空间不足的节点上很明显是不合理的。最好能结合 PVC 申请的容量+Node 上的剩余容量,综合选择最优的节点来做绑定。

符合的 CSI 版本:1.5.0 。支持的平台有:

  1. Kubernetes版本:1.28,1.29,1.30

  2. 节点系统:使用LVM2(*1)的linux系统,特别是在ubuntu上进行了测试。

  3. CPU架构: x86(*2), arm64(*3), ppc64le(*3), s390x(*4)

  4. 文件系统:ext4, xfs, btrfs测试版(*5)

  5. lvm版本:2.02.163 或更高(增加了 JSON 输出支持)

标记说明:
*1 如果你使用官方的 Docker 镜像并使用 xfs 文件系统,主机的 Linux 内核必须是 v4.9 或更高版本,支持 rmapbt 和 reflink。
*2 一级支持。官方提供 Docker 镜像,并通过 CI 测试了所有功能。
*3 二级支持。官方提供 Docker 镜像,但未通过 CI 测试。
*4 三级支持。没有提供 Docker 镜像,也没有通过 CI 测试,但构建了二进制文件。
*5 截至 v0.31.0,btrfs 仍处于测试阶段。可以在生产环境中使用,但我们的用户还没有广泛使用它。

Docker 镜像可以在 ghcr.io 上获取。

2. 架构

TopoLVM 基于 CSI,因此其架构遵循 Kubernetes CSI 开发者文档中描述的架构。

TopoLVM 组件包括:

  • topolvm-controller:CSI 控制器服务。
  • topolvm-scheduler:TopoLVM 的调度器扩展程序。
  • topolvm-node:CSI 节点服务。
  • lvmd:用于管理 LVM 卷的 gRPC 服务。

·

3. 前提条件

TopoLVM 运行的所有节点上都必须创建一个卷组。Helm Chart 中定义的默认卷组名称是 myvg1。在要使用TopoLVM的Kubernetes集群的所有节点中创建名为myvg1的VG

# 我这里以新添加的sdb创建一个名为myvg1的VG
root@master1:~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
root@master1:~# vgcreate myvg1 /dev/sdb
  Volume group "myvg1" successfully created
root@master1:~# vgs
  VG        #PV #LV #SN Attr   VSize   VFree
  myvg1       1   0   0 wz--n- <30.00g <30.00g
  ubuntu-vg   1   1   0 wz--n- <38.00g      0

3. 安装

官方提供了一个 Helm Chart 用于在 Kubernetes 上安装 TopoLVM。该 Chart 依赖于 cert-manager,如果你没有安装 cert-manager,你可以使用 Helm Chart 安装它。本文实践使用helm chart在Kubernetes上安装TopoLVM。

  1. 添加helm仓库
helm repo add topolvm https://topolvm.github.io/topolvm
helm repo update
  1. 创建配置命名空间

TopoLVM使用webhooks,为了是webhooks正常工作,在目标namespace创建label。推荐使用专用的命名空间

kubectl create ns topolvm-system
kubectl label namespace topolvm-system topolvm.io/webhook=ignore
kubectl label namespace kube-system topolvm.io/webhook=ignore

说明

此处设置标签 topolvm.io/webhook=ignore 是为了防止在 topolvm-system 和 kube-system 命名空间中创建 Pod 和 PVC 时触发 TopoLVM 的变更 Webhook。这些 Webhook 依赖于 topolvm-controller。因此,为避免在 TopoLVM 启动过程中导致其卡住,Webhooks 不应在启动过程中被激活。

  1. 安装chart

以名字topolvm作为release name安装:

helm install --namespace=topolvm-system topolvm topolvm/topolvm

如果同cert-manager一起安装,使用下面的命令:

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${VERSION}/cert-manager.crds.yaml
helm install --namespace=topolvm-system topolvm topolvm/topolvm --set cert-manager.enabled=true
helm install --namespace=topolvm-system topolvm topolvm/topolvm

说明:

如果同cert-manager一起安装,确保先安装cert-manager然后安装topolvm。

  1. 检查安装
# 检查相关pod
root@master1:~# kubectl get pod -n topolvm-system
NAME                                  READY   STATUS    RESTARTS      AGE
topolvm-controller-5486c49d49-wk2bx   5/5     Running   0             2m9s
topolvm-controller-5486c49d49-x8rc2   5/5     Running   0             2m9s
topolvm-lvmd-0-5lb24                  1/1     Running   0             2m9s
topolvm-lvmd-0-6vbpd                  1/1     Running   0             2m9s
topolvm-lvmd-0-7bp6s                  1/1     Running   0             2m10s
topolvm-lvmd-0-hjfsk                  1/1     Running   0             2m9s
topolvm-node-p88vh                    3/3     Running   1 (60s ago)   2m9s
topolvm-node-qkqw9                    3/3     Running   1 (87s ago)   2m10s
topolvm-node-whgdt                    3/3     Running   0             2m9s
topolvm-node-xngft                    3/3     Running   0             2m9s

# 检查sc
root@master1:~# kubectl get sc
NAME                         PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE

topolvm-provisioner          topolvm.io                Delete          WaitForFirstConsumer   true                   3m19s

如果vg是自定义的,可以修改chart参数:

root@master1:~/topolvm# helm pull topolvm/topolvm --untar
root@master1:~/topolvm# ls
topolvm
root@master1:~/topolvm# vi topolvm/
CHANGELOG.md      Chart.lock        charts/           Chart.yaml        .helmignore       README.md         README.md.gotmpl  templates/        values.yaml
root@master1:~/topolvm# vi topolvm/values.yaml
...
# lvmd service
lvmd:
  # lvmd.managed -- If true, set up lvmd service with DaemonSet.
  managed: true

  # lvmd.socketName -- Specify socketName.
  socketName: /run/topolvm/lvmd.sock

  # lvmd.deviceClasses -- Specify the device-class settings.
  deviceClasses:
    - name: ssd
      volume-group: myvg1   # vg名字
      default: true
      spare-gb: 10  # 确保vg可用空间大于10G,也可以自定义修改

root@master1:~/topolvm# helm install --namespace=topolvm-system topolvm .

4. 业务使用topolvm创建的pv

安装TopoLVM后即可以创建PersistentVolumes (PV) ,默认创建了名为 topolvm-provisioner 的StorageClass。

创建一个pod和pvc,pod挂载pv到容器中的/data目录:

kubectl apply -f - <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: my-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: topolvm-provisioner
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: pause
    image: registry.k8s.io/pause
    volumeMounts:
    - mountPath: /data
      name: volume
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: my-pvc
EOF

查看资源创建情况:

root@master1:~# kubectl get pod
my-pod                            1/1     Running            0               24m
root@master1:~# kubectl get pvc
my-pvc                                       Bound    pvc-0c374084-f93a-46ec-b409-0104ad68df96   1Gi        RWO            topolvm-provisioner   30m
root@master1:~# kubectl get pv  | grep pvc-0c374084-f93a-46ec-b409-0104ad68df96
pvc-0c374084-f93a-46ec-b409-0104ad68df96   1Gi        RWO            Delete           Bound      default/my-pvc            topolvm-provisioner   18m

成功创建pvc和pod,且pv成功挂载到pod中。

5. 参考资料

  1. 官方仓库:https://github.com/topolvm/topolvm

  2. 快速实践:https://github.com/topolvm/topolvm/blob/main/docs/getting-started.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式部署②

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 对第四台服务器的补充 产品服务,订…

HTML 超链接

每一个网站都是由许多独立的网页组成&#xff0c;网页之家通常都是通过超链接来相互连接的。超链接可以让用户在各个独立的网页之间跳转。 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>colspan属性</title>&l…

Linux一周大项目:库的移植

挂载--->将所需库文件夹复制到nfs文件夹中&#xff08;不在终端进行&#xff09;--->cp库文件到开发板 /usr/lib step1 step3 ​​​​​​​​​​​​​​ 一、解压文件 解压zip文件 sudo unzip xxx.zip 解压tar文件 sudo tar -xvf xxx.tar 修改权限 sudo ch…

Maven 依赖漏洞扫描检查插件 dependency-check-maven 的使用

前言 在现代软件开发中&#xff0c;开源库的使用愈加普遍&#xff0c;然而这些开源库中的漏洞往往会成为潜在的安全风险。如何及时的发现依赖的第三方库是否存在漏洞&#xff0c;就变成很重要了。 本文向大家推荐一款可以进行依赖包漏洞检查的 maven 插件 dependency-check-m…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署Gitlab服务器 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、GitLab介绍2.1 GitLab简介2.2 GitLab主要特点 三、本次…

Java异常类

目录 Java异常类 Java中的异常体系 抛出异常 处理异常 处理异常的两种方式 try...catch和throws的区别 finally关键字 抛出异常注意事项 自定义异常类 Java异常类 Java中的异常体系 在Java中&#xff0c;异常类的父类为Throwable类&#xff0c;在Throwable下&#x…

git submodule子模块的使用

子模块的使用 添加子模块 添加子模块 git submodule add <子仓库URL> <子仓库路径> 例子&#xff1a; git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco 若子模块存在好几个分支&#xff0c;可以在添加子模块时&#xff0c;指定分支 g…

全国糖酒会,就这5个字。“会天下美味”

“全国糖酒会&#xff0c;会天下美味”&#xff0c;是全国糖酒会的品牌口号。这个品牌口号来的非常偶然。 两年前&#xff0c;全国糖酒会准备更新标志之时&#xff0c;也设计了一个品牌口号。新标志发布前几天&#xff0c;临时作了调整&#xff0c;最终变成了“全国糖酒会&…

Day92 代码随想录打卡|动态规划篇---斐波那契数

题目&#xff08;leecode T509&#xff09;&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n)…

C++11线程池、多线程编程(附源码)

Test1 示例源码展示&#xff1a; #include<iostream> #include<thread> #include<string> using namespace std;void printHelloWord(string s) {cout << s << endl;//return; } int main() {string s;s "wegfer";thread thread1(p…

【动手学深度学习】08 线性回归 + 基础优化算法(个人向笔记)

1. 线性回归 一个简化的模型&#xff1a; 我们可以这样来定义线性模型&#xff1a;注意这里先转置变成了列向量线性模型可以被看成时一个单层的神经网络&#xff1a;单层是因为单层参数 - 用一个函数来衡量预估质量&#xff1a;损失函数 在训练的时候寻找最小化的损失的参数 w…

Vivado编译报错黑盒子问题

1 问题描述 “Black Box Instances: Cell **** of type ** has undefined contents and is considered a back box. The contents of this cell must be defined for opt_design to complete successfully.” 检查工程代码提示的模块&#xff0c;该模块为纯手写的Veril…

使用AI赋能进行软件测试-文心一言

1.AI赋能的作用 提高速度和效率缺陷预测与分析 2.AI互动指令格式--文心一言 角色、指示、上下文例子、输入、输出 a 直接问AI 针对以下需求&#xff0c;设计测试用例。 需求&#xff1a; 1、账号密码登录系统验证账号和密码的正确性。 验证通过,用户登录成功,进入个人中心;验…

【优选算法】---前缀和

前缀和 一、【模板】一维前缀和二、【模板】二维前缀和三、寻找数组的中心下标四、除自身以外数组的乘积五、和为K子数组六、和可被 K 整除的子数组七、连续数组八、矩阵区域和 一、【模板】一维前缀和 一维前缀和&#xff0c;链接 1、预处理出来一个前缀和数组 注意&#xf…

C#学习 深入理解委托、匿名方法、Lamda表达式、Linq;

目录 一.委托 1.1 什么是委托 1.2 委托的使用 二.匿名方法和Lamda表达式 2.1 什么是匿名方法 2.2 Lambda表达式 三.Linq 3.1 Linq理解 3.2 Linq的扩展方法 一.委托 1.1 什么是委托 委托和类一样&#xff0c;是具有特定参数列表和返回值类型的方法函数的…

VSCode连接docker

1.启动ssh服务 vim /root/.bashrc 或者 vim ~/.bashrc /usr/sbin/sshd #启动ssh服务~代表主目录&#xff0c;cd ~会返回root目录 cd / 返回最根上的目录 为了防止每次打开容器都要输入此指令&#xff0c;我们直接在 ~/.bashrc文件最后一行添加sshd启动命令即可。 打开终端…

javase小项目--图书管理系统

前面我们已经学习到了javase的基本语法结构-继承&#xff0c;多态&#xff0c;接口&#xff0c;接下来就让我们大家一起来利用这些来手动实现一个小项目——简洁的图书管理系统 目录 1.思路 1.book类 1.book 2.booklist 2.user类 user AdminUser NormalUser 3.ioperat…

如何使用Pytorch-Metric-Learning?

文章目录 如何使用Pytorch-Metric-Learning&#xff1f;1.Pytorch-Metric-Learning库9个模块的功能1.1 Sampler模块1.2 Miner模块1.3 Loss模块1.4 Reducer模块1.5 Distance模块1.6 Regularizer模块1.7 Trainer模块1.8 Tester模块1.9 Utils模块 2.如何使用PyTorch Metric Learni…

传统CV算法——基于harris检测算法实现角点检测

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

JavaScript 循环控制语句-break和continue

break循环 首先i0&#xff0c;判断i是否<5,满足条件&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i0&#xff0c;i的值加1&#xff0c;判断i是否<5&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i1&#xff0c;i的值加1&#xff0c…