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 --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入门级教程!轻松实现持久化存储!相关推荐
- Android数据持久化存储
Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...
- 深入浅出聊聊Kubernetes存储(二):搞定持久化存储
回 顾 在本系列文章的上一篇中,我们讲到了PV,PVC,Storage Class以及Provisioner 简单回顾一下: PV在最一开始是设计成了一个需要管理员预先分配的存储块.引入Storage ...
- uni-app 小程序项目三 1. 商品列表、过滤器、封装商品item组件、上拉加载、节流阀、下拉刷新、2. 商品详情、轮播图、商品价格闪烁问题 3.加入购物车、vuex、持久化存储、mixiins
1.0 创建 goodslist 分支 1.1 定义请求参数对象 为了方便发起请求获取商品列表的数据,我们要根据接口的要求,事先定义一个请求参数对象: data() {return {// 请求参数对 ...
- 【云原生】阿里云ACK部署MySQL 数据持久化存储
思路图 一.概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Ku ...
- 大数据,轻松应对海量数据存储与分析所带来的挑战
文章目录 一.前言 二.Spark 2.1 Spark架构 2.2 Spark核心组件 2.3 Spark编程模型 2.4 Spark计算模型 2.5 Spark运行流程 2.6 Spark RDD流 ...
- 【入门级教程】python使用scrapy库实现爬虫
文章目录 搭建scrapy项目 安装scrapy 构造scrapy框架 构建一个爬虫 分析网页 观察网页源代码 学习网页结构(了解可以跳过) 学习网页表格(了解可以跳过) 学习XPath语法(了解可以 ...
- Android--数据持久化存储概述
Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...
- 使用Ceph集群作为Kubernetes的动态分配持久化存储
2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...
- 14、Kubernetes持久化存储
文章目录 前言 步骤 持久化服务器上操作 设置挂载路径 Node节点上操作 PV和PVC 实现流程 举例 前言 之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对 ...
- Flutter持久化存储之文件存储
前言 本篇将给大家分享Flutter中的file存储功能,Flutter SDK本身已经有File相关的api,所以在Flutter中使用file存储的关键是如何获取手机中存储的目录,然后根据目录路径 ...
最新文章
- 春天来了,我也发“芽”了!
- python编程培训多少钱-python培训一般多少钱?[python培训]
- 笔记-项目管理过程组与知识领域(基础)
- 《Java程序设计》实验报告——Java的接口与继承
- Django模板语言
- linux sshd启动失败 sshd re-exec requires execution with an absolute path
- 矩阵论-集合与映射,线性空间及其性质
- 【我的物联网成长记14】车路协同,不只是车和路
- iphone7无服务_iphone7无服务无信号怎么办
- [下载] Zend studio 8 Windows版
- Java课程设计-学生成绩管理系统
- html网站计数器代码,网站计数器(示例代码)
- 电脑中病毒了一直下载安装软件怎么办?
- python浪漫代码表白npy_python实现npy格式文件转换为txt文件操作
- 【SSM框架项目 客户关系管理系统CRM 学习开发 Day3】市场活动模块的数据导入与导出
- 无法打开匿名级安全令牌解决方法
- 会议OA项目---我的审批(审批会议签字)
- Kalrry记录---ing
- 树莓派CM4六路串口设置及使用
- matlab怎样编程形成软件_Matlab编程笔记之GUI程序转exe