Kubernetes入门——Longhorn简介

网友投稿 501 2022-09-09

Kubernetes入门——Longhorn简介

概述

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-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGElonghorn-frontend NodePort 10.43.125.27 80:32007/TCP 9d

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

部署

添加helm仓库

$ helm repo add longhorn has been added to your repositories$ helm repo updateHang 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-systemnamespace/longhorn-system created$ helm install longhorn longhorn/longhorn --namespace longhorn-systemNAME: longhornLAST DEPLOYED: Mon May 24 11:07:24 2021NAMESPACE: longhorn-systemSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES: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-systemNAME READY STATUS RESTARTS AGEcsi-attacher-5dcdcd5984-6wk4k 1/1 Running 0 13mcsi-attacher-5dcdcd5984-7qtbj 1/1 Running 0 13mcsi-attacher-5dcdcd5984-rhrwt 1/1 Running 0 13mcsi-provisioner-5c9dfb6446-96hjf 1/1 Running 0 13mcsi-provisioner-5c9dfb6446-g6szj 1/1 Running 0 13mcsi-provisioner-5c9dfb6446-kfvzv 1/1 Running 0 13mcsi-resizer-6696d857b6-5s6pt 1/1 Running 0 13mcsi-resizer-6696d857b6-b4r87 1/1 Running 0 13mcsi-resizer-6696d857b6-w2hhr 1/1 Running 0 13mcsi-snapshotter-96bfff7c9-5ghjv 1/1 Running 0 13mcsi-snapshotter-96bfff7c9-ctwpt 1/1 Running 0 13mcsi-snapshotter-96bfff7c9-rzg66 1/1 Running 0 13mengine-image-ei-611d1496-65hwx 1/1 Running 0 13mengine-image-ei-611d1496-tlw2r 1/1 Running 0 13minstance-manager-e-4fe8f5dc 1/1 Running 0 13minstance-manager-e-a6b90821 1/1 Running 0 13minstance-manager-r-6542f13a 1/1 Running 0 13minstance-manager-r-766ea453 1/1 Running 0 13mlonghorn-csi-plugin-4c4qp 2/2 Running 0 13mlonghorn-csi-plugin-qktcl 2/2 Running 0 13mlonghorn-driver-deployer-5d45dcdc5d-jgsr9 1/1 Running 0 14mlonghorn-manager-k5tdr 1/1 Running 0 14mlonghorn-manager-pl662 1/1 Running 1 14mlonghorn-ui-5879656c55-jxmkj 1/1 Running 0 14m

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

测试

基于longhorn部署一个nginx。

longhorn-pvc.yaml:

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: longhorn-pvc-demo spec: accessModes: - ReadWriteOnce volumeMode: Filesystem storageClassName: longhorn resources: requests: storage: 2Gi

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

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

绑定PVC

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

longhorn-pod.yaml:

apiVersion: v1 kind: Pod metadata: name: volume-test namespace: default labels: app: volume-test spec: containers: - name: volume-test image: nginx:stable-alpine imagePullPolicy: IfNotPresent volumeMounts: - name: volv mountPath: /usr/share/nginx/html # nginx默认html路径 ports: - containerPort: 80 volumes: - name: volv persistentVolumeClaim: claimName: longhorn-pvc-demo

等待部署完成:

$ kubectl get po volume-test NAME READY STATUS RESTARTS AGE volume-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 # ls index.html lost+found /usr/share/nginx/html # cat index.html Welcome to nginx!

Hello Longhorn!

暴露服务,访问测试。

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

删除pod:

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

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

重新挂载卷

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

longhorn-pod-2.yaml:

apiVersion: v1 kind: Pod metadata: name: volume-test-2 namespace: default labels: app: volume-test-2 spec: containers: - name: volume-test-2 image: nginx:stable-alpine imagePullPolicy: IfNotPresent volumeMounts: - name: volv-2 mountPath: /usr/share/nginx/html # nginx默认html路径 ports: - containerPort: 80 volumes: - name: volv-2 persistentVolumeClaim: 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 Welcome to nginx!

Hello Longhorn!

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

清理测试资源:

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Ubuntu通过kubeadm快速搭建k8s集群
下一篇:全媒派:疫情、网暴、歧视:新闻工作者的心理防线都是被什么给击破的?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~