部署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服务端
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