NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:391641

评论

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

关于 Synchronized 的一个点,网上99%的文章都错了

yes

Java JVM

SARIF:DevSecOps工具与平台交互的桥梁

华为云开发者联盟

安全 DevSecOps SARIF 自动化平台 OASIS

产品训练营-第五周作业

羽室

隧道建设手段结合科技能有多强大?盾构机可视化让工程化繁为简

一只数据鲸鱼

物联网 数据可视化 3D可视化 盾构机 隧道工程

话说 synchronized

木子的昼夜

Java

重磅!京东云自研第四代云主机发布;曝国外物理学家开发出用于量子计算机的汇编语言

京东科技开发者

微软 开发者 量子计算机 谷歌

公安合成作战系统!智慧警务情指行一体化建设解决方案

源中瑞-龙先生

公安合成作战系统开发 产品解决方案 情指行一体化 公安

重磅丨国资委下发通知,加快推进国有企业数字化转型

PingCode

团队管理 项目管理 研发管理 研发效能 研发工具

PingCode新成员Goals开放内测!

PingCode

项目管理 敏捷 敏捷开发 研发管理 研发效能

字节跳动力推的OKR,是未来企业发展的标配吗?

ToB行业头条

一场由fork引发的超时,让我们重新探讨了Redis的抖动问题

华为云开发者联盟

数据库 redis 华为云 GaussDB fork

力扣(LeetCode)刷题,简单+中等题(第30期)

不脱发的程序猿

面试 程序人生 算法 LeetCode 28天写作

微服务框架相关技术整理

架构 微服务

LeetCode题解:188. 买卖股票的最佳时机 IV,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

谷歌开发安卓系统!Android面试你必须要知道的那些知识,全网疯传

欢喜学安卓

android 程序员 面试 移动开发

神经网络攻防:01.模型到底是什么?

P小二

神经网络 网络安全 AIPwn AI安全 P小二

Spring中的事务使用注意事项

少平

spring

直流电源防反接电路设计

不脱发的程序猿

嵌入式 28天写作 硬件设计 直流电源 防反接电路设计

【LeetCode】二维区域和检索 - 矩阵不可变Java题解

Albert

算法 LeetCode 28天写作

入选SIGMOD2021的时间序列多周期检测通用框架RobustPeriod如何支撑阿里业务场景?

阿里云大数据AI技术

人工智能 数据库 大数据

连续两次入围Gartner魔力象限的Quick BI到底有何魔力?

跨云迁移过程中的数据同步及一致性校验实践(一)

UCloud技术

迁移 数据传输 数据库迁移 数据迁移

跨云迁移过程中的数据同步及一致性校验实践(二)

UCloud技术

迁移 数据传输 数据库迁移 数据迁移

一个15年的架构师谈“如何成为一名优秀的解决方案架构师”

华为云开发者联盟

架构 软件 架构师 华为云

华为AR&VR黑科技:以“自由视角”360度尽展舞台唯美

华为云开发者联盟

华为 算法 视频 AR&VR 全息显示

开工第一周,有哪些助你弯道超车的好书?

博文视点Broadview

谷歌android!通宵都要看完这个Android关键技术点,威力加强版

欢喜学安卓

android 程序员 面试 移动开发

ETL工具—Taskctl 如何搭建配置作业类型的管理

TASKCTL

大数据 kettle 运维自动化 海豚调度 ETL

力扣 (LeetCode)-两数之和,有效的括号,两数相加

我是哪吒

面试 算法 LeetCode 28天写作

腾讯音乐-全民K歌iOS面经

iOSer

ios 面试 腾讯大厂 金三银四跳槽

【黑科技】爬虫也可以一键获取 [加载更多] 数据,无编码学爬虫之三。

梦想橡皮擦

Python 28天写作 3月日更

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