阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Longhorn 入门级教程!轻松实现持久化储存!

  • 2020-05-25
  • 本文字数:3878 字

    阅读完需:约 13 分钟

Longhorn入门级教程!轻松实现持久化储存!

介绍

在本文中你将学会如何使用 k3s 在 Civo 上运行 Longhorn。如果你还没使用过 Civo,可以到官网注册(https://www.civo.com/)还可以申请免费的使用额度。首先,需要一个 Kubernetes 集群,然后我们将安装 Longhorn 并通过一个示例来展现如何使用它。


云原生应用程序的原理之一是它们旨在成为无状态的,因此可以直接水平扩展应用程序。然而,实际情况是除非你的网站或应用程序所占内存很小,否则你一定需要在某个地方存储这些东西。


业界巨头(如 Google 和 Amazon)常常会有适用于本公司产品的可扩展存储解决方案的自定义系统。但是对于小型公司来说,这要怎么办呢?


业界采用最为广泛的 Kubernetes 管理平台创建者 Rancher Labs(以下简称 Rancher)在 2018 年 3 月发布了容器化分布式存储项目 Longhorn(现已捐献给CNCF),这一项目填补了以上的空缺。简而言之,Longhorn 所做的是使用 Kubernetes 节点的现有磁盘为 Kubernetes Pod 提供稳定的存储。

前期准备

在我们使用 Longhorn 之前,你需要有一个正在运行的 Kubernetes 集群。你可以简单地安装一个 k3s 集群(https://github.com/rancher/k3s/blob/master/README.md)或者如果你正在使用 Civo 的 Kubernetes 服务,你也可以使用它。本文将使用 Civo 的 Kubernetes 服务来创建集群。


我们建议使用最少的 Medium 实例,因为我们将测试 MySQL 的状态存储,它可能会占用大量 RAM。


$ civo k8s create longhorn-test --waitBuilding new Kubernetes cluster longhorn-test: \Created Kubernetes cluster longhorn-test
复制代码


你的集群需要在每个节点上安装 open-iscsi,所以如果你使用的不是 civo 的 Kubernetes 服务,除了上述链接的说明外,你还需要在每个节点上运行以下命令:


sudo apt-get install open-iscsi
复制代码


接着,你既需要下载 Kubernetes 配置文件并将其保存到~/.kube/config 中,还需要将名为 KUBECONFIG 的环境变量设置为其文件名:


cd ~/longhorn-playcivo k8s config longhorn-test > civo-longhorn-test-configexport KUBECONFIG=civo-longhorn-test-config
复制代码

安装 Longhorn

在现有 Kubernetes 集群上安装 Longhorn 仅需 2 步:为 Longhorn 安装 controller 以及扩展包,然后创建一个可用于 pod 的 StorageClass。第一步:


$ kubectl apply -f https://raw.githubusercontent.com/rancher/longhorn/master/deploy/longhorn.yamlnamespace/longhorn-system createdserviceaccount/longhorn-service-account created...
复制代码


创建 StorageClass 需要使用另一个命令,然而作为附加步骤,你可以将新的 class 设置为默认,这样你无需每次都指定它:


$ kubectl apply -f https://raw.githubusercontent.com/rancher/longhorn/master/examples/storageclass.yamlstorageclass.storage.k8s.io/longhorn created
$ kubectl get storageclassNAME PROVISIONER AGElonghorn rancher.io/longhorn 3s
$ kubectl patch storageclass longhorn -p \ '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' storageclass.storage.k8s.io/longhorn patched
$ kubectl get storageclassNAME PROVISIONER AGElonghorn (default) rancher.io/longhorn 72s
复制代码

访问 Longhorn Dashboard

Longhorn 有一个十分简洁的 Dashboard,可以在上面看到已使用的空间、可用空间、volume 列表等等信息。但首先,我们需要创建身份验证的详细信息:


$ htpasswd -c ./ing-auth admin$ kubectl create secret generic longhorn-auth \  --from-file ing-auth --namespace=longhorn-system
复制代码


现在,我们将创建一个 Ingress 对象,可以使用 k3s 中内置的 Traefik,并将 dashboard 暴露到外部。创建一个名为 longhorn-ingress.yaml 的文件,并将其放入其中:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: longhorn-ingress  annotations:    ingress.kubernetes.io/auth-type: "basic"    ingress.kubernetes.io/auth-secret: "longhorn-auth"spec:  rules:  - host: longhorn-frontend.example.com    http:      paths:      - backend:          serviceName: longhorn-frontend          servicePort: 80
复制代码


然后应用它:


$ kubectl apply -f longhorn-ingress.yaml -n longhorn-systemingress.extensions/longhorn-ingress created
复制代码


现在,你需要在/etc/hosts 文件中添加一个条目,以将你的任意 Kubernetes IP 地址指向 longhorn-frontend.example.com:


echo "1.2.3.4 longhorn-frontend.example.com" >> /etc/hosts
复制代码


现在,你可以在浏览器上访问http://longhorn-frontend.example.com,使用 admin 和使用 htpasswd 时输入的密码进行身份验证之后,可以看到类似下面的内容:


使用持久化存储安装 MySQL

在单个容器中运行 MySQL 毫无意义,因为当基础节点(容器)死亡时,相关的业务也就无法运行,这时你会失去客户、失去订单。在这里,我们要为它配置一个新的 Longhorn 持久卷。


首先,我们需要在 Kubernetes 中创建几个资源。其中每个都是 yaml 文件,位于一个空目录中,或者你可以将它们全部放在一个文件中,使用—进行分隔。


在 mysql/pv.yaml 中的一个持久卷:


apiVersion: v1kind: PersistentVolumemetadata:  name: mysql-pv  namespace: apps  labels:    name: mysql-data    type: longhornspec:  capacity:    storage: 5G  volumeMode: Filesystem  storageClassName: longhorn  accessModes:    - ReadWriteOnce  csi:    driver: io.rancher.longhorn    fsType: ext4    volumeAttributes:      numberOfReplicates: '2'      staleReplicaTimeout: '20'    volumeHandle: mysql-data
复制代码


在 mysql / pv-claim.yaml 中对该卷的声明(类似于抽象请求,以便某些人可以使用该卷):


apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: mysql-pv-claim  labels:    type: longhorn    app: examplespec:  storageClassName: longhorn  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 5Gi
复制代码


在 mysql/pod.yaml 中还有一个可以运行 MySQL 并使用上述卷生命的 Pod(请注意:我们在此处使用 password 作为 MySQL 的 root 密码,但在实际操作中你应该使用安全密码,并在 Kubernetes secret 中存储密码而不是在 YAML 中,这里我们只是为了简单):


apiVersion: apps/v1kind: Deploymentmetadata:  name: my-mysql  labels:    app: examplespec:  selector:    matchLabels:      app: example      tier: mysql  strategy:    type: Recreate  template:    metadata:      labels:        app: example        tier: mysql    spec:      containers:      - image: mysql:5.6        name: mysql        env:        - name: MYSQL_ROOT_PASSWORD          value: password        ports:        - containerPort: 3306          name: mysql        volumeMounts:        - name: mysql-persistent-storage          mountPath: /var/lib/mysql      volumes:      - name: mysql-persistent-storage        persistentVolumeClaim:          claimName: mysql-pv-claim
复制代码


现在,应用文件夹或者单个文件(这取决于你之前的选择):


$ kubectl apply -f mysql.yamlpersistentvolumeclaim/mysql-pv-claim createdpersistentvolume/mysql-pv createddeployment.apps/my-mysql created
# or
kubectl apply -f ./mysql/persistentvolumeclaim/mysql-pv-claim createdpersistentvolume/mysql-pv createddeployment.apps/my-mysql created
复制代码

测试 MySQL 是否能够持久化存储

我们的测试十分简单,创建一个新的数据库,删除容器(Kubernetes 会帮我们重新创建),然后重新连接,理想的结果是依旧可以看到我们的新数据库。


好,现在我们来创建一个名为 should_still_be_here 的数据库:


$ kubectl get pods | grep mysqlmy-mysql-d59b9487b-7g644   1/1     Running   0          2m28s$ kubectl exec -it my-mysql-d59b9487b-7g644 /bin/bashroot@my-mysql-d59b9487b-7g644:/# mysql -u root -p mysqlEnter password: mysql> create database should_still_be_here;Query OK, 1 row affected (0.00 sec)
mysql> show databases;+----------------------+| Database |+----------------------+| information_schema || #mysql50#lost+found || mysql || performance_schema || should_still_be_here |+----------------------+5 rows in set (0.00 sec)
mysql> exitByeroot@my-mysql-d59b9487b-7g644:/# exitexit
复制代码


现在,我们将删除容器:


kubectl delete pod my-mysql-d59b9487b-7g644
复制代码


大约一分钟之后,我们将再次寻找新的容器名称,连接到该容器名称,看看我们的数据库是否仍然存在:


$ kubectl get pods | grep mysqlmy-mysql-d59b9487b-8zsn2   1/1     Running   0          84s$ kubectl exec -it my-mysql-d59b9487b-8zssn2 /bin/bashroot@my-mysql-d59b9487b-8zsn2:/# mysql -u root -p mysqlEnter password: mysql> show databases;+----------------------+| Database             |+----------------------+| information_schema   || #mysql50#lost+found  || mysql                || performance_schema   || should_still_be_here |+----------------------+5 rows in set (0.00 sec)
mysql> exitByeroot@my-mysql-d59b9487b-7g644:/# exitexit
复制代码


圆满成功!我们的存储在被杀死个各个容器中得以持久保存。


2020-05-25 16:391636

评论

发布
暂无评论
发现更多内容

高性能实战Alibaba Sentinel笔记,深度还原阿里微服务高并发方案

小柴说Java

Java 编程 架构 面试 后端

你可能不知道,自动化元数据管理的“七宗最”?

雨果

元数据

非科班出身,开发五年之后我对编程有了新的领悟

Java永远的神

Java 编程 程序员 程序人生 计算机

堡垒机可以管理哪些网络资产?咨询电话多少?

行云管家

网络安全 数据安全 堡垒机

重磅揭秘!10分钟10TB数据跨云、跨地域传输的技术实践

星汉未来

云原生 数据迁移 东数西算 星汉未来

怎样设计一个协助中心来帮助你的顾客?

Baklib

[极致用户体验] 2行代码,让你的UI适配移动端、PC端,快来收藏

HullQin

CSS JavaScript html 前端 8月月更

题目新颖,内容全面!阿里巴巴又一Java面试神册开源!

Java永远的神

Java spring 程序员 面试 JVM

数据透视表上线!如何在纯前端实现这个强大的数据分析功能?

葡萄城技术团队

前端

前端培训就业后的程序员就业方向有哪些?

小谷哥

一对一直播系统源码——如何只需三步搭建

开源直播系统源码

软件开发 一对一直播源码 直播系统源码 一对一直播系统

一文看懂流程挖掘是如何工作的

望繁信科技

首发!阿里P8顶级架构师总结的这份全网最全 JVM 知识宝典,帮你查漏补缺

了不起的程序猿

Java JVM 虚拟机 java编程 Java程序猿

爆肝!阿里大佬熬夜38天整合的这份Spring Security源码手册我粉了

Java全栈架构师

Java 程序员 面试 程序人生 springsecurity

这么好用的接口工具,请允许我油腻一次!

Liam

Java 开发 Postman API 开放api

学术加油站|面向HTAP数据库的基准评测工具研究进展

OceanBase 数据库

超全面!字节最新发布22年秋招200道Java面试题(含答案)

Java面试那些事儿

Java 编程 面试 后端 架构师

低/无代码的发展将显著改变银行开发生态

易观分析

代码 银行

新手指南|帮助中心应该包含哪些内容?

Geek_da0866

聊聊 npm 的语义化版本(Semver)

冴羽

JavaScript 前端 npm 项目开发 semver

哪些数据被纳入元数据管理的范畴?

雨果

元数据

从一条更新SQL的执行过程窥探InnoDB之REDOLOG

京东科技开发者

MySQL 数据库

StarRocks 技术内幕:向量化编程精髓

StarRocks

听潮汐,筑灯塔,聚千帆:智慧港口全球创新实验室启航时

脑极体

云堡垒机和软件堡垒机哪个好?区别是什么?

行云管家

网络安全 数据安全 堡垒机 云堡垒机

完整实现-通过DelayQueue实现延时任务

字母哥哥

Java 架构 并发编程 后端

手把手地教你如何建立最好的知识管理体系

Baklib

开源流式湖仓服务 Arctic 详解:并非另一套 Table Format

网易数帆

大数据 iceberg Hudi Arctic

延时任务-基于netty时间轮算法实现

字母哥哥

Java 架构 后端 Netty

toB行业知识管理的重要性

Baklib

阿里云AIoT物联网平台技术集锦

阿里云AIoT

数据挖掘 运维 监控 物联网 消息中间件

Longhorn入门级教程!轻松实现持久化储存!_文化 & 方法_Rancher_InfoQ精选文章