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

介 绍

在本文中你将学会如何使用k3s在Civo上运行Longhorn。若是你还没使用过Civo,能够到官网注册(https://www.civo.com/ )还能够申请免费的使用额度。首先,须要一个Kubernetes集群,而后咱们将安装Longhorn并经过一个示例来展示如何使用它。mysql

云原生应用程序的原理之一是它们旨在成为无状态的,所以能够直接水平扩展应用程序。然而,实际状况是除非你的网站或应用程序所占内存很小,不然你必定须要在某个地方存储这些东西。git

业界巨头(如Google和Amazon)经常会有适用于本公司产品的可扩展存储解决方案的自定义系统。可是对于小型公司来讲,这要怎么办呢?github

业界采用最为普遍的Kubernetes管理平台建立者Rancher Labs(如下简称Rancher)在2018年3月发布了容器化分布式存储项目Longhorn(现已捐献给CNCF),这一项目填补了以上的空缺。简而言之,Longhorn所作的是使用Kubernetes节点的现有磁盘为Kubernetes Pod提供稳定的存储。sql

前期准备

在咱们使用Longhorn以前,你须要有一个正在运行的Kubernetes集群。你能够简单地安装一个k3s集群(https://github.com/rancher/k3s/blob/master/README.md )或者若是你正在使用Civo的Kubernetes服务,你也能够使用它。本文将使用Civo的Kubernetes服务来建立集群。数据库

咱们建议使用最少的Medium实例,由于咱们将测试MySQL的状态存储,它可能会占用大量RAM。api

$ 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。第一步:bash

$ kubectl apply -f https://raw.githubusercontent.com/rancher/longhorn/master/deploy/longhorn.yaml
namespace/longhorn-system created
serviceaccount/longhorn-service-account created
...

建立StorageClass须要使用另外一个命令,然而做为附加步骤,你能够将新的class设置为默认,这样你无需每次都指定它:app

$ 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

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

相关文章
相关标签/搜索