热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

http:rdc.hundsun.comportalarticle826.htmlhttp:rdcqii.hundsun.comportalarticle827.html存储是容器

http://rdc.hundsun.com/portal/article/826.html

http://rdcqii.hundsun.com/portal/article/827.html

存储是容器编排中非常重要的一部分。Kubernetes从v1.2开始,提供了dynamic provisioning这一强大的特性,可以给集群提供按需分配的存储,并能支持包括AWS-EBS、GCE-PD、Cinder-Openstack、Ceph、GlusterFS等多种云存储。而GlusterFS作为分布式文件系统的后起之秀,他们之间会擦出什么样的火花呢?


首先,我们来谈谈Kubernetes部署的应用,可以分为无状态的和有状态的:

▪ 无状态的应用没有数据,Pod(一个或若干容器的集合)挂了被重新拉起,或者在Kubernetes集群不同的Node节点(可以认为是一台物理机或虚拟机)之间飘来飘去,都没有关系;

▪ 有状态的应用有数据需要保存,如果容器挂了被重新拉起,容器里面保存的数据就没了。


这时候我们自然而然地想到可以把数据映射到容器所在主机上,就像我们使用Docker时经常做的一样,可是这时候有个问题是,Kubernetes集群一般有多个Node节点,如果容器在挂了被重新拉起的时候被调度到其他的Node节点,那映射在原先主机上的数据还是在原先主机上,新的容器还是没有原来的数据。


怎么办呢?

这时候就需要本文的另一位重要的主角了--GlusterFS。把数据存储在分布式存储GlusterFS上,Pod通过网络连接到分布式存储,这样不管Pod怎么在不同的Node节点间飘,连接的都是同一个分布式存储,数据都还在。

事实上,Kubernetes的选择很多,目前Kubernetes支持的存储有下面这些:

GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
FC (Fibre Channel)
FlexVolume
Flocker
NFS
iSCSI
RBD (Ceph Block Device)
CephFS
Cinder (OpenStack block storage)
Glusterfs
VsphereVolume
Quobyte Volumes
HostPath (就是刚才说的映射到主机的方式,多个Node节点会有问题)
VMware Photon
Portworx Volumes
ScaleIO Volumes
StorageOS


Kubernetes有这么多选择,GlusterFS只是其中之一,但为什么可以脱颖而出呢?GlusterFS,是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS的Volume有多种模式,复制模式可以保证数据的高可靠性,条带模式可以提高数据的存取速度,分布模式可以提供横向扩容支持,几种模式可以组合使用实现优势互补。

下面就来看看Kubernetes和GlusterFS是怎么结合起来的吧,下面我们进入实战解决你对两者结合的所有困惑。


【部署Kubernetes】
部署方法见文章(点链接)从基础到完成部署,实战讲解Kubernetes如何落地
假设Kubernetes部署在
Master:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

Node:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

Kubernetes版本:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


【部署GlusterFS】
部署机器(这里跟Kubernetes部署在同样的机器):


一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

在每台机器的/etc/hosts加上

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


(以下安装过程--到安装结束的地方--可以使用 http://192.168.58.228:9007/glusterfs/install/ 上的一键安装包安装)
安装yum源(每台机器执行)

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

安装glusterfs(每台机器执行):

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

(安装结束)
启动glusterfs(每台机器执行):
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇
组建集群(192.168.XX.A 机器执行):

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

验证(192.168.XX.A 机器执行):

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

看到其他两个点的信息即代表GlusterFS集群组建成功


【Kubernetes使用GlusterFS】
有两种方式,手动和自动,手动需要每次使用存储时自己创建GlusterFS的卷(GlusterFS的数据存储在卷Volume上);自动利用Kubernetes的 Dynamic Provisioning 特性,可以由Kubernetes自动创建GlusterFS卷,但是需要先部署Heketi软件,并且安装GlusterFS的机器上还要有裸磁盘


手动方式
1)创建GlusterFS卷
▪ 新建卷(3个副本的复制模式)

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ 启动卷

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ 查看卷:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

可以看到所创建的卷的信息。

