概述

Longhorn是由Rancher创建的一款云原生的、轻量级、可靠且易用的开源分布式块存储系统。部署到K8s集群上之后,Longhorn会自动将集群中所有节点上可用的本地存储聚集为存储集群,然后利用这些存储管理分布式、带有复制功能的块存储,支持快照和数据备份。

对于 Longhorn,你可以:

  • 使用 Longhorn 卷作为 Kubernetes 集群中分布式有状态应用程序的持久存储
  • 将块存储分区为 Longhorn 卷(volume)
  • 在多个节点和数据中心复制块存储以提高可用性
  • 将备份数据存储在外部存储器中,如 NFS 或 AWS S3
  • 从备份中恢复卷
  • 升级 Longhorn 而不中断持久的卷

Longhorn 设计有两层: 数据平面(data plane)和控制平面(control plane)。Longhorn Engine 是与数据平面对应的存储控制器,Longhorn Manager 与控制平面对应。

Longhorn Manager Pod 作为 Kubernetes DaemonSet 在 Longhorn 集群中的每个节点上运行。它负责在 Kubernetes 集群中创建和管理卷。

当 Longhorn Manager 被要求创建一个卷( volume)时,它会在卷附加的节点上创建一个 Longhorn Engine 实例,它以 Linux 进程的形式运行。并在每个节点上创建一个数据副本。副本应该放在单独的主机上,以确保最大限度的可用性。

Longhorn基于块存储的,并且支持 ext4/XFS文件系统。Longhorn CSI 驱动程序获取块设备,并格式化它,并将其挂载到节点上。然后 kubelet绑定状态这些块设备到K8s pod中,这样 pod就能访问Longhorn卷。

设置的副本数量不应该超过集群节点数量

上图中

  • 创建了3个Longhorn卷
  • 每个卷都有一个专用的控制器:Longhorn Engine
  • 每个 Longhorn 卷有两个副本,每个副本是一个 Linux 进程
  • 通过为每个卷创建一个单独的 Longhorn Engine,如果其中一个控制器失败,则不会影响其他卷的功能

Longhorn 副本使用 Linux sparse files 构建,支持自动精简配置(thin provisioning)。有一个实际大小和”名义上的”大小。

Longhorn UI

Longhorn提供了UI管理页面,简单的方式是通过 kube edit svc longhorn-frontend -n longhorn-system命令修改服务类型为 type: NodePort。 保存退出。

$ kube get svc  longhorn-frontend -n longhorn-system
NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
longhorn-frontend   NodePort   10.43.125.27   <none>        80:32007/TCP   9d

这样就可以通过任意集群节点IP+32007端口访问。

部署

添加helm仓库

$ helm repo add longhorn https://charts.longhorn.io
"longhorn" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "longhorn" chart repository
...

为了简化,设置 alias kube=‘kubectl’

执行部署

$ kube create namespace longhorn-system
namespace/longhorn-system created
$ helm install longhorn longhorn/longhorn --namespace longhorn-system
NAME: longhorn
LAST DEPLOYED: Mon May 24 11:07:24 2021
NAMESPACE: longhorn-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Longhorn is now installed on the cluster!Please wait a few minutes for other Longhorn components
such as CSI deployments, Engine Images, and Instance Managers to be initialized.

然后会在 longhorn-system命名空间下部署 csi-attacher、csi-provisioner、csi-resizer、engine-image-ei、longhorn-csi-plugin和longhorn-manager等Pod对象。

等待这些对象都变成 running后即部署完成。

