部署Glusterfs

GlusterFS部署

Heketi要求在每个glusterfs节点上配备裸磁盘,因为Heketi要用来创建PV和VG,如果有了Heketi,则可以通过StorageClass来创建PV,步骤仅有:创建StorageClass-->创建PVC-->Pod挂载PVC。

本文的操作步骤依据heketi的github网址官方文档

本实例用到的所有文件都位于extras/kubernetes,在下载的heketi客户端工具包中也有示例文件。

Heketi提供了一个CLI,方便用户在Kubernetes中管理和配置GlusterFS,在客户端机器上下载heketi客户端工具到合适的位置,版本必须与heketi server的版本一致。

部署参考:kubernetes中部署Heketi和GlusterFS(一) kubernetes中部署Heketi和GlusterFS(二)

https://www.kubernetes.org.cn/3893.html

1、环境说明

本文的环境是在三个Kubernetes Node上部署三个GluserFS节点。

服务器 主机名称 IP Storage IP 磁盘 角色
Node1 ubuntu15 10.30.1.15 10.30.1.15 /dev/sdb K8s Node+GlusterFS Node
Node2 ubuntu16 10.30.1.16 10.30.1.16 /dev/sdb K8s Node+GlusterFS Node
Node3 ubuntu17 10.30.1.17 10.30.1.17 /dev/sdb K8s Node+GlusterFS Node

注意:
Heketi要至少需要三个GlusterFS节点。
加载内核模块:每个kubernetes集群的节点运行

modprobe dm_thin_pool

yum -y install glusterfs-fuse

2、部署glusterfs

glusterfs以DaemonSet方式部署,几乎不用做修改 glusterfs-deamonset

#1.首先在node上打标签
kubectl label node 10.30.1.15 storagenode=glusterfs
kubectl label node 10.30.1.16 storagenode=glusterfs
kubectl label node 10.30.1.17 storagenode=glusterfs
# 查看标签
kubectl get node --show-labels

#2.部署glusterfs
kubectl create ns glusterfs
kubectl create -f glusterfs-daemonset.json -n glusterfs
kubectl get pod -n glusterfs
#NAME                             READY     STATUS    RESTARTS   AGE
glusterfs-94g22                  1/1       Running   0          2m
glusterfs-bc8tb                  1/1       Running   0          2m
glusterfs-n22c8                  1/1       Running   0          2m

3、部署heketi服务端

heketi-service-account.json

heketi.json

topology-sample.json

kubectl create -f heketi-service-account.json -n glusterfs#创建对应的服务帐户
kubectl get sa -n glusterfs  # 查看

# 为服务帐户创建集群角色绑定,指定集群空间 glusterfs
kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=edit --serviceaccount=glusterfs:heketi-service-account
kubectl get clusterrolebindings

kubectl create secret generic heketi-config-secret --from-file=./heketi.json -n glusterfs	#创建secret来保存Heketi服务的配置

kubectl create -f heketi-bootstrap.json -n glusterfs #部署heketi

kubectl get pod -n glusterfs	#查看pod
#NAME                             READY     STATUS    RESTARTS   AGE
deploy-heketi-8465f8ff78-sb8z   1/1       Running   0          3m
glusterfs-94g22                  1/1       Running   0          28m
glusterfs-bc8tb                  1/1       Running   0          28m
glusterfs-n22c8                  1/1       Running   0          28m

kubectl get svc -n glusterfs	#查看端口
#NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
heketi                       NodePort    10.254.204.65    <none>        8080:31005/TCP   4m

curl http://10.254.204.65:8080/hello    #测试Heketi服务端
curl http://10.30.1.15:31005/hello
# 返回:Hello from heketi 表示正常

export HEKETI_CLI_SERVER=http://10.30.1.15:31005  #heketi的node IP和nodeport

##下载heketi-cli程序包,放在/usr/bin/ 目录下

#mkfs.xfs -f /dev/vdc 格式化硬盘
#pvcreate /dev/vdc 擦除xfs签名 输入Y

heketi-cli topology load --json=topology-sample.json	#加载拓扑

   Creating cluster ... ID: 224a5a6555fa5c0c930691111c63e863
     Allowing file volumes on cluster.
     Allowing block volumes on cluster.
     Creating node 10.30.1.15 ... ID: 7946b917b91a579c619ba51d9129aeb0
            Adding device /dev/sdb ... OK
     Creating node 10.30.1.16 ... ID: 5d10e593e89c7c61f8712964387f959c
            Adding device /dev/sdb ... OK
     Creating node 10.30.1.17 ... ID: de620cb2c313a5461d5e0a6ae234c553
            Adding device /dev/sdb ... OK
            
heketi-cli topology info	#查看拓扑结构

kubectl exec -it glusterfs-n22c8 -n glusterfs bash	#进入glusterfs容器
## 执行命令 gluster peer status 可以看到其他2台机器已经加入信任池

4、创建StorageClass

cat <<EOF>> gluster-storage-class.yaml 	
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gluster-heketi                        #-------------存储类的名字
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.254.238.186:8080"      #-------------heketi service的cluster ip 和端口
  restuser: "admin"                           #-------------heketi的认证用户,这里随便填,因为没有启用鉴权模式 
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:3"                 #-------------申请的默认为3副本模式,因为目前有三个gluster节点。
EOF

## 配置pvc文件

