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
6    - --requestheader-allowed-names=front-proxy-client
7    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
8    - ......(略,添加下面参数)
9    - --allow-privileged=true

四、设置 GlusterFS 安装配置

以下操作将在 Kubernetes Master 节点上进行操作

1、节点贴标签

需要安装 GlusterFS 的 Kubernetes 点击上设置 Label,因为 GlusterFS 是通过 Kubernetes 集群的 “DaemonSet” 方式安装的。

DaemonSet 安装方式默认会在每个节点上都进行安装,除非安装前设置筛选要安装节点 Label,带上此标签的节点才会安装。

安装脚本中设置 DaemonSet 中设置安装在贴有 “storagenode=glusterfs” 的节点,所以这是事先将节点贴上对应 Label。

(1)、Kubernetes 节点设置标签

1$ kubectl label node k8s-node-2-12 storagenode=glusterfs 
2$ kubectl label node k8s-node-2-13 storagenode=glusterfs
3$ kubectl label node k8s-node-2-14 storagenode=glusterfs

(2)、查看节点标签是否设置成功

1$ kubectl get nodes --show-labels
2
3NAME           STATUS   ROLES    AGE   VERSION   LABELS
4k8s-node-2-12  Ready    <none>   13d   v1.14.0   IngressProxy=true,beta.kubernetes.io/arch=amd64,storage=glusterfs
5k8s-node-2-13  Ready    <none>   13d   v1.14.0   IngressProxy=true,beta.kubernetes.io/arch=amd64,storage=glusterfs
6k8s-node-2-14  Ready    <none>   13d   v1.14.0   IngressProxy=true,beta.kubernetes.io/arch=amd64,storage=glusterfs

2、准备部署文件

在 Kubernetes 集群中部署 GlusterFS 可以借助 gluster-kubernetes,gluster-kubernetes 是一个为 Kubernetes 管理员提供一种机制,可以将 GlusterFS 作为本机存储服务轻松部署到现有 Kubernetes 集群上的工具,让 GlusterFS 像 Kubernetes 中的任何其他应用程序一样进行管理和编排。这是在 Kubernetes 中释放动态配置的持久性 GlusterFS 卷的强大功能的便捷方式,下面将下载对应部署文件,执行部署脚本进行安装。

(1)、GitHub 拉取源码

1$ git clone https://github.com/gluster/gluster-kubernetes.git

(2)、进入源码部署文件夹

1$ cd gluster-kubernetes/deploy

(3)、改变部署文件名称

安装文件中提供了一个 topology.json.sample 文件,里面可以设置安装节点信息,但是官方默认后缀为 .json.sample,需要将 sample 后缀去掉变为 json 以生效。

1$ mv topology.json.sample topology.json

3、修改配置文件

打开拓扑文件 topology.json,修改其中的默认配置对应我们当前的 Kubernetes 集群配置。

1$ vi topology.json

例如这里改成对应我的 kubernetes 集群,为:

 1{
 2  "clusters": [
 3    {
 4      "nodes": [
 5        {
 6          "node": {
 7            "hostnames": {
 8              "manage": [
 9                "k8s-node-2-12"
10              ],
11              "storage": [
12                "192.168.2.12"
13              ]
14            },
15            "zone": 1
16          },
17          "devices": [
18            "/dev/sdb"
19          ]
20        },
21        {
22          "node": {
23            "hostnames": {
24              "manage": [
25                "k8s-node-2-13"
26              ],
27              "storage": [
28                "192.168.2.13"
29              ]
30            },
31            "zone": 1
32          },
33          "devices": [
34            "/dev/sdb"
35          ]
36        },
37        {
38          "node": {
39            "hostnames": {
40              "manage": [
41                "k8s-node-2-14"
42              ],
43              "storage": [
44                "192.168.2.14"
45              ]
46            },
47            "zone": 1
48          },
49          "devices": [
50            "/dev/sdb"
51          ]
52        }
53      ]
54    }
55  ]
56}

修改参数说明:

  • manage: Kubernetes 需要安装 GlusterFS 的各个节点名称。
  • sotrage: Kubernetes 节点对应的 IP 地址。
  • devices: 节点系统上相应的磁盘块设备,可以通过 "fdisk -l" 命令查看,例如这里就是上面挂在的硬盘符 “/dev/sdb”

