写点什么

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

评论

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

玩转直播系列之消息模块演进(3)

vivo互联网技术

Java 服务器 消息系统 直播技术

高级软件工程师必备的五大技能

架构精进之路

5月日更

百度 Serverless 架构揭秘与应用实践

百度开发者中心

百度 开源 Serverless 云原生

MindSpore:不用摘口罩也知道你是谁

华为云开发者联盟

算法 人脸识别 口罩 mindspore 口罩人脸

每个开发人员都应该知道的 10 个 GitHub 仓库

LeanCloud

GitHub web开发

ETL-KETTLE工具使用

this

Java 数据 数据同步 ETL

Kubernetes 普及系列:容器基础入门

CODING DevOps

Kubernetes

☕【JVM 技术之旅】让你完全攻克内存溢出(OOM)这一难题(上)

洛神灬殇

JVM OOM 异常 Exception 5月日更

华为HMS生态和1+8+N的交叉点,点透棋局的华为帐号

脑极体

阿里P9架构师强烈推荐:想拿60W以上年薪必看,Java高并发四套小册。

Java架构追梦

Java 阿里巴巴 架构 面试 高并发

我粉了!阿里大牛从内部带出来的百亿级高并发系统,从基础到实战、面面俱到

Java 程序员 架构 面试

首届HarmonyOS开发者创新大赛颁奖典礼于深圳召开

科技汇

仰望天空,脚踏实地 —— CODING OKR 全新上线

CODING DevOps

团队管理 OKR

阿里云原生开源大家族加入中科院软件所开源软件供应链点亮计 - 暑期 2021

阿里巴巴云原生

开源 容器 微服务 开发者 云原生

飞猪基于 Serverless 的云+端实践与思考

阿里巴巴云原生

Serverless 容器 运维 云原生 监控

记十亿级Es数据迁移mongodb成本节省及性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

Hive窗口函数与分析函数

大数据技术指南

hive 5月日更

并发王者课 - 青铜 3: 双刃剑-理解多线程带来的安全问题

MetaThoughts

Java 多线程 并发 王者并发课

推荐计划 | 推荐好友用 CODING,获高额返现奖励

CODING DevOps

团队管理 敏捷开发 研发工具 开发团队

部署混合云环境的5大挑战

云计算

Spark知识点简单总结

五分钟学大数据

大数据 spark 5月日更

2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯

CODING DevOps

DevOps CI/CD

iOS面试--拼多多最新iOS开发面试题

一意孤行的程序员

ios swift 面试 ios开发 知识分享

程序员写好技术文章的几点小技巧

阿里巴巴云原生

程序员 云原生 写作 写作技巧

简单了解 MySQL 中相关的锁

leonsh

MySQL 后端

Nginx的11个执行阶段详解

运维研习社

nginx 运维 源码剖析 5月日更

超级详细!全网独家首发的SpringCloud Alibaba 到底有多强?

Java 程序员 架构 面试

「DataPipeline」完成数千万B轮融资,加速构建中国的世界级数据中间件产品

DataPipeline数见科技

融资

字节跳动Java岗一二三面全经过分享

北游学Java

Java 字节跳动 面试

参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

阿里巴巴云原生

开源 开发者 云原生 dubbo 中间件

做一次黑客,入侵一次服务器

叫我阿柒啊

Docker 入侵 docker远程 redis注入

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