$ kube get po -n longhorn-system
NAME                                        READY   STATUS    RESTARTS   AGE
csi-attacher-5dcdcd5984-6wk4k               1/1     Running   0          13m
csi-attacher-5dcdcd5984-7qtbj               1/1     Running   0          13m
csi-attacher-5dcdcd5984-rhrwt               1/1     Running   0          13m
csi-provisioner-5c9dfb6446-96hjf            1/1     Running   0          13m
csi-provisioner-5c9dfb6446-g6szj            1/1     Running   0          13m
csi-provisioner-5c9dfb6446-kfvzv            1/1     Running   0          13m
csi-resizer-6696d857b6-5s6pt                1/1     Running   0          13m
csi-resizer-6696d857b6-b4r87                1/1     Running   0          13m
csi-resizer-6696d857b6-w2hhr                1/1     Running   0          13m
csi-snapshotter-96bfff7c9-5ghjv             1/1     Running   0          13m
csi-snapshotter-96bfff7c9-ctwpt             1/1     Running   0          13m
csi-snapshotter-96bfff7c9-rzg66             1/1     Running   0          13m
engine-image-ei-611d1496-65hwx              1/1     Running   0          13m
engine-image-ei-611d1496-tlw2r              1/1     Running   0          13m
instance-manager-e-4fe8f5dc                 1/1     Running   0          13m
instance-manager-e-a6b90821                 1/1     Running   0          13m
instance-manager-r-6542f13a                 1/1     Running   0          13m
instance-manager-r-766ea453                 1/1     Running   0          13m
longhorn-csi-plugin-4c4qp                   2/2     Running   0          13m
longhorn-csi-plugin-qktcl                   2/2     Running   0          13m
longhorn-driver-deployer-5d45dcdc5d-jgsr9   1/1     Running   0          14m
longhorn-manager-k5tdr                      1/1     Running   0          14m
longhorn-manager-pl662                      1/1     Running   1          14m
longhorn-ui-5879656c55-jxmkj                1/1     Running   0          14m

注意默认会创建3个副本,部署完成后可通过 kube edit cm longhorn-storageclass -n longhorn-system 修改 numberOfReplicas值为合适的值,不能超过集群节点个数。

测试

基于longhorn部署一个nginx。

longhorn-pvc.yaml:

 apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-pvc-demospec:accessModes:- ReadWriteOncevolumeMode: FilesystemstorageClassName: longhornresources:requests:storage: 2Gi

创建了一个基于longhorn存储类的PVC资源。Longhorn支持动态预配,可以自动创建出适配的PV卷。

 $ kube apply -f longhorn-pvc.yaml persistentvolumeclaim/longhorn-pvc-demo created$ kube get pvc/longhorn-pvc-demoNAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGElonghorn-pvc-demo   Bound    pvc-2202aaea-c129-44bc-9580-55914b6bd7ea   2Gi        RWO            longhorn       20s

绑定PVC

将该PVC作为一个卷挂载到下面这个 pod:

longhorn-pod.yaml:

 apiVersion: v1kind: Podmetadata:name: volume-testnamespace: defaultlabels:app: volume-testspec:containers:- name: volume-testimage: nginx:stable-alpineimagePullPolicy: IfNotPresentvolumeMounts:- name: volvmountPath: /usr/share/nginx/html # nginx默认html路径ports:- containerPort: 80volumes:- name: volvpersistentVolumeClaim:claimName: longhorn-pvc-demo

等待部署完成:

 $ kubectl get po volume-testNAME          READY   STATUS    RESTARTS   AGEvolume-test   1/1     Running   0          98s

在Longhorn UI中查看该卷状态为:Attached,因为测试集群就2个节点,这里创建了2个副本。每个卷会根据参数numberOfReplicas值创建副本数量。并且会每个节点只会创建一个副本。如下图,分别在rancher1和rancher2节点上创建了副本,以实现高可用。

进入容器内部,并找到挂载路径,修改文件。

 $ kube exec -it volume-test -- sh   # 进入容器内部/ # cd /usr/share/nginx/html//usr/share/nginx/html # ls  # ext4格式默认生成lost+found文件夹lost+found/usr/share/nginx/html # vi index.html # 创建index.html/usr/share/nginx/html # lsindex.html  lost+found/usr/share/nginx/html # cat index.html <!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}</style></head><body><h1>Hello Longhorn!</h1><p></p></body></html>

暴露服务,访问测试。

 $ kube expose pod volume-test --type=NodePort --target-port=80service/volume-test exposed$ kube get svc volume-testNAME          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGEvolume-test   NodePort   10.43.253.209   <none>        80:32187/TCP   7s

删除pod:

 $ kube delete pod volume-testpod "volume-test" deleted

此时查看,该卷还存在,但状态为Detached。

重新挂载卷

重新创建一个pod,指定相同的persistentVolumeClaim.claimName。

longhorn-pod-2.yaml:

 apiVersion: v1kind: Podmetadata:name: volume-test-2namespace: defaultlabels:app: volume-test-2spec:containers:- name: volume-test-2image: nginx:stable-alpineimagePullPolicy: IfNotPresentvolumeMounts:- name: volv-2mountPath: /usr/share/nginx/html # nginx默认html路径ports:- containerPort: 80volumes:- name: volv-2persistentVolumeClaim:claimName: longhorn-pvc-demo