五、Kubernetes 安装 GlusterFS

1、Kubernetes 创建 Namespace

Kubenetes 创建一个名称为 storage 的 Namespace,供 GlusterFS 使用 (当然,放在 kube-system 空间下亦可)

1$ kubectl create namespace storage

2、部署 GlusterFS

  • -n 是指定安装到 Kubernetes 集群下的 Namespace
  • -g 是指创建新的集群
1$ ./gk-deploy -g -n storage

安装日志信息:

 1$ ./gk-deploy -g -n storage
 2
 3Welcome to the deployment tool for GlusterFS on Kubernetes and OpenShift.
 4Before getting started, this script has some requirements of the execution
 5environment and of the container platform that you should verify.
 6The client machine that will run this script must have:
 7 * Administrative access to an existing Kubernetes or OpenShift cluster
 8 * Access to a python interpreter 'python'
 9Each of the nodes that will host GlusterFS must also have appropriate firewall
10rules for the required GlusterFS ports:
11 * 2222  - sshd (if running GlusterFS in a pod)
12 * 24007 - GlusterFS Management
13 * 24008 - GlusterFS RDMA
14 * 49152 to 49251 - Each brick for every volume on the host requires its own
15   port. For every new brick, one new port will be used starting at 49152. We
16   recommend a default range of 49152-49251 on each host, though you can adjust
17   this to fit your needs.
18The following kernel modules must be loaded:
19 * dm_snapshot
20 * dm_mirror
21 * dm_thin_pool
22For systems with SELinux, the following settings need to be considered:
23 * virt_sandbox_use_fusefs should be enabled on each node to allow writing to
24   remote GlusterFS volumes
25In addition, for an OpenShift deployment you must:
26 * Have 'cluster_admin' role on the administrative account doing the deployment
27 * Add the 'default' and 'router' Service Accounts to the 'privileged' SCC
28 * Have a router deployed that is configured to allow apps to access services
29   running in the cluster
30Do you wish to proceed with deployment?
31
32[Y]es, [N]o? [Default: Y]: y
33Using Kubernetes CLI.
34Using namespace "storage".
35Checking for pre-existing resources...
36  GlusterFS pods ... found.
37  deploy-heketi pod ... not found.
38  heketi pod ... not found.
39  gluster-s3 pod ... not found.
40Creating initial resources ... Error from server (AlreadyExists): error when creating "/usr/local/glusterfs/deploy/kube-templates/heketi-service-account.yaml": serviceaccounts "heketi-service-account" already exists
41Error from server (AlreadyExists): clusterrolebindings.rbac.authorization.k8s.io "heketi-sa-view" already exists
42clusterrolebinding.rbac.authorization.k8s.io/heketi-sa-view not labeled
43OK
44secret/heketi-config-secret created
45secret/heketi-config-secret labeled
46service/deploy-heketi created
47deployment.extensions/deploy-heketi created
48Waiting for deploy-heketi pod to start ... OK
49Creating cluster ... ID: da2f4e8619698c655de0c28312fb7ec8
50Allowing file volumes on cluster.
51Allowing block volumes on cluster.
52Creating node k8s-node-2-12 ... ID: a11d14623a516c8798a82a81e331e16e
53Adding device /dev/sdb ... OK
54Creating node k8s-node-2-13 ... ID: 2c55d2da091bcb7c40b6400557e41ba6
55Adding device /dev/sdb ... OK
56Creating node k8s-node-2-14 ... ID: fd29f688d5b6cfc1a8b8a56f7a362e64
57Adding device /dev/sdb ... OK
58heketi topology loaded.
59Saving /tmp/heketi-storage.json
60secret/heketi-storage-secret created
61endpoints/heketi-storage-endpoints created
62service/heketi-storage-endpoints created
63job.batch/heketi-storage-copy-job created
64service/heketi-storage-endpoints labeled
65pod "deploy-heketi-865f55765-m8wg4" deleted
66service "deploy-heketi" deleted
67deployment.apps "deploy-heketi" deleted
68replicaset.apps "deploy-heketi-865f55765" deleted
69job.batch "heketi-storage-copy-job" deleted
70secret "heketi-storage-secret" deleted
71service/heketi created
72deployment.extensions/heketi created
73Waiting for heketi pod to start ... OK
74......到这里已经完成安装

