Kubernetes 部署 GlusterFS + Heketi 存储集群

Kubernetes 部署 GlusterFS + Heketi 存储集群

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • 系统版本:CentOS 7.6
  • Kubernetes版本:1.14.0
  • GlusterFS版本:glusterfs 4.1.7
  • heketi镜像版本:keheti/heketi:dev
  • GusterFS镜像版本:gluster/gluster-centos:gluster4u1_centos7

注: 这里说明一下,感觉该项目关注度少,还是比较推荐 Rook 搭建 Ceph 的分布式存储更可靠些。

Kubernetes 节点

地址 主机名 内存&CPU 角色
192.168.2.11 k8s-master-2-11 4C & 4G master
192.168.2.12 k8s-node-2-12 2c & 4G node
192.168.2.13 k8s-node-2-13 2c & 4G node
192.168.2.14 k8s-node-2-14 2c & 4G node
192.168.2.15 k8s-node-2-15 2c & 4G node

GlusterFS 占用的节点

地址 主机名 内存&CPU 角色
192.168.2.12 k8s-node-2-12 2c & 4G node
192.168.2.13 k8s-node-2-13 2c & 4G node
192.168.2.14 k8s-node-2-14 2c & 4G node

一、存储选型

以下是官方支持的存储技术列表,将在其中选择,其中本地存储选择比较多的是 GlusterFS 和 CephFS,因为方便维护原因,这里选择 GlusterFS。

Volume Plugin Internal Provisioner Config Example
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
Flexvolume - -
Flocker -
GCEPersistentDisk GCE PD
Glusterfs Glusterfs
iSCSI - -
Quobyte Quobyte
NFS - -
RBD ✓ Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
ScaleIO ScaleIO
StorageOS StorageOS
Local - Local

二、介绍

1、GlustrerFS 介绍

(1)、GlusterFS 简介

GlusterFS 是一个可扩展,分布式文件系统,集成来自多台服务器上的磁盘存储资源到单一全局命名空间,已提供共享文件存储。

(2)、Gluster 优势

  • 可以扩展到几PB容量
  • 支持处理数千个客户端
  • 兼容POSIX接口
  • 使用通用硬件,普通服务器即可构建
  • 能够使用支持扩展属性的文件系统,例如ext4,XFS
  • 支持工业标准的协议,例如NFS,SMB
  • 提供很多高级功能,例如副本,配额,跨地域复制,快照以及bitrot检测
  • 支持根据不同工作负载进行调优

2、Heketi 介绍

(1)、Heketi 简介

提供基于RESTful接口管理glusterfs的功能,可以方便的创建集群管理 GlusterFS 的 node,device,volume 与 Kubernetes 结合可以创建动态的 PV,扩展 GlusterFS 存储的动态管理功能。

  • Heketi动态在集群内选择bricks构建指定的volumes,以确保副本会分散到集群不同的故障域内。
  • Heketi还支持任意数量的ClusterFS集群,以保证接入的云服务器不局限于单个GlusterFS集群。

三、GlusterFS 安装环境设置

1、安装要求

在 Kubernetes 下安装 GlusterFS 必须满足以下要求,否则安装可能会报错。

(1)、三个节点

GlusterFS 安装至少需要三个节点来组成 GlusterFS 存储集群,所以 Kubernetes 集群至少要有三个节点。

(2)、开放端口

每个节点必须为 GlusterFS 通信打开以下端口:

  • 2222 - GlusterFS pod的sshd
  • 24007 - GlusterFS守护程序
  • 24008 - GlusterFS管理

(3)、原始块设备

每个节点必须至少连接一个原始块设备(如空的本地磁盘)供 heketi 使用。这些设备上不得有任何数据,因为它们将由 heketi 格式化和分区。简单意思就是需要一个没有数据的空的本地硬盘。

(4)、安装 glusterfs-fuse 工具

每个节点都要求该mount.glusterfs命令可用。在所有基于Red Hat的操作系统下,该命令由 glusterfs-fuse 包提供,所以需要安装 glusterfs-fuse 工具。

(5)、加载内核

必须加载以下内核模块:

  • dm_snapshot
  • dm_mirror
  • dm_thin_pool

(6)、kube-apiserver 开启 privileged

GlusterFS 在 Kubernetes 集群中需要以特权运行,需要在 kube-apiserver 中添加“--allow-privileged=true”参数以开启此功能。

2、配置要求的环境

将以下配置设置到各个要安装 GlusterFS 节点的机器上。

(1)、查看 Kubernetes 集群是否有三个节点

1$ kubectl get nodes
2
3NAME              STATUS   ROLES    AGE   VERSION
4k8s-master-2-11   Ready    master   49d   v1.14.0
5k8s-node-2-12     Ready    <none>   49d   v1.14.0
6k8s-node-2-13     Ready    <none>   49d   v1.14.0
7k8s-node-2-14     Ready    <none>   13h   v1.14.0

(2)、开放端口

首先查看端口列表来查找下该端口,查看是否被占用,无法找到不存在则没问题。

1$ netstat -ntlp | grep -E '2222|24007|24008'

这里为了方便,将关闭防火墙(一般 kubernetes 集群防火墙已经关闭,检查一下如果关闭则跳过即可)。

1$ systemctl stop firewalld
2$ systemctl disable firewalld

(3)、原始块设备

这里是挂载了一块硬盘,且没有分区,检查一下磁盘情况。

 1$ lsblk
 2
 3NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
 4sda               8:0    0   50G  0 disk 
 5├─sda1            8:1    0    1G  0 part /boot
 6└─sda2            8:2    0   49G  0 part 
 7  ├─centos-root 253:0    0 45.1G  0 lvm  /
 8  └─centos-swap 253:1    0  3.9G  0 lvm  
 9sdb
10sr0              11:0    1  4.3G  0 rom  

显示的 /sdb 即是新挂载的硬盘设备,且没有进行分区。

记住此硬盘符,下面配置时候需要使用。

(4)、安装 glusterfs-fuse 工具

1$ yum -y install glusterfs-fuse

(5)、加载内核

加载模块

1$ modprobe dm_snapshot
2$ modprobe dm_mirror
3$ modprobe dm_thin_pool

查看是否加载模块

1$ lsmod | grep dm_snapshot
2$ lsmod | grep dm_mirror
3$ lsmod | grep dm_thin_pool

(6)、kube-apiserver 开启 privileged

如果 Kubernetes 集群是 Kuberadm 安装则该参数默认开启,不需要配置。

编辑 kube-apiserver.yaml

1$ vim /etc/kubernetes/manifests/kube-apiserver.yaml

在参数列添加下面参数:

1    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
2    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
3    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
4    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
5    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key