进入新的pod查看:

 $ kube exec -it volume-test-2 -- sh/ # cat /usr/share/nginx/html/index.html   lost+found// # cat /usr/share/nginx/html/index.html <!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}</style></head><body><h1>Hello Longhorn!</h1><p></p></body></html>

此时longhorn卷又自动挂载起来了。

清理测试资源:

 $ kube delete -f longhorn-pvc.yaml$ kube delete -f longhorn-pod-2.yaml

Kubernetes入门——Longhorn简介相关推荐

  1. 容器编排技术 -- Kubernetes入门概述

    容器编排技术 -- Kubernetes入门概述 简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powe ...

  2. Kubernetes入门——Kubernetes日志采集与监控告警

    作者简介: 郭川磊 百度基础架构部研发工程师 负责云原生产品的研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes实现应用高可用』梳 ...

  3. Kubernetes入门——Kubernetes实现应用的高可用

    作者简介: 胡家靖 百度基础架构部研发工程师 负责函数计算与云原生产品的研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes实现应用 ...

  4. Kubernetes入门——Kubernetes工作原理及使用

    作者简介: 星龙 百度基础架构部研发工程师 负责混部调度系统研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes工作原理』梳理. 视 ...

  5. Kubernetes入门——深入浅出讲Docker

    作者简介: 李子昂 百度基础架构部研发工程师 负责百度分布式Redis平台的研发和运维 专注于基础架构中间件的研发和优化 本文基于『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门 ...

  6. Kubernetes入门指南-基础篇

    Kubernetes入门指南-基础篇 基础入门 kubernetes简介 kubernetes是一个平台 kubernetes架构 kubernetes不是什么 核心组件 kubernetes基本概念 ...

  7. Kubernetes入门教程 --- 使用二进制安装

    Kubernetes入门教程 --- 使用二进制安装 1. Introduction 1.1 架构图 1.2 关键字介绍 1.3 简述 2. 使用Kubeadm Install 2.1 申请三个虚拟环 ...

  8. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    为什么80%的码农都做不了架构师?>>>    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 问题导读: 1.zookeeper在kafka的作用是什么? 2. ...

  9. TypeScript基础入门 - 函数 - 简介

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/ ...

  10. GBDT(MART) 迭代决策树入门教程 | 简介 .

     GBDT(MART) 迭代决策树入门教程 | 简介 2013-12-23 16:26 2802人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 数据挖掘相关(13) 作者同类文章X GB ...

最新文章

  1. keras,在 fit 和 evaluate 中 都有 verbose 这个参数标记是否打印进度条
  2. 基于深度学习的文本数据特征提取方法之Glove和FastText
  3. ifstream 和 ofstream 文件中读取和写入操作
  4. 分布式框架seata启动命令
  5. Elastic Search学习笔记5——基本操作
  6. Dapr + .NET 实战(七)Secrets
  7. 腾讯TIM自动回复内容怎么自定义添加
  8. connection url mysql,JDBC 连接MySQL实例详解
  9. Emit学习-进阶篇-异常处理
  10. Javascript特效:循环抽奖
  11. 全球网速最快的地方在哪里?中国固定宽带网速增长超美国!
  12. 软考软件设计师下午真题-面向对象的程序设计与实现-装饰设计模式(2012年上半年试题六))Java代码讲解
  13. 软件项目管理系统-进度编辑
  14. 【PS】如何使用Photoshop调整图片指定部分的大小
  15. JS实现经纬度坐标转成XY坐标
  16. ipone 固定底部兼容问题
  17. 用计算机数字技术制作的电影是,计算机数字技术为电影带来的空前发展.doc
  18. android 隐藏输入法时自动关闭弹窗,Android疑难杂症之Dialog消失,关闭输入法
  19. iOS中网络编程长连接
  20. IT界被忽视的小可爱们:致敬QA

热门文章

  1. 普通开发人员与软件工程师的区别
  2. 【win10.win7】在win10系统里面安装win7系统(亲测有效,方便快捷,无需自己设置开机启动项)
  3. 在 Windows 上进行 Laravel Homestead 安装、配置及测试
  4. 2019年新年第一天,我也制定一下2019年计划,
  5. IIS配置文件上传大小限制
  6. [luogu1373]小a和uim之大逃离_动态规划
  7. Ajax+Java实现大文件切割上传
  8. checkbox选中与取消选择
  9. CI 图片上传路径问题的解决
  10. java读取照片信息 获取照片拍摄时的经纬度