3、部署失败清除

部署失败使用下面命令清除对应 Kubernetes 资源,再将节点的目录/var/lib/glusterd清空,删除磁盘的 vg 和 pv

  • -n 是指定安装到 Kubernetes 集群下的 Namespace
1$ ./gk-deploy -g --abort -n storage

4、部署中遇到的问题

  • 遇到的问题1:

如果遇到如下问题,请确认是否挂载了新硬盘且未分区格式化等。

1initialized or contains data?):   WARNING: Device /dev/centos/root not initialized in udev database even after waiting 10000000 microseconds.
  • 遇到的问题2:

如果卡在heketi topology loaded.不动,请查看是否给 Kubernetes 节点设置 Label,或 GlusterFS 要求最少三个节点,请查看是否满足需求。

1Creating node k8s-node-2-13 ... ID: 2c55d2da091bcb7c40b6400557e41ba6
2Adding device /dev/sdb ... OK
3Creating node k8s-node-2-14 ... ID: fd29f688d5b6cfc1a8b8a56f7a362e64
4Adding device /dev/sdb ... OK
5heketi topology loaded.

5、查看资源

安装完成后 Kubernetes 集群 安装的 Namespace 下应该存下面这些 Pod、Service

 1$ kubectl get pods,service -n storage
 2
 3[root@k8s-master-2-11 ~]# 
 4NAME                     READY   STATUS    RESTARTS   AGE
 5glusterfs-lkjwq          1/1     Running   0          16h
 6glusterfs-mtlq4          1/1     Running   0          16h
 7glusterfs-tb867          1/1     Running   0          16h
 8heketi-85dbbbb55-cndgz   1/1     Running   0          15h
 9
10NAME                                                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
11service/glusterfs-dynamic-41db5f46-7344-11e9-8b45-000c29d98 ClusterIP   10.10.126.0     <none>        1/TCP      15h
12service/heketi                                              ClusterIP   10.10.249.63    <none>        8080/TCP   16h
13service/heketi-storage-endpoints                            ClusterIP   10.10.211.195   <none>        1/TCP      16h

六、测试 GlusterFS

这里将进行创建一个 StorageClass,然后创建 PVC 进行测试,看其是否能自动生成 PV。之后再创建一个 Nnginx Pod,在其中容器挂载目录创建一个 index.html 文件,然后进入 GlusterFS 容器内查看能否找到对应资源。

1、创建 StorageClass

(1)、gluserfs-sc.yaml

 1apiVersion: storage.k8s.io/v1
 2kind: StorageClass
 3metadata:
 4  name: glusterfs-sc                    #---SorageClass 名称
 5provisioner: kubernetes.io/glusterfs
 6parameters:
 7  resturl: "http://10.10.249.63:8080"   #---heketi service的cluster ip 和端口
 8  restuser: "admin"                     #---任意填写,因为没有启用鉴权模式
 9  restuserkey: "My Secret Life"         #---任意填写,因为没有启用鉴权模式
10  gidMin: "40000"
11  gidMax: "50000"
12  volumetype: "replicate:3"             #---申请的副本数,默认为3副本模式

(2)、创建 StorageClass

1$ kubectl apply -f gluserfs-sc.yaml

(3)、查看 StorageClass

1$ kubectl get storageclass
2
3NAME           PROVISIONER               AGE
4glusterfs-sc   kubernetes.io/glusterfs   15h

2、创建 PVC

(1)、gluserfs-pvc.yaml

 1kind: PersistentVolumeClaim
 2apiVersion: v1
 3metadata:
 4  name: myclaim
 5  annotations:
 6    volume.beta.kubernetes.io/storage-class: "glusterfs-sc"   #---需要与storageclass的名称一致
 7spec:
 8  accessModes:
 9    - ReadWriteOnce
10  resources:
11    requests:
12      storage: 1Gi       #---设置请求大小为1G

(2)、创建 pvc

  • -n 设置创建的 namespace,这里替换成自己想创建 PVC 资源的 namespace
1$ kubectl apply -f gluserfs-pvc.yaml -n mydlqcloud

(3)、查看PVC

1$ kubectl get pvc -n mydlqcloud
2
3NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
4myclaim   Bound    pvc-41db5f46-7344-11e9-8b45-000c29d98697   1Gi        RWO            glusterfs-sc   15h

