zoukankan      html  css  js  c++  java
  • 部署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

  • 相关阅读:
    【梦话区】一直迷茫的net小伙
    【ASP.NET】登陆成功后如何跳转到上一个页面
    【C#】强类型DataSet实现登录次数限制
    【ASP.NET】ItemDataBound之repeater 和 listview
    【网页设计】框架的高度随框架里面的内容的多少而改变——转
    【连载】Scala程序设计:Java虚拟机多核编程实战——简介
    博客园图灵杯第五届博问大赛(2010.8.3~2010.9.2)
    【连载】高效人士的116个IT秘诀(第2版)——秘诀23早晨就来一次突破
    图灵2010.08书讯
    图灵五周年生日聚会圆满成功,多家媒体对此进行报道
  • 原文地址:https://www.cnblogs.com/fan-gx/p/14297393.html
Copyright © 2011-2022 走看看