cat << EOF >> gluster-pvc.yaml 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: gluster1
      annotations:
        volume.beta.kubernetes.io/storage-class: gluster-heketi
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
EOF

kubectl create -f gluster-storage-class.yaml	#创建StorageClass
kubectl create -f gluster-pvc.yaml -n glusterfs	#创建pvc
kubectl get StorageClass		#查看StorageClass
kubectl get pvc -n glusterfs	#查看pvc

vgs		#查看vg信息
lvs		#查看lv信息
pvs		#查看pv信息

5、持久化heketi.db数据

heketi-cli setup-openshift-heketi-storage	#生成heketi-storage.json文件

### 如果运行报“无空间”错误
#1.停止正在运行的heketi pod:	kubectl scale deployment deploy-heketi --replicas=0
#2.手动删除存储块设备中的任何签名:加载拓扑的操作是在gluster 中添加了Peer,所以需要手动detach peer
#### 2.1 进入某个glusterfs的pod 。执行
####### gluster peer detach 10.30.1.15 && gluster peer detach 10.30.1.16 && gluster peer detach 10.30.1.17
#### 2.2 mkfs.xfs -f /dev/xvdf 格式化硬盘 
#### 2.3 pvcreate /dev/xvdf 
#3.然后继续运行heketi pod:kubectl scale deployment deploy-heketi --replicas=1。
#4.用匹配版本的heketi-cli重新加载拓扑 heketi-cli topology load --json=topology-sample.json 然后重试该步骤。

kubectl create -f heketi-storage.json -n glusterfs	#创建heketi-storage

kubectl get job -n glusterfs	#查看job  执行完后就可以删除它
NAME                      DESIRED   SUCCESSFUL   AGE
heketi-storage-copy-job   1         1            1m

kubectl delete all,service,jobs,deployment,secret --selector="deploy-heketi" -n glusterfs	#删除之前创建的heketi

kubectl create -f heketi-deployment.json -n glusterfs	#使用heketi-deployment.json 重新创建

kubectl get deploy,svc,pod -n glusterfs

##验证heketi是否在用在用gluster volume
kubectl exec heketi-7898db85dd-nb6kn -it bash 

mount |grep heketi	#执行该命令
10.30.1.15:heketidbstorage on /var/lib/heketi type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

6、验证

kubectl get pv

kubectl get pvc -n glusterfs

# 启动nginx 挂载pvc
cat <<EOF>> heketi-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: gluster-vol1
      mountPath: /usr/share/nginx/html
  volumes:
  - name: gluster-vol1
    persistentVolumeClaim:
      claimName: glusterfs   #上面创建的pvc
EOF

kubectl create -f nginx-pod.yaml	#启动pod

Glusterfs常用命令

#1.启动/关闭/查看glusterd服务
/etc/init.d/glusterd start
/etc/init.d/glusterd stop
/etc/init.d/glusterd status

#2.添加存储节点和移除存储节点
gluster peer probe <server> # 添加节点
gluster peer detach server3 # 从存储池移除服务器,假设要把server3从存储池里删除

#3.查看所有节点基本状态
gluster peer status  # 查看存储池状态

gluster volume info # 查看逻辑卷信息
gluster volume info rep-volume #例如要查看某个逻辑卷状态
gluster volume list #列出集群中所有卷
gluster volume status # 查看集群中卷状态


gluster volume create   #创建
gluster volume start rep-volume #要启动rep-volume
gluster volume stop rep-volume #停止GlusterFS逻辑卷
gluster volume delete rep-volume #删除GlusterFS逻辑卷

gluster volume set #配置卷

gluster volume add-brick #扩展卷

heketi常用  集群列表
heketi-cli --server http://localhost:8088  cluster list
#集群详细信息
heketi-cli --server http://localhost:8088  cluster info <cluster ID>
#节点信息
heketi-cli --server http://localhost:8088  node info <node ID>
#卷信息
heketi-cli --server http://localhost:8088 volume list

glusterfs故障

一台主机故障

一台节点故障的情况包含以下情况:

  • 物理故障
  • 同时有多块硬盘故障,造成数据丢失
  • 系统损坏不可修复

解决方法:

找一台完全一样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机同样的 IP,安装 gluster 软件,
保证配置一样,在其他健康节点上执行命令 gluster peer status,查看故障服务器的 uuid

[root@mystorage2 ~]# gluster peer status
Number of Peers: 3

Hostname: mystorage3
Uuid: 36e4c45c-466f-47b0-b829-dcd4a69ca2e7
State: Peer in Cluster (Connected)

Hostname: mystorage4
Uuid: c607f6c2-bdcb-4768-bc82-4bc2243b1b7a
State: Peer in Cluster (Connected)

Hostname: mystorage1
Uuid: 6e6a84af-ac7a-44eb-85c9-50f1f46acef1
State: Peer in Cluster (Disconnected)

修改新加机器的 /var/lib/glusterd/glusterd.info 和 故障机器一样

[root@mystorage1 ~]# cat /var/lib/glusterd/glusterd.info
UUID=6e6a84af-ac7a-44eb-85c9-50f1f46acef1
operating-version=30712

在信任存储池中任意节点执行

# gluster volume heal gv2 full

就会自动开始同步,但在同步的时候会影响整个系统的性能。

可以查看状态

# gluster volume heal gv2 info

Heketi

https://github.com/heketi/heketi/blob/master/docs/api/api.md

原文地址:https://www.cnblogs.com/fan-gx/p/14297393.html