3、查看是否创建 PV

1$ kubectl get pv | grep myclaim
2
3pvc-41db5f46-7344-11e9-8b45-000c29697  1Gi  RW  delete   Bound   storage/myclaim   glusterfs-sc  15h

4、创建一个使用 PVC 的 Nginx Pod

(1)、nginx-pod.yaml

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: nginx-pod
 5  labels:
 6    name: nginx-pod
 7spec:
 8  containers:
 9  - name: nginx-pod
10    image: nginx:1.16.0-alpine
11    ports:
12    - name: web
13      containerPort: 80
14    volumeMounts:
15    - name: gluster-test
16      mountPath: /usr/share/nginx/html
17  volumes:
18  - name: gluster-test
19    persistentVolumeClaim:
20      claimName: myclaim

(2)、创建 Nginx Pod

1$ kubectl create -f nginx-pod.yaml -n mydlqcloud

(3)、查看创建的 Nginx Pod

1$ kubectl get pod -n mydlqcloud | grep nginx-pod
2
3nginx-pod                1/1     Running   0          92s

5、在 Nginx Pod 创建 HTML

(1)、进入 Nginx Pod

1$ kubectl exec -it nginx-pod /bin/sh -n mydlqcloud

(2)、创建 HTML

1$ cd /usr/share/nginx/html
2$ echo 'Hello World from GlusterFS!!!' > index.html

(3)、退出Nginx Pod

1$ exit

6、检查创建的HTML 文件是否写入 GlusterFS 存储中

(1)、查看 GlusterFS Pod 名称

1$ kubectl get pods -n storage
2
3NAME                     READY   STATUS    RESTARTS   AGE
4glusterfs-lkjwq          1/1     Running   0          16h
5glusterfs-mtlq4          1/1     Running   0          16h
6glusterfs-tb867          1/1     Running   0          16h
7heketi-85dbbbb55-cndgz   1/1     Running   0          15h

(2)、进入任意一个 Pod 容器中

  • 勿忘 -n 来指定 GlusterFS 的 namespace
1$ kubectl exec -ti glusterfs-lkjwq /bin/sh -n storage

(3)、查询 heketi 的挂载

1$ mount | grep heketi
2sh-4.2# mount | grep heketi
3/dev/mapper/centos-root on /var/lib/heketi type xfs (rw,relatime,attr2,inode64,noquota)
4/dev/mapper/vg_d62e08192968971ac7f7edc6eb2f3ae5-brick_61bd5976b4d2880dcd5889b174d5b3c7 on /var/lib/heketi/mounts/vg_d62e08192968971ac7f7edc6eb2f3ae5/brick_61bd5976b4d2880dcd5889b174d5b3c7 type xfs (rw,noatime,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota)
5/dev/mapper/vg_d62e08192968971ac7f7edc6eb2f3ae5-brick_78eb1c74ff7ab78969e116e5389444fd on /var/lib/heketi/mounts/vg_d62e08192968971ac7f7edc6eb2f3ae5/brick_78eb1c74ff7ab78969e116e5389444fd type xfs (rw,noatime,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota)

(4)、查看文件列表

1$ cd /var/lib/heketi/mounts/vg_d62e08192968971ac7f7edc6eb2f3ae5/brick_78eb1c74ff7ab78969e116e5389444fd/brick
2$ ls
3
4index.html

(5)、查看 index.html 内容

1$ cat index.html
2
3Hello World from GlusterFS!!!

七、配置 Heketi Client

在 Kubernetes 集群任意节点安装 Heketi Client 客户端,用于操作 Kubernetes 集群中的 Heketi。

例如这里选择用 k8s-node-2-12 节点进行操作。

1、下载 Heketi Client

1$ wget https://github.com/heketi/heketi/releases/download/v9.0.0/heketi-client-v9.0.0.linux.amd64.tar.gz

2、解压Heketi Client 安装包

1$ tar -xvf heketi-client-v9.0.0.linux.amd64.tar.gz

3、将可 heketi-cli 移动到 bin 文件夹下

1$ mv heketi-client/bin/heketi-cli /usr/local/bin/heketi-cli

4、查看 Kubernetes 集群的 Heketi Service

查看 Heketi Service,记住其集群 IP 和 Port

