在本文中你将学会如何使用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
在现有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,能够在上面看到已使用的空间、可用空间、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毫无心义,由于当基础节点(容器)死亡时,相关的业务也就没法运行,这时你会失去客户、失去订单。在这里,咱们要为它配置一个新的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
咱们的测试十分简单,建立一个新的数据库,删除容器(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
圆满成功!咱们的存储在被杀死个各个容器中得以持久保存。