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>查看详细使用方式
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。