阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

评论

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

模块五

ASCE

在线Base64编码加密解密还原工具

入门小站

工具

【刷题第六天】35. 搜索插入位置

白日梦

5月月更

【C语言】指针One之[概念、前言、内存、地址与指针、变量与地址]

謓泽

C语言 5月月更

架构实战营作业五

库尔斯

#架构实战营

为什么你的maven打包老是出现问题

ZuccRoger

5月月更

时序数据库在智慧用电领域的应用

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

微博评论高性能高可用计算架构设计

踩着太阳看日出

架构训练营

区块链+供应链:共建全国统一大市场

CECBC

全国唯一!这家企业的工业互联网平台上云啦!

天翼云开发者社区

云计算 解决方案 云服务 工业互联网 云平台

企评家|海信视像科技股份有限公司成长性报告简述

企评家

下个牛市,Web3世界的龙头项目PlatoFarm能否踏足山巅

BlockChain先知

面试答不上Java并发编程?阿里P8提供的27道并发面试解析,请查收

Java浪潮

Java spring 架构 编程语言

druid 源码阅读(三)初始化连接池(2)

爱晒太阳的大白

5月月更

面试还不会Spring?阿里P8总结的100道面试解析,让你实锤面试官

Java浪潮

Java 编程 架构

【LeetCode】删列造序Java题解

Albert

LeetCode 5月月更

强强联合,天翼云安全能力再升级!

天翼云开发者社区

云计算 基础设施 云服务 云安全

百度智能云特色城市业务指挥平台,助力城市管理更智能

百度开发者中心

Maven 简介及安装

Emperor_LawD

maven 5月月更

再谈JavaScript 中的对象解构

devpoint

JavaScript ES6 5月月更 赋值解构 对象操作

在线TSV转XML/JSON工具

入门小站

工具

基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)

声网

音视频 sdk

通用池化框架commons-pool2实践

FunTester

Redis「1」流水线、事务、Lua 脚本

Samson

Redis 核心技术与实战 5月月更

元宇宙参与指南——如何融入元宇宙建设?

CECBC

企评家,专注企业评价,为企事业单位提供信息数据支撑

企评家

工业金属零部件质检解决方案详解,让AI质检一步到位!

百度开发者中心

ElasticSearch查询流程详解

IT巅峰技术

守护数据安全,天翼云是认真的!

天翼云开发者社区

云计算 云服务 数据安全

设计微博系统中”微博评论“的高性能高可用计算架构

流火

linux之yum源设置代理

入门小站

Linux

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