介 绍

在本文中你将学会如何使用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 --wait
Building 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-play
civo k8s config longhorn-test > civo-longhorn-test-config
export 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.yaml
namespace/longhorn-system created
serviceaccount/longhorn-service-account created
...

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

$ kubectl apply -f https://raw.githubusercontent.com/rancher/longhorn/master/examples/storageclass.yaml
storageclass.storage.k8s.io/longhorn created$ kubectl get storageclass
NAME       PROVISIONER           AGE
longhorn   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 storageclass
NAME                 PROVISIONER           AGE
longhorn (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/v1beta1
kind: Ingress
metadata:name: longhorn-ingressannotations:ingress.kubernetes.io/auth-type: "basic"ingress.kubernetes.io/auth-secret: "longhorn-auth"
spec:rules:- host: longhorn-frontend.example.comhttp:paths:- backend:serviceName: longhorn-frontendservicePort: 80

然后应用它:

$ kubectl apply -f longhorn-ingress.yaml -n longhorn-system
ingress.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: v1
kind: PersistentVolume
metadata:name: mysql-pvnamespace: appslabels:name: mysql-datatype: longhorn
spec:capacity:storage: 5GvolumeMode: FilesystemstorageClassName: longhornaccessModes:- ReadWriteOncecsi:driver: io.rancher.longhornfsType: ext4volumeAttributes:numberOfReplicates: '2'staleReplicaTimeout: '20'volumeHandle: mysql-data

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pv-claimlabels:type: longhornapp: example
spec:storageClassName: longhornaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi

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

apiVersion: apps/v1
kind: Deployment
metadata:name: my-mysqllabels:app: example
spec:selector:matchLabels:app: exampletier: mysqlstrategy:type: Recreatetemplate:metadata:labels:app: exampletier: mysqlspec:containers:- image: mysql:5.6name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pv-claim

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

$ kubectl apply -f mysql.yaml
persistentvolumeclaim/mysql-pv-claim created
persistentvolume/mysql-pv created
deployment.apps/my-mysql created# orkubectl apply -f ./mysql/
persistentvolumeclaim/mysql-pv-claim created
persistentvolume/mysql-pv created
deployment.apps/my-mysql created

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

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

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

$ kubectl get pods | grep mysql
my-mysql-d59b9487b-7g644   1/1     Running   0          2m28s
$ kubectl exec -it my-mysql-d59b9487b-7g644 /bin/bash
root@my-mysql-d59b9487b-7g644:/# mysql -u root -p mysql
Enter 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> exit
Bye
root@my-mysql-d59b9487b-7g644:/# exit
exit

现在,我们将删除容器:

kubectl delete pod my-mysql-d59b9487b-7g644

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

$ kubectl get pods | grep mysql
my-mysql-d59b9487b-8zsn2   1/1     Running   0          84s
$ kubectl exec -it my-mysql-d59b9487b-8zsn2 /bin/bash
root@my-mysql-d59b9487b-8zsn2:/# mysql -u root -p mysql
Enter 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> exit
Bye
root@my-mysql-d59b9487b-7g644:/# exit
exit

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

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

  1. Android数据持久化存储

    Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...

  2. 深入浅出聊聊Kubernetes存储(二):搞定持久化存储

    回 顾 在本系列文章的上一篇中,我们讲到了PV,PVC,Storage Class以及Provisioner 简单回顾一下: PV在最一开始是设计成了一个需要管理员预先分配的存储块.引入Storage ...

  3. uni-app 小程序项目三 1. 商品列表、过滤器、封装商品item组件、上拉加载、节流阀、下拉刷新、2. 商品详情、轮播图、商品价格闪烁问题 3.加入购物车、vuex、持久化存储、mixiins

    1.0 创建 goodslist 分支 1.1 定义请求参数对象 为了方便发起请求获取商品列表的数据,我们要根据接口的要求,事先定义一个请求参数对象: data() {return {// 请求参数对 ...

  4. 【云原生】阿里云ACK部署MySQL 数据持久化存储

    思路图 一.概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Ku ...

  5. 大数据,轻松应对海量数据存储与分析所带来的挑战

    文章目录 一.前言 二.Spark 2.1 Spark架构 2.2 Spark核心组件 2.3 Spark编程模型 2.4 Spark计算模型 2.5 Spark运行流程 2.6 Spark RDD流 ...

  6. 【入门级教程】python使用scrapy库实现爬虫

    文章目录 搭建scrapy项目 安装scrapy 构造scrapy框架 构建一个爬虫 分析网页 观察网页源代码 学习网页结构(了解可以跳过) 学习网页表格(了解可以跳过) 学习XPath语法(了解可以 ...

  7. Android--数据持久化存储概述

    Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...

  8. 使用Ceph集群作为Kubernetes的动态分配持久化存储

    2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...

  9. 14、Kubernetes持久化存储

    文章目录 前言 步骤 持久化服务器上操作 设置挂载路径 Node节点上操作 PV和PVC 实现流程 举例 前言 之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对 ...

  10. Flutter持久化存储之文件存储

    前言 本篇将给大家分享Flutter中的file存储功能,Flutter SDK本身已经有File相关的api,所以在Flutter中使用file存储的关键是如何获取手机中存储的目录,然后根据目录路径 ...

最新文章

  1. 春天来了,我也发“芽”了!
  2. python编程培训多少钱-python培训一般多少钱?[python培训]
  3. 笔记-项目管理过程组与知识领域(基础)
  4. 《Java程序设计》实验报告——Java的接口与继承
  5. Django模板语言
  6. linux sshd启动失败 sshd re-exec requires execution with an absolute path
  7. 矩阵论-集合与映射,线性空间及其性质
  8. 【我的物联网成长记14】车路协同,不只是车和路
  9. iphone7无服务_iphone7无服务无信号怎么办
  10. [下载] Zend studio 8 Windows版
  11. Java课程设计-学生成绩管理系统
  12. html网站计数器代码,网站计数器(示例代码)
  13. 电脑中病毒了一直下载安装软件怎么办?
  14. python浪漫代码表白npy_python实现npy格式文件转换为txt文件操作
  15. 【SSM框架项目 客户关系管理系统CRM 学习开发 Day3】市场活动模块的数据导入与导出
  16. 无法打开匿名级安全令牌解决方法
  17. 会议OA项目---我的审批(审批会议签字)
  18. Kalrry记录---ing
  19. 树莓派CM4六路串口设置及使用
  20. matlab怎样编程形成软件_Matlab编程笔记之GUI程序转exe

热门文章

  1. 牛客java选择题每日打卡Day12
  2. 利用有放回抽样估计自然常数e python
  3. C/C++项目:魂斗罗游戏
  4. Windows 10 创意者更新-1703所有版本汇总
  5. 场景图生成论文阅读笔记 之 LinkNet: Relational Embedding for Scene Graph
  6. Windows如何编辑hosts
  7. matlab 将矩阵变为一列,MATLAB中把一个矩阵转换为一列
  8. lisp 左手钢筋_左手键配置程序
  9. r语言 精美rda图_R语言高质量绘图的10条tips
  10. 网页前端上传文件,后端接受并处理文件