1$ kubectl get service -n storage
2
3NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
4heketi                     ClusterIP   10.10.249.63    <none>        8080/TCP   15m
5heketi-storage-endpoints   ClusterIP   10.10.211.195   <none>        1/TCP      15m

访问该 Service 地址,查看是否互通

1$ curl http://10.10.249.63:8080/hello
2
3Hello from Heketi

5、测试 heketi-cli 命令

测试 heketi-cli 命令, 其中 “-s” 指的是 Heketi Service 地址,即上面步骤查找到的Heketi Service 的 IP:PORT

1$ heketi-cli -s http://10.10.249.63:8080 cluster list
2
3Clusters:
4Id:b4cdf0d91b77d872238d5674c86e82df [file][block]

6、设置 Heketi Service 环境变量

每次都要输入 -s http://ip:port 比较麻烦,这里设置它的一个变量,指定这个 Hiketi Service 地址,这样不必每次都输入 -s 命令了。

1$ export HEKETI_CLI_SERVER=http://10.10.249.63:8080

7、再次测试 heketi-cli 命令

输入 heteti-cli 命令测试,这次不用指定 -s 到 hekari service 地址,直接执行。

1$ heketi-cli cluster list
2
3Clusters:
4Id:b4cdf0d91b77d872238d5674c86e82df [file][block]

八、GluserFS 集群扩容

在 Kubernetes 环境中通过 Heketi 操作 GlusterFS 集群的管理工作,用其增加、减少存储工作。

1、GlusterFS 集群节点增加设备

GlusterFS 节点新增硬盘设备,可以按以下方式执行。

Kubernetes 的 k8s-node-2-14 节点新增 /dev/sdc 设备,将其加入 GlusterFS 节点

(1)、查看新挂载设备

查看新挂载的设备符,可以看到为 “/dev/sdc”

 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                                                                                 8:16   0   30G  0 disk 
10├─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e_tmeta   253:2    0   12M  0 lvm  
11│ └─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e-tpool 253:4    0    2G  0 lvm  
12│   ├─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e     253:5    0    2G  0 lvm  
13│   └─vg_48e1705a862bccec97ca25de0a5afbc2-brick_5ef2856630417cdf261e348e9e5b692b  253:6    0    2G  0 lvm  
14└─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e_tdata   253:3    0    2G  0 lvm  
15  └─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e-tpool 253:4    0    2G  0 lvm  
16    ├─vg_48e1705a862bccec97ca25de0a5afbc2-tp_66de677e1d6e065dbe6bffd658e84f4e     253:5    0    2G  0 lvm  
17    └─vg_48e1705a862bccec97ca25de0a5afbc2-brick_5ef2856630417cdf261e348e9e5b692b  253:6    0    2G  0 lvm  
18sdc                                                                                 8:32   0   20G  0 disk 
19sr0  

(2)、修改拓扑文件

修改 Heketi 的拓扑文件 topology.json

 1{
 2  "clusters": [
 3    {
 4      "nodes": [
 5        {
 6          "node": {
 7            "hostnames": {
 8              "manage": [
 9                "k8s-node-2-12"
10              ],
11              "storage": [
12                "192.168.2.12"
13              ]
14            },
15            "zone": 1
16          },
17          "devices": [
18            "/dev/sdb"
19          ]
20        },
21        {
22          "node": {
23            "hostnames": {
24              "manage": [
25                "k8s-node-2-13"
26              ],
27              "storage": [
28                "192.168.2.13"
29              ]
30            },
31            "zone": 1
32          },
33          "devices": [
34            "/dev/sdb"
35          ]
36        },
37        {
38          "node": {
39            "hostnames": {
40              "manage": [
41                "k8s-node-2-14"
42              ],
43              "storage": [
44                "192.168.2.14"
45              ]
46            },
47            "zone": 1
48          },
49          "devices": [
50            "/dev/sdb",
51            "/dev/sdc"      #------------新增的硬盘------------
52          ]
53        }
54      ]
55    }
56  ]
57}

(3)、Heketi 重新加载拓扑文件

Heketi 重新载入 topology.json 文件,以执行扩容操作,将新设备加入 GlusterFS 节点中。