2)Kubernetes创建PV等存储
Kubernetes用PV(PersistentVolume)、PVC(PersistentVolumeClaim)来使用GlusterFS的存储,PV与GlusterFS的Volume相连,相当于提供存储设备,所以需要由知道GlusterFS Volume的系统管理员创建(这里我们自己就是系统管理员)PVC消耗PV提供的存储,由应用部署人员创建,应用直接使用PVC进而使用PV的存储。
以下操作在Kubernetes Master节点执行
系统管理员创建 endpoint、service、pv(endpoint和service不用每次都建,可以复用):
先创建三个文件:
▪ glusterfs-endpoints.json:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ glusterfs-service.json:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ glusterfs-pv.yaml:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

执行命令创建:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看endpoint、service、pv:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


3)Kubernetes创建应用

应用部署人员创建pvc及应用(这里以mysql为例):
创建两个文件:
▪ glusterfs-pvc.yaml:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ mysql-deployment.yaml:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

执行命令创建:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看pvc、service:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看pod:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

可以看到 Pod 已经被调度到 192.168.XX.A 上。

mysql客户端连接并查看数据库:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

可以看到我们建的liao数据库还在,说明虽然 pod 重新调度,但数据还在。

有人会疑问这里两次连接的都是 192.168.XX.A 的 31016 端口,为什么说连接到了不同的Pod,这是因为Kubernetes的kube-proxy会把我们配置的Service里映射的端口在每个Kubernetes Node上都开出来,也就是在任何一个Kubernetes Node上都能连接到Pod,Pod重新调度后,还是在任何一个Kubernetes Node上都能连接,但后面的Pod其实已经是新的了。



▲自动方式

自动方式需要先部署Heketi软件,Heketi用来管理GlusterFS,并提供RESTful API接口供Kubernetes调用。Heketi需要使用裸磁盘,假设三个GlusterFS节点上都挂了一块裸磁盘 /dev/xvde。接下来我们进入实战模式


【部署Heketi】
部署在

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

安装:(以下安装过程--到安装结束的地方--可以使用 http://192.168.58.228:9007/glusterfs/heketi/ 上的一键安装包安装)
改为公司yum源

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

安装

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

(安装结束)
修改/etc/heketi/heketi.json(省略了没有修改的部分):

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

这里主要把端口改为8083了(防止冲突),executor 改为 ssh, sshexec 的各项配置也做了相应修改。
其中的keyfile制作方法:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

输入key(随便起的名字)一直回车。制作完成后会在当前目录下生成key、key.pub,把 key.pub 上传到GlusterFS三台服务器的 /root/.ssh/ 下面,并重命名为 authorized_keys,/etc/heketi/heketi.json 中 的 keyfile 指向 生成的 key(包含路径)。
启动:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

看日志:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

(Heketi数据目录: /var/lib/heketi)
验证:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

或:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


配置节点
新建 topology.json:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

载入配置:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看拓扑:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

建个大小为2G的volume试试:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

删除:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


【Kubernetes创建StorageClass】
Kubernetes通过创建StorageClass来使用 Dynamic Provisioning 特性,StorageClass连接Heketi,可以根据需要自动创建GluserFS的Volume,StorageClass还是要系统管理员创建,不过StorageClass不需要每次创建,因为这个不需要很多,不同的PVC可以用同一个StorageClass。
新建文件:glusterfs-storageclass.yaml:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


replicate:3代表会创建三个副本复制模式的GluserFS Volume。
执行命令创建:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇


【Kubernetes创建应用】

应用部署人员创建pvc及应用(本文还是以mysql为例)
创建两个文件:
▪ glusterfs-pvc.yaml:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

▪ mysql-deployment.yaml:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

执行命令创建:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看endpoint、service、pv,可以发现这些都自动建好了:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

查看PVC:

一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

c可以看到PV和PVC已经绑定好。
还是可以用刚才的命令连接到mysql:
一篇讲透Kubernetes与GlusterFS之间的爱恨情仇

按刚才的方式测试mysql pod重新调度后数据还在不在,可以发现数据还在。

从上一篇文章可以看到手动方式需要系统管理员每次手动建GlusterFS的Volume和Kubernetes的PV,或者系统管理员事先建好一批Volume和PV。而本文所介绍的自动方式则是不需要,Kubernetes可以根据应用部署人员的需要动态创建Volume和PV,节省了很多工作量,所以,得出的结论就是推荐使用自动方式。




本文转载自恒生技术之眼


推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
author-avatar
songaihua853185820299
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有