介 绍

在本文中你将学会如何使用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-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-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-pv
namespace: apps
labels:
name: mysql-data
type: longhorn
spec:
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: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
type: longhorn
app: example
spec:
storageClassName: longhorn
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi

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

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-mysql
labels:
app: example
spec:
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.yaml
persistentvolumeclaim/mysql-pv-claim created
persistentvolume/mysql-pv created
deployment.apps/my-mysql created # or kubectl 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. IOS开发-本地持久化存储sqlite应用

    前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程:                     我的第一个IOS开发应用    本章主要将介 ...

  2. ios持久化存储

    前言 iOS中常用的持久化存储方式有好几种: 偏好设置(NSUserDefaults) plist文件存储 归档 SQLite3 Core Data 沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就 ...

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

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

  4. Centos7——docker持久化存储和卷间状态共享(笔记)

    docker持久化存储和卷间状态共享(笔记)  本章介绍 存储卷的介绍 存储卷的两种类型 宿主机好额容器之间如何共享数据 容器之间如何共享数据 存储卷的声明周期 存储卷之间的数据管理和控制模式 就像在 ...

  5. Kubernetes 持久化存储是个难题,解决方案有哪些?\n

    像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...

  6. Redis持久化存储——>RDB & AOF

    Redis中两种持久化存储机制RDB和AOF redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB ...

  7. store.js - 轻松实现本地存储(LocalStorage)

    store.js 是一个兼容所有浏览器的 LocalStorage 包装器,不需要借助 Cookie 或者 Flash.store.js 会根据浏览器自动选择使用 localStorage.globa ...

  8. Web持久化存储Web SQL、Local Storage、Cookies(常用)

    在浏览器客户端记录一些信息,有三种常用的Web数据持久化存储的方式,分别是Web SQL.Local Storage.Cookies. Web SQL 作为html5本地数据库,可通过一套API来操纵 ...

  9. iOS数据持久化存储:归档

    在平时的iOS开发中,我们经常用到的数据持久化存储方式大概主要有:NSUserDefaults(plist),文件,数据库,归档..前三种比较经常用到,第四种归档我个人感觉用的还是比较少的,恰恰因为用 ...

随机推荐

  1. jq杂项方法/工具方法----isArray()

    https://www.cnblogs.com/sandraryan/ $.isArray()函数用于判断指定参数是否是一个数组.返回布尔值. <!DOCTYPE html> <ht ...

  2. css 百分比继承关系的探讨

    引入:近日在回顾css基础的时候发现了一个有趣的问题,就是css在继承百分比类属性的时候是继承百分比后再根据父级宽高计算,还是继承父级根据百分比计算过后的绝对值.下面举一个简单的例子来描述这一个问题, ...

  3. Codeforces 1100F(离线 or 在线)

    传送门 •参考资料 [1]:在线线性基 [2]:离线线性基 [3]:离线线性基 •题意 给你 n 个数,m 次询问: 每次询问给定一个区间 $l,r$,求 $a_{l \cdots r}$ 异或的最大 ...

  4. thinter图形开发界面

    tkinter编程步骤 导入Tkinter 创建控件 import thinter 创建主窗口 #win = tkinter.Tk() 设置标题 win.title("xiaoxin&quo ...

  5. vue-learning:2 - template - directive

    指令 directive 在上一节我们知道,VUE的template模板通过VUE指令API实现与页面的视图层联系.所以本节将聚集在实现视图层交互的VUE指令系统directive的基础使用. 我们先 ...

  6. 魅族--魅蓝metal

      评论:金属潮流平民化

  7. 解读中兴通信在物联网行业如何践行DDD

    此前,在由 ThoughtWorks 举办的领域驱动设计峰会 DDD-China 2019 上,InfoQ 记者就开发团队为何需要 DDD.目前业界实践 DDD 的挑战等问题对中兴通讯资深软件架构师张 ...

  8. 23.logging

    转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 一 (简单应用) import logging logging.debug('de ...

  9. 第二阶段:2.商业需求分析及BRD:5.商业需求文档1

    三大文档 FSD一般包含在PRD 1.BRD一般是去向决策层汇报 2.产品介绍的各项是可选的 不是必备的 产品线路图就是roodmap.团队一般是偏技术的团队. BRD案例. 痛点.定性的描述.不会非 ...

  10. mac 访达修改所有文件夹默认排序方式

    先说个误区,下图只能改变当前目录的排序方式 修改所有目录的排序方式需要在顶部的“显示” 中修改