1$ heketi-cli topology load --json=./topology.json
2
3	Found node k8s-node-2-12 on cluster b4cdf0d91b77d872238d5674c86e82df
4		Found device /dev/sdb
5	Found node k8s-node-2-13 on cluster b4cdf0d91b77d872238d5674c86e82df
6		Found device /dev/sdb
7	Found node k8s-node-2-14 on cluster b4cdf0d91b77d872238d5674c86e82df
8		Found device /dev/sdb
9		Adding device /dev/sdc ... OK

(4)、查看节点列表

查看 Heketi 管理的 GlusterFS 集群节点列表

1$ heketi-cli node list
2
3Id:5109827180c19506a60cb50303cfdff6	Cluster:b4cdf0d91b77d872238d5674c86e82df
4Id:7a5717ae22ed4b579dec6f0ad70587ff	Cluster:b4cdf0d91b77d872238d5674c86e82df
5Id:b5aef310f1ff6a1815ecb008265b5a56	Cluster:b4cdf0d91b77d872238d5674c86e82df
6Id:e30756768d89302c25f93b58efc1c232	Cluster:b4cdf0d91b77d872238d5674c86e82df

(5)、查看节点信息

查看 Heketi 管理的 GlusterFS 集群某个节点信息,可以看到已经将 /dev/sdc 设备加入到 GlusterFS 节点

 1$ heketi-cli node info e30756768d89302c25f93b58efc1c232
 2
 3Node Id: e30756768d89302c25f93b58efc1c232
 4State: online
 5Cluster Id: b4cdf0d91b77d872238d5674c86e82df
 6Zone: 1
 7Management Hostname: k8s-node-2-14
 8Storage Hostname: 192.168.2.14
 9Devices:
10Id:48e1705a862bccec97ca25de0a5afbc2  Name:/dev/sdb State:online  Size (GiB):29  Used (GiB):2  Free (GiB):27  Bricks:1    
11Id:c7a22cf667a50cd57edf2b06f36afa2e  Name:/dev/sdc State:online  Size (GiB):19  Used (GiB):0  Free (GiB):19  Bricks:0

2、GlusterFS 集群新增节点

GlusterFS 集群新增存储节点,可以按以下方式执行。

比如 Kubernetes 新增 k8s-node-2-15 节点,将其加入 GlusterFS 集群

(1)、Kubernetes 新节点添加 GlusterFS 标签

新增加节点为 “k8s-node-2-15”,节点设置 GlusterFS 标签 storagenode=glusterfs ,这样会自动在该 Kubernetes 节点上启动一个 GlusterFS Pod。

1$ kubectl label node k8s-node-2-15 storagenode=glusterfs
2
3node/k8s-node-2-15 labeled

(2)、修改拓扑文件

修改 Heketi 的拓扑文件 topology.json,将新节点信息加入其中

 1{
 2  "clusters": [
 3    {
 4      "nodes": [
 5        {
 6          "node": {
 7            "hostnames": {
 8              "manage": [
 9                "k8s-node-2-12"
10              ],
11              "storage": [
12                "192.168.2.12"
13              ]
14            },
15            "zone": 1
16          },
17          "devices": [
18            "/dev/sdb"
19          ]
20        },
21        {
22          "node": {
23            "hostnames": {
24              "manage": [
25                "k8s-node-2-13"
26              ],
27              "storage": [
28                "192.168.2.13"
29              ]
30            },
31            "zone": 1
32          },
33          "devices": [
34            "/dev/sdb"
35          ]
36        },
37        {
38          "node": {
39            "hostnames": {
40              "manage": [
41                "k8s-node-2-14"
42              ],
43              "storage": [
44                "192.168.2.14"
45              ]
46            },
47            "zone": 1
48          },
49          "devices": [
50            "/dev/sdb",
51            "/dev/sdc"
52          ]
53        },
54        {
55          "node": {
56            "hostnames": {
57              "manage": [
58                "k8s-node-2-15"         #新kubernetes节点名称
59              ],
60              "storage": [
61                "192.168.2.15"          #新kubernetes节点IP
62              ]
63            },
64            "zone": 1
65          },
66          "devices": [
67            "/dev/sdb"                  #挂载的设备
68          ]
69        }
70      ]
71    }
72  ]
73}

(3)、Heketi 重新加载拓扑文件

Heketi 重新载入 topology.json 文件,以执行扩容操作,将新节点加入 GlusterFS 集群

 1$ heketi-cli topology load --json=./topology.json
 2	
 3	Found node k8s-node-2-12 on cluster b4cdf0d91b77d872238d5674c86e82df
 4		Found device /dev/sdb
 5	Found node k8s-node-2-13 on cluster b4cdf0d91b77d872238d5674c86e82df
 6		Found device /dev/sdb
 7	Found node k8s-node-2-14 on cluster b4cdf0d91b77d872238d5674c86e82df
 8		Found device /dev/sdb
 9		Found device /dev/sdc
10	Creating node k8s-node-2-15 ... ID: 7a5717ae22ed4b579dec6f0ad70587ff
11		Adding device /dev/sdb ... OK

(4)、查看 GlusterFS 节点

1$ heketi-cli node list
2
3Id:5109827180c19506a60cb50303cfdff6	Cluster:b4cdf0d91b77d872238d5674c86e82df
4Id:7a5717ae22ed4b579dec6f0ad70587ff	Cluster:b4cdf0d91b77d872238d5674c86e82df
5Id:b5aef310f1ff6a1815ecb008265b5a56	Cluster:b4cdf0d91b77d872238d5674c86e82df
6Id:e30756768d89302c25f93b58efc1c232	Cluster:b4cdf0d91b77d872238d5674c86e82df

3、GlusterFS 集群节点删除设备

(1)、查看删除前的节点信息

 1$ heketi-cli node info e30756768d89302c25f93b58efc1c232
 2
 3Node Id: e30756768d89302c25f93b58efc1c232
 4State: online
 5Cluster Id: b4cdf0d91b77d872238d5674c86e82df
 6Zone: 1
 7Management Hostname: k8s-node-2-14
 8Storage Hostname: 192.168.2.14
 9Devices:
10Id:48e1705a862bccec97ca25de0a5afbc2   Name:/dev/sdb            State:online    Size (GiB):29      Used (GiB):2       Free (GiB):27      Bricks:1       
11Id:7cf2a1d44bb287e2c864880b82a25bd6   Name:/dev/sdc            State:online    Size (GiB):19      Used (GiB):0       Free (GiB):19      Bricks:0 

(2)、使设备脱机

1$ heketi-cli device disable c7a22cf667a50cd57edf2b06f36afa2e
2
3Device c7a22cf667a50cd57edf2b06f36afa2e is now offline

(3)、将设备从集群移除

1$ heketi-cli device remove c7a22cf667a50cd57edf2b06f36afa2e
2
3Device c7a22cf667a50cd57edf2b06f36afa2e is now removed

(4)、将设备删除

1$ heketi-cli device delete c7a22cf667a50cd57edf2b06f36afa2e
2
3Device c7a22cf667a50cd57edf2b06f36afa2e deleted

(5)、查看删除后的节点信息

 1$ heketi-cli node info e30756768d89302c25f93b58efc1c232
 2
 3Node Id: e30756768d89302c25f93b58efc1c232
 4State: online
 5Cluster Id: b4cdf0d91b77d872238d5674c86e82df
 6Zone: 1
 7Management Hostname: k8s-node-2-14
 8Storage Hostname: 192.168.2.14
 9Devices:
10Id:48e1705a862bccec97ca25de0a5afbc2 Name:/dev/sdb  State:online  Size (GiB):29  Used (GiB):2  Free (GiB):27  Bricks:1

4、GlusterFS 集群删除节点

GlusterFS 集群删除存储节点,可以按以下方式执行。

(1)、查看删除前的节点列表

1$ heketi-cli -s http://10.10.249.63:8080 node list
2
3Id:5109827180c19506a60cb50303cfdff6	Cluster:b4cdf0d91b77d872238d5674c86e82df
4Id:7a5717ae22ed4b579dec6f0ad70587ff	Cluster:b4cdf0d91b77d872238d5674c86e82df
5Id:b5aef310f1ff6a1815ecb008265b5a56	Cluster:b4cdf0d91b77d872238d5674c86e82df
6Id:e30756768d89302c25f93b58efc1c232	Cluster:b4cdf0d91b77d872238d5674c86e82df

(2)、查看节点信息

 1$ heketi-cli -s http://10.10.249.63:8080 node info 7a5717ae22ed4b579dec6f0ad70587ff
 2
 3Node Id: 7a5717ae22ed4b579dec6f0ad70587ff
 4State: online
 5Cluster Id: b4cdf0d91b77d872238d5674c86e82df
 6Zone: 1
 7Management Hostname: k8s-node-2-15
 8Storage Hostname: 192.168.2.15
 9Devices:
10Id:d8d252c60c10763d8797f4dcb16c4f25   Name:/dev/sdb            State:online    Size (GiB):29      Used (GiB):0       Free (GiB):29      Bricks:0  

(3)、使节点脱机

1$ heketi-cli -s http://10.10.249.63:8080 node disable 7a5717ae22ed4b579dec6f0ad70587ff
2
3Node 7a5717ae22ed4b579dec6f0ad70587ff is now offline

(4)、将节点从集群移除

1$ heketi-cli -s http://10.10.249.63:8080 node remove 7a5717ae22ed4b579dec6f0ad70587ff
2
3Node 7a5717ae22ed4b579dec6f0ad70587ff is now removed

(5)、删除节点的设备

1$ heketi-cli -s http://10.10.249.63:8080 device delete d8d252c60c10763d8797f4dcb16c4f25
2
3Device d8d252c60c10763d8797f4dcb16c4f25 deleted

(6)、删除节点

1$ heketi-cli -s http://10.10.249.63:8080 node delete 7a5717ae22ed4b579dec6f0ad70587ff
2
3Node 7a5717ae22ed4b579dec6f0ad70587ff deleted

(7)、查看 GlusterFS Pod 数量

1$ kubectl get daemonset -n storage
2
3NAME       DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR           AGE
4glusterfs  4        4        4      46库,           4          storagenode=glusterfs   11h

(8)、将标签 storagenode=glusterfs 从 Kubernetes 节点移除

标签 storagenode=glusterfs 从 k8s-node-2-15 节点移除

1$ kubectl label node k8s-node-2-15 storagenode-
2
3node/k8s-node-2-15 labeled

查看 GlusterFS Pod 数量已经减少1

1$ kubectl get daemonset -n storage
2
3NAME       DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR           AGE
4glusterfs  3        3        3      3           3          storagenode=glusterfs   11h

九、Heketi 命令简介

 1#----------------------Cluster命令----------------------
 2## (1)、查看GlusterFS集群列表
 3$ heketi-cli cluster list
 4
 5## (2)、查看GlusterFS集群信息
 6$ heketi-cli cluster info da2f4e8619698c655de0c28312fb7ec8
 7
 8## (3)、查看GlusterFS节点信息
 9$ heketi-cli node info 2c55d2da091bcb7c40b6400557e41ba6
10
11#----------------------Volume命令----------------------
12## (1)、创建一个 volume(大小1GB,默认3副本)
13$ heketi-cli volume create --size=1
14
15## (2)、查看卷信息列表
16$ heketi-cli volume list
17
18#----------------------Heketi-cli 其它命令----------------------
19#heketi支持如下命令
20heketi-cli -h
21  blockvolume                    Heketi Volume Management
22  cluster                        Heketi cluster management
23  db                             Heketi Database Management
24  device                         Heketi device management
25  help                           Help about any command
26  loglevel                       Heketi Log Level
27  node                           Heketi Node Management
28  setup-openshift-heketi-storage Setup OpenShift/Kubernetes persistent storage for Heketi
29  topology                       Heketi Topology Management
30  volume                         Heketi Volume Management
31#集群相关命令
32heketi-clicluster -h
33  create      Create a cluster
34  delete      Delete the cluster
35  info        Retrieves information about cluster
36  list        Lists the clusters managed by Heketi
37  setflags    Set flags on a cluster
38#节点相关命令
39heketi-cli node -h
40  add         Add new node to be managed by Heketi
41  delete      Deletes a node from Heketi management
42  disable     Disallow usage of a node by placing it offline
43  enable      Allows node to go online
44  info        Retrieves information about the node
45  list        List all nodes in cluster
46  remove      Removes a node and all its associated devices from Heketi
47  rmtags      Removes tags from a node
48  settags     Sets tags on a node
49#卷相关命令
50heketi-cli volume -h
51  clone       Creates a clone
52  create      Create a GlusterFS volume
53  delete      Deletes the volume
54  expand      Expand a volume
55  info        Retrieves information about the volume
56  list        Lists the volumes managed by Heketi
57其他的命令可以通过<-h>查看详细使用方式

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