• Kubernetes——安装GlusterFS分布式文件系统


    k8s 安装 GlusterFS 分布式文件系统

      本节动态存储主要介绍GFS的使用。

    一、准备工作

      为了保证 Pod 能够正常使用 GFS 作为后端存储,需要每台运行 Pod 的节点上提前安装 GFS 的客户端工具。

      所有节点安装 GFS 客户端:

    [root@k8s-master01 ~]#yum install glusterfs glusterfs-fuse -y
    Loaded plugins: fastestmirror
    Determining fastest mirrors
     * base: mirrors.aliyun.com
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    aliyun-docker-ce                                                                              | 3.5 kB  00:00:00     
    base                                                                                          | 3.6 kB  00:00:00     
    epel                                                                                          | 4.7 kB  00:00:00     
    extras                                                                                        | 2.9 kB  00:00:00     
    updates                                                                                       | 2.9 kB  00:00:00     
    (1/2): epel/x86_64/updateinfo                                                                 | 1.0 MB  00:00:05     
    (2/2): epel/x86_64/primary_db                                                                 | 6.9 MB  00:00:25     
    Resolving Dependencies
    --> Running transaction check
    ---> Package glusterfs.x86_64 0:6.0-49.1.el7 will be installed
    --> Processing Dependency: glusterfs-libs(x86-64) = 6.0-49.1.el7 for package: glusterfs-6.0-49.1.el7.x86_64
    --> Processing Dependency: libglusterfs.so.0()(64bit) for package: glusterfs-6.0-49.1.el7.x86_64
    --> Processing Dependency: libgfxdr.so.0()(64bit) for package: glusterfs-6.0-49.1.el7.x86_64
    --> Processing Dependency: libgfrpc.so.0()(64bit) for package: glusterfs-6.0-49.1.el7.x86_64
    ---> Package glusterfs-fuse.x86_64 0:6.0-49.1.el7 will be installed
    --> Processing Dependency: glusterfs-client-xlators(x86-64) = 6.0-49.1.el7 for package: glusterfs-fuse-6.0-49.1.el7.x86_64
    --> Processing Dependency: attr for package: glusterfs-fuse-6.0-49.1.el7.x86_64
    --> Running transaction check
    ---> Package attr.x86_64 0:2.4.46-13.el7 will be installed
    ---> Package glusterfs-client-xlators.x86_64 0:6.0-49.1.el7 will be installed
    ---> Package glusterfs-libs.x86_64 0:6.0-49.1.el7 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    =====================================================================================================================
     Package                                Arch                 Version                     Repository             Size
    =====================================================================================================================
    Installing:
     glusterfs                              x86_64               6.0-49.1.el7                updates               622 k
     glusterfs-fuse                         x86_64               6.0-49.1.el7                updates               130 k
    Installing for dependencies:
     attr                                   x86_64               2.4.46-13.el7               base                   66 k
     glusterfs-client-xlators               x86_64               6.0-49.1.el7                updates               839 k
     glusterfs-libs                         x86_64               6.0-49.1.el7                updates               398 k
    
    Transaction Summary
    =====================================================================================================================
    Install  2 Packages (+3 Dependent packages)
    
    Total download size: 2.0 M
    Installed size: 9.0 M
    Downloading packages:
    (1/5): attr-2.4.46-13.el7.x86_64.rpm                                                          |  66 kB  00:00:00     
    (2/5): glusterfs-client-xlators-6.0-49.1.el7.x86_64.rpm                                       | 839 kB  00:00:02     
    (3/5): glusterfs-fuse-6.0-49.1.el7.x86_64.rpm                                                 | 130 kB  00:00:00     
    (4/5): glusterfs-6.0-49.1.el7.x86_64.rpm                                                      | 622 kB  00:00:03     
    (5/5): glusterfs-libs-6.0-49.1.el7.x86_64.rpm                                                 | 398 kB  00:00:01     
    ---------------------------------------------------------------------------------------------------------------------
    Total                                                                                435 kB/s | 2.0 MB  00:00:04     
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : glusterfs-libs-6.0-49.1.el7.x86_64                                                                1/5 
      Installing : glusterfs-6.0-49.1.el7.x86_64                                                                     2/5 
      Installing : glusterfs-client-xlators-6.0-49.1.el7.x86_64                                                      3/5 
      Installing : attr-2.4.46-13.el7.x86_64                                                                         4/5 
      Installing : glusterfs-fuse-6.0-49.1.el7.x86_64                                                                5/5 
      Verifying  : attr-2.4.46-13.el7.x86_64                                                                         1/5 
      Verifying  : glusterfs-fuse-6.0-49.1.el7.x86_64                                                                2/5 
      Verifying  : glusterfs-6.0-49.1.el7.x86_64                                                                     3/5 
      Verifying  : glusterfs-client-xlators-6.0-49.1.el7.x86_64                                                      4/5 
      Verifying  : glusterfs-libs-6.0-49.1.el7.x86_64                                                                5/5 
    
    Installed:
      glusterfs.x86_64 0:6.0-49.1.el7                        glusterfs-fuse.x86_64 0:6.0-49.1.el7                       
    
    Dependency Installed:
      attr.x86_64 0:2.4.46-13.el7  glusterfs-client-xlators.x86_64 0:6.0-49.1.el7  glusterfs-libs.x86_64 0:6.0-49.1.el7 
    
    Complete!
    [root@k8s-master01 ~]#
    yum install glusterfs glusterfs-fuse -y

      给需要作为 GFS 节点提供存储的节点打上标签:

    [root@k8s-master01 ~]#kubectl label node k8s-master01 storagenode=glusterfs
    node/k8s-master01 labeled
    [root@k8s-master01 ~]#kubectl get nodes --show-labels
    NAME           STATUS   ROLES    AGE   VERSION   LABELS
    k8s-master01   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=,storagenode=glusterfs
    k8s-master02   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master02,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=
    k8s-master03   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master03,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=
    [root@k8s-master01 ~]#kubectl label node k8s-master02 storagenode=glusterfs
    node/k8s-master02 labeled
    [root@k8s-master01 ~]#kubectl label node k8s-master03 storagenode=glusterfs
    node/k8s-master03 labeled
    [root@k8s-master01 ~]#kubectl get nodes --show-labels
    NAME           STATUS   ROLES    AGE   VERSION   LABELS
    k8s-master01   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=,storagenode=glusterfs
    k8s-master02   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master02,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=,storagenode=glusterfs
    k8s-master03   Ready    matser   18d   v1.20.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master03,kubernetes.io/os=linux,node-role.kubernetes.io/matser=,node.kubernetes.io/node=,storagenode=glusterfs
    [root@k8s-master01 ~]#

      所有节点加载对应模块:

    [root@k8s-master01 ~]# modprobe dm_snapshot
    [root@k8s-master01 ~]# modprobe dm_mirror
    [root@k8s-master01 ~]# modprobe dm_thin_pool
    cat >/etc/sysconfig/modules/glusterfs.modules <<EOF #!/bin/bash for kernel_module in dm_snapshot dm_mirror dm_thin_pool;do /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 if [ $? -eq 0 ]; then /sbin/modprobe ${kernel_module} fi done; EOF
    [root@kube
    -node1 ~]# chmod +x /etc/sysconfig/modules/glusterfs.modules

      检查 modprobe 是否加载成功

    [root@k8s-master01 ~]#lsmod | egrep  '(dm_snapshot|dm_mirror|dm_thin_pool)'
    dm_thin_pool           69632  0 
    dm_persistent_data     73728  1 dm_thin_pool
    dm_bio_prison          20480  1 dm_thin_pool
    dm_snapshot            40960  0 
    dm_bufio               28672  2 dm_persistent_data,dm_snapshot
    dm_mirror              24576  0 
    dm_region_hash         20480  1 dm_mirror
    dm_log                 20480  2 dm_region_hash,dm_mirror
    dm_mod                126976  13 dm_thin_pool,dm_log,dm_snapshot,dm_mirror,dm_bufio

    二、部署GlusterFS

      这里采用容器化方式部署 GFS 集群,也可以使用传统方式部署。生产环境下建议使用独立于 kubernetes 集群之外进行部署,之后建立对应的 EndPoints 资源即可。

      本次部署采用 DaemonSet 方式,同时保证已经打上标签的节点上运行了一个 GFS 服务,并且均有提供存储的磁盘。

    Heketi provides a RESTful management interface which can be used to manage the life cycle of GlusterFS volumes. With Heketi, cloud services like OpenStack Manila, Kubernetes, and OpenShift can dynamically provision GlusterFS volumes with any of the supported durability types. Heketi will automatically determine the location for bricks across the cluster, making sure to place bricks and its replicas across different failure domains. Heketi also supports any number of GlusterFS clusters, allowing cloud services to provide network file storage without being limited to a single GlusterFS cluster.

    [root@k8s-master01 GFS]#wget https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-client-v7.0.0.linux.amd64.tar.gz
    --2021-06-29 16:45:53--  https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-client-v7.0.0.linux.amd64.tar.gz
    Resolving github.com (github.com)... 13.250.177.223
    Connecting to github.com (github.com)|13.250.177.223|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: https://github-releases.githubusercontent.com/37446835/88bdaaa2-68bf-11e8-8915-37b7ef02cfc9?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210629%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210629T084555Z&X-Amz-Expires=300&X-Amz-Signature=30369a37c801c4e5d2ee74e8eff1cf4e80b710ecb7f7236549830233f0b438a4&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=37446835&response-content-disposition=attachment%3B%20filename%3Dheketi-client-v7.0.0.linux.amd64.tar.gz&response-content-type=application%2Foctet-stream [following]
    --2021-06-29 16:45:54--  https://github-releases.githubusercontent.com/37446835/88bdaaa2-68bf-11e8-8915-37b7ef02cfc9?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210629%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210629T084555Z&X-Amz-Expires=300&X-Amz-Signature=30369a37c801c4e5d2ee74e8eff1cf4e80b710ecb7f7236549830233f0b438a4&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=37446835&response-content-disposition=attachment%3B%20filename%3Dheketi-client-v7.0.0.linux.amd64.tar.gz&response-content-type=application%2Foctet-stream
    Resolving github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.110.154, 185.199.108.154, 185.199.111.154, ...
    Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.110.154|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 10520043 (10M) [application/octet-stream]
    Saving to: ‘heketi-client-v7.0.0.linux.amd64.tar.gz.1100%[===========================================================================>] 10,520,043  3.13MB/s   in 3.6s   
    
    2021-06-29 16:45:59 (2.79 MB/s) - ‘heketi-client-v7.0.0.linux.amd64.tar.gz.1’ saved [10520043/10520043]
    
    [root@k8s-master01 GFS]#
    wget https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-client-v7.0.0.linux.amd64.tar.gz

    解压 heketi-client-v7.0.0.linux.amd64.tar.gz:

    [root@k8s-master01 GFS]#tar -xf heketi-client-v7.0.0.linux.amd64.tar.gz
    [root@k8s-master01 GFS]#cd heketi-client/share/heketi/kubernetes/
    [root@k8s-master01 kubernetes]#ll
    total 40
    -rw-rw-r-- 1 1000 1000 5222 Jun 5 2018 glusterfs-daemonset.json
    -rw-rw-r-- 1 1000 1000 3513 Jun 5 2018 heketi-bootstrap.json
    -rw-rw-r-- 1 1000 1000 4113 Jun 5 2018 heketi-deployment.json
    -rw-rw-r-- 1 1000 1000 1109 Jun 5 2018 heketi.json
    -rw-rw-r-- 1 1000 1000 111 Jun 5 2018 heketi-service-account.json
    -rwxrwxr-x 1 1000 1000 584 Jun 5 2018 heketi-start.sh
    -rw-rw-r-- 1 1000 1000 977 Jun 5 2018 README.md
    -rw-rw-r-- 1 1000 1000 1827 Jun 5 2018 topology-sample.json
    [root@k8s-master01 kubernetes]#

      创建集群:

    [root@k8s-master01 kubernetes]#kubectl apply -f glusterfs-daemonset.json 

      遇到的报错后将 glusterfs-daemonset.json 在线工具转成 glusterfs-daemonset.yaml,修改一些报错后,最终如下

    kind: DaemonSet
    apiVersion: apps/v1
    metadata:
      name: glusterfs
      labels:
        glusterfs: deployment
      annotations:
        description: GlusterFS Daemon Set
        tags: glusterfs
    spec:
      selector:
        matchLabels:
          glusterfs-node: daemonset
      template:
        metadata:
          name: glusterfs
          labels:
            glusterfs-node: daemonset
        spec:
          nodeSelector:
            storagenode: glusterfs
          hostNetwork: true
          containers:
            - image: 'gluster/gluster-centos:latest'
              imagePullPolicy: IfNotPresent
              name: glusterfs
              volumeMounts:
                - name: glusterfs-heketi
                  mountPath: /var/lib/heketi
                - name: glusterfs-run
                  mountPath: /run
                - name: glusterfs-lvm
                  mountPath: /run/lvm
                - name: glusterfs-etc
                  mountPath: /etc/glusterfs
                - name: glusterfs-logs
                  mountPath: /var/log/glusterfs
                - name: glusterfs-config
                  mountPath: /var/lib/glusterd
                - name: glusterfs-dev
                  mountPath: /dev
                - name: glusterfs-cgroup
                  mountPath: /sys/fs/cgroup
              securityContext:
                capabilities: {}
                privileged: true
              readinessProbe:
                timeoutSeconds: 3
                initialDelaySeconds: 60
                exec:
                  command:
                    - /bin/bash
                    - '-c'
                    - systemctl status glusterd.service
              livenessProbe:
                timeoutSeconds: 3
                initialDelaySeconds: 60
                exec:
                  command:
                    - /bin/bash
                    - '-c'
                    - systemctl status glusterd.service
          volumes:
            - name: glusterfs-heketi
              hostPath:
                path: /var/lib/heketi
            - name: glusterfs-run
            - name: glusterfs-lvm
              hostPath:
                path: /run/lvm
            - name: glusterfs-etc
              hostPath:
                path: /etc/glusterfs
            - name: glusterfs-logs
              hostPath:
                path: /var/log/glusterfs
            - name: glusterfs-config
              hostPath:
                path: /var/lib/glusterd
            - name: glusterfs-dev
              hostPath:
                path: /dev
            - name: glusterfs-cgroup
              hostPath:
                path: /sys/fs/cgroup
    glusterfs-daemonset.yaml

      再次创建集群:

    [root@k8s-master01 kubernetes]#kubectl apply -f glusterfs-daemonset.json 
    daemonset.apps/glusterfs configured
    
    [root@k8s-master01 kubernetes]#kubectl get daemonset --all-namespaces
    NAMESPACE     NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    devops        glusterfs     3         3         3       3            3           storagenode=glusterfs    4h54m
    kube-system   calico-node   3         3         3       3            3           kubernetes.io/os=linux   19d

      注意1:此处采用的是默认的挂载方式,可使用其他磁盘作为 GFS 的工作目录。

      注意2:此处创建的 Namespace 为 devops,如果你们创建的话,默认的 Namespace 是default,我的修改过,你们可按需修改。

      注意3:可使用 gluster/gluster-centos:gluster4u0_centos7 镜像。

    三、部署Heketi服务

      Heketi 是一个提供 RESTful API 管理 GFS 卷的框架,能够在 kubernetes、Openshift、OpenStack 等云平台上实现动态存储资源供应,支持 GFS 多集群管理,便于管理员对 GFS 进行操作,在 Kubernetes 集群中,Pod 将存储的请求发送至 Heketi,然后 Heketi 控制 GFS 集群创建对应的存储卷。

      查看 Heketi 的 ServiceAccount 对象:

    [root@k8s-master01 kubernetes]#cat heketi-service-account.json 
    {
      "apiVersion": "v1",
      "kind": "ServiceAccount",
      "metadata": {
        "name": "heketi-service-account"
      }
    }

      创建 Heketi 的 ServiceAccount 对象:

    [root@k8s-master01 kubernetes]#kubectl apply -f heketi-service-account.json 
    serviceaccount/heketi-service-account created
    [root@k8s-master01 kubernetes]#kubectl get sa
    NAME                     SECRETS   AGE
    default                  1         14d
    heketi-service-account   1         2s
    jenkins                  1         14d
    [root@k8s-master01 kubernetes]#

      创建 Heketi 对应的权限和 Secret:

    [root@k8s-master01 kubernetes]#kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=edit --serviceaccount=devops:heketi-service-account
    clusterrolebinding.rbac.authorization.k8s.io/heketi-gluster-admin created
    [root@k8s-master01 kubernetes]#
    [root@k8s-master01 kubernetes]#kubectl create secret generic heketi-config-secret --from-file=./heketi.json 
    secret/heketi-config-secret created

      在线工具转换:

    kind: List
    apiVersion: v1
    items:
      - kind: Service
        apiVersion: v1
        metadata:
          name: deploy-heketi
          labels:
            glusterfs: heketi-service
            deploy-heketi: support
          annotations:
            description: Exposes Heketi Service
        spec:
          selector:
            name: deploy-heketi
          ports:
            - name: deploy-heketi
              port: 8080
              targetPort: 8080
      - kind: Deployment
        apiVersion: apps/v1
        metadata:
          name: deploy-heketi
          labels:
            glusterfs: heketi-deployment
            deploy-heketi: deployment
          annotations:
            description: Defines how to deploy Heketi
        spec:
          replicas: 1
          selector:
            matchLabels:
              glusterfs: heketi-pod
              deploy-heketi: pod
          template:
            metadata:
              name: deploy-heketi
              labels:
                name: deploy-heketi
                glusterfs: heketi-pod
                deploy-heketi: pod
            spec:
              serviceAccountName: heketi-service-account
              containers:
                - image: 'heketi/heketi:dev'
                  imagePullPolicy: Always
                  name: deploy-heketi
                  env:
                    - name: HEKETI_EXECUTOR
                      value: kubernetes
                    - name: HEKETI_DB_PATH
                      value: /var/lib/heketi/heketi.db
                    - name: HEKETI_FSTAB
                      value: /var/lib/heketi/fstab
                    - name: HEKETI_SNAPSHOT_LIMIT
                      value: '14'
                    - name: HEKETI_KUBE_GLUSTER_DAEMONSET
                      value: 'y'
                  ports:
                    - containerPort: 8080
                  volumeMounts:
                    - name: db
                      mountPath: /var/lib/heketi
                    - name: config
                      mountPath: /etc/heketi
                  readinessProbe:
                    timeoutSeconds: 3
                    initialDelaySeconds: 3
                    httpGet:
                      path: /hello
                      port: 8080
                  livenessProbe:
                    timeoutSeconds: 3
                    initialDelaySeconds: 30
                    httpGet:
                      path: /hello
                      port: 8080
              volumes:
                - name: db
                - name: config
                  secret:
                    secretName: heketi-config-secret
    heketi-bootstrap.yaml

      查看当前svc,deploy资源:

    [root@k8s-master01 kubernetes]#kubectl get svc
    NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
    jenkins     NodePort   10.111.57.164   <none>        80:32433/TCP,50000:30752/TCP   12d
    postgres    NodePort   10.99.208.124   <none>        5432:31692/TCP                 6d1h
    sonarqube   NodePort   10.102.29.13    <none>        9000:30003/TCP                 4d23h
    [root@k8s-master01 kubernetes]#kubectl get pods
    NAME                        READY   STATUS    RESTARTS   AGE
    glusterfs-2l5jf             1/1     Running   0          38m
    glusterfs-4l88m             1/1     Running   0          38m
    glusterfs-6fswc             1/1     Running   0          37m
    jenkins-0                   1/1     Running   6          8d
    postgres-57f59c66fd-bfg7n   1/1     Running   4          5d23h
    sonarqube-649955d9b-7hgnz   1/1     Running   3          4d23h
    [root@k8s-master01 kubernetes]#

      再初始化部署 Heketi:

    [root@k8s-master01 kubernetes]#kubectl create -f heketi-bootstrap.yaml 
    service/deploy-heketi created
    deployment.apps/deploy-heketi created
    [root@k8s-master01 kubernetes]#kubectl get svc
    NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
    deploy-heketi   ClusterIP   10.102.18.156   <none>        8080/TCP                       4s
    jenkins         NodePort    10.111.57.164   <none>        80:32433/TCP,50000:30752/TCP   12d
    postgres        NodePort    10.99.208.124   <none>        5432:31692/TCP                 6d1h
    sonarqube       NodePort    10.102.29.13    <none>        9000:30003/TCP                 4d23h
    [root@k8s-master01 kubernetes]#kubectl get pods
    NAME                             READY   STATUS              RESTARTS   AGE
    deploy-heketi-6565469fdf-wcnjc   0/1     ContainerCreating   0          6s
    glusterfs-2l5jf                  1/1     Running             0          42m
    glusterfs-4l88m                  1/1     Running             0          42m
    glusterfs-6fswc                  1/1     Running             0          42m
    jenkins-0                        1/1     Running             6          8d
    postgres-57f59c66fd-bfg7n        1/1     Running             4          5d23h
    sonarqube-649955d9b-7hgnz        1/1     Running             3          4d23h
    [root@k8s-master01 kubernetes]#kubectl rollout status deployments/deploy-heketi
    Waiting for deployment "deploy-heketi" rollout to finish: 0 of 1 updated replicas are available...
    deployment "deploy-heketi" successfully rolled out
    [root@k8s-master01 kubernetes]#kubectl get pods
    NAME                             READY   STATUS    RESTARTS   AGE
    deploy-heketi-6565469fdf-wcnjc   1/1     Running   0          55s
    glusterfs-2l5jf                  1/1     Running   0          43m
    glusterfs-4l88m                  1/1     Running   0          43m
    glusterfs-6fswc                  1/1     Running   0          43m
    jenkins-0                        1/1     Running   6          8d
    postgres-57f59c66fd-bfg7n        1/1     Running   4          5d23h
    sonarqube-649955d9b-7hgnz        1/1     Running   3          4d23h
    [root@k8s-master01 kubernetes]#

    四、创建GFS集群

      本节使用 Heketi 创建 GFS 集群,其管理方式更加简单和高效。

      复制 heketi-cli 至 /usr/local/bin/:

    [root@k8s-master01 bin]#pwd
    /root/GFS/heketi-client/bin
    [root@k8s-master01 bin]#ll
    total 29784
    -rwxr-xr-x 1 root root 30498281 Apr  7 21:38 heketi-cli
    [root@k8s-master01 bin]#cp heketi-cli /usr/local/bin/
    [root@k8s-master01 bin]#ls -l /usr/local/bin/
    total 582732
    -rwxr-xr-x 1 root root  10376657 Apr 17 03:17 cfssl
    -rwxr-xr-x 1 root root   2277873 Apr 17 03:17 cfssljson
    -rwxr-xr-x 1 root root  23847904 Aug 25  2020 etcd
    -rwxr-xr-x 1 root root  17620576 Aug 25  2020 etcdctl
    -rwxr-xr-x 1 root root  30498281 Jun 29 13:24 heketi-cli
    -rwxr-xr-x 1 root root  45109248 Jun 17 00:09 helm
    -rwxr-xr-x 1 root root 118128640 Dec  9  2020 kube-apiserver
    -rwxr-xr-x 1 root root 112308224 Dec  9  2020 kube-controller-manager
    -rwxr-xr-x 1 root root  40230912 Dec  9  2020 kubectl
    -rwxr-xr-x 1 root root 113974120 Dec  9  2020 kubelet
    -rwxr-xr-x 1 root root  39485440 Dec  9  2020 kube-proxy
    -rwxr-xr-x 1 root root  42848256 Dec  9  2020 kube-scheduler
    [root@k8s-master01 bin]#

      同步 heketi-cli 至其他node /usr/local/bin/:

    [root@k8s-master01 bin]#rsync -avzpP heketi-cli root@192.168.153.42:/usr/local/bin/
    sending incremental file list
    heketi-cli
         30,498,281 100%   22.95MB/s    0:00:01 (xfr#1, to-chk=0/1)
    
    sent 12,258,006 bytes  received 35 bytes  4,903,216.40 bytes/sec
    total size is 30,498,281  speedup is 2.49
    [root@k8s-master01 bin]#rsync -avzpP heketi-cli root@192.168.153.43:/usr/local/bin/
    sending incremental file list
    heketi-cli
         30,498,281 100%   21.81MB/s    0:00:01 (xfr#1, to-chk=0/1)
    
    sent 12,258,006 bytes  received 35 bytes  4,903,216.40 bytes/sec
    total size is 30,498,281  speedup is 2.49
    [root@k8s-master01 bin]#rsync -avzpP heketi-cli root@192.168.153.44:/usr/local/bin/
    The authenticity of host '192.168.153.44 (192.168.153.44)' can't be established.
    ECDSA key fingerprint is SHA256:AqR5ZL4OLkrfdBddeQVMjgrUGyAGLw1C7mTCQXAy7xE.
    ECDSA key fingerprint is MD5:18:1c:bd:c3:e6:0c:24:b9:1e:09:e7:1a:25:ee:e8:e0.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.153.44' (ECDSA) to the list of known hosts.
    root@192.168.153.44's password: 
    bash: rsync: command not found
    rsync: connection unexpectedly closed (0 bytes received so far) [sender]
    rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2]
    [root@k8s-master01 bin]#rsync -avzpP heketi-cli root@192.168.153.44:/usr/local/bin/
    root@192.168.153.44's password: 
    sending incremental file list
    heketi-cli
         30,498,281 100%   22.56MB/s    0:00:01 (xfr#1, to-chk=0/1)
    
    sent 12,258,006 bytes  received 35 bytes  2,724,009.11 bytes/sec
    total size is 30,498,281  speedup is 2.49
    [root@k8s-master01 bin]#
    rsync -avzpP heketi-cli root@192.168.153.42:/usr/local/bin/

      heketi-cli 版本号:

    [root@k8s-master01 ~]#heketi-cli -v
    heketi-cli v7.0.0

      修改 topology-sample,manage 为 GFS 管理服务的节点(Node)主机名,storage 为节点的 IP 地址,devices 为节点上裸设备,也就是用于提供存储的磁盘最好使用裸设备:

    [root@k8s-master01 kubernetes]#cat topology-sample.json 
    {
      "clusters": [
        {
          "nodes": [
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "k8s-master01"
                  ],
                  "storage": [
                    "192.168.153.41"
                  ]
                },
                "zone": 1
              },
              "devices": [
                {
                  "name": "/dev/sdb",
                  "destroydata": false
                }
              ]
            },
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "k8s-master02"
                  ],
                  "storage": [
                    "192.168.153.42"
                  ]
                },
                "zone": 1
              },
              "devices": [
                {
                  "name": "/dev/sdb",
                  "destroydata": false
                }
              ]
            },
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "k8s-master03"
                  ],
                  "storage": [
                    "192.168.153.43"
                  ]
                },
                "zone": 1
              },
              "devices": [
                {
                  "name": "/dev/sdb",
                  "destroydata": false
                }
              ]
            }
          ]
        }
      ]
    }

      查看当前 Heketi 的 ClusterIP:

    [root@k8s-master01 kubernetes]#kubectl get svc
    NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
    deploy-heketi   ClusterIP   10.102.18.156   <none>        8080/TCP                       5m42s
    jenkins         NodePort    10.111.57.164   <none>        80:32433/TCP,50000:30752/TCP   12d
    postgres        NodePort    10.99.208.124   <none>        5432:31692/TCP                 6d1h
    sonarqube       NodePort    10.102.29.13    <none>        9000:30003/TCP                 4d23h
    
    [root@k8s-master01 kubernetes]#curl 10.102.18.156:8080/hello
    Hello from Heketi[root@k8s-master01 kubernetes]#
    [root@k8s-master01 kubernetes]#
    [root@k8s-master01 kubernetes]#export HEKETI_CLI_SERVER="http://10.102.18.156:8080"
    [root@k8s-master01 kubernetes]#export |grep HEKETI
    declare -x HEKETI_CLI_SERVER="http://10.102.18.156:8080"

      使用 Heketi 创建 GFS 集群:

    [root@k8s-master01 kubernetes]#heketi-cli topology load --json=topology-sample.json 
    Error: Unable to get topology information: Invalid JWT token: Token missing iss claim

      这是因为新版本的 heketi 在创建 gfs 集群时需要带上参数,声明用户名及密码,相应值在 heketi.json 文件中配置,即:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
    Creating cluster ... ID: 8e17d5f80328a9e8c7d141ab4034e2e6
        Allowing file volumes on cluster.
        Allowing block volumes on cluster.
        Creating node k8s-master01 ... Unable to create node: New Node doesn't have glusterd running
        Creating node k8s-master02 ... Unable to create node: New Node doesn't have glusterd running
        Creating node k8s-master03 ... Unable to create node: New Node doesn't have glusterd running

      不报之前的错误,出现新的错误 Unable to create node: New Node doesn't have glusterd running,查看 deployment 的 pod 日志

    [root@k8s-master01 kubernetes]#kubectl get pods
    NAME                             READY   STATUS    RESTARTS   AGE
    deploy-heketi-6565469fdf-wcnjc   1/1     Running   0          12m
    glusterfs-2l5jf                  1/1     Running   0          54m
    glusterfs-4l88m                  1/1     Running   0          54m
    glusterfs-6fswc                  1/1     Running   0          54m
    jenkins-0                        1/1     Running   6          8d
    postgres-57f59c66fd-bfg7n        1/1     Running   4          6d
    sonarqube-649955d9b-7hgnz        1/1     Running   3          4d23h
      日志显示 Failed to get list of pods:
    [root@k8s-master01 kubernetes]#kubectl logs -f deploy-heketi-6565469fdf-wcnjc
    [heketi] ERROR 2021/06/29 09:10:57 heketi/apps/glusterfs/app_node.go:108:glusterfs.(*App).NodeAdd: New Node doesn't have glusterd running
    [negroni] 2021-06-29T09:10:57Z | 400 |      3.867841ms | 10.102.18.156:8080 | POST /nodes
    [cmdexec] INFO 2021/06/29 09:10:57 Check Glusterd service status in node k8s-master03
    [negroni] 2021-06-29T09:10:57Z | 400 |      4.219108ms | 10.102.18.156:8080 | POST /nodes
    [kubeexec] ERROR 2021/06/29 09:10:57 heketi/pkg/remoteexec/kube/target.go:134:kube.TargetDaemonSet.GetTargetPod: pods is forbidden: User "system:serviceaccount:devops:heketi-service-account" cannot list resource "pods" in API group "" in the namespace "devops"
    [kubeexec] ERROR 2021/06/29 09:10:57 heketi/pkg/remoteexec/kube/target.go:135:kube.TargetDaemonSet.GetTargetPod: Failed to get list of pods
    [cmdexec] ERROR 2021/06/29 09:10:57 heketi/executors/cmdexec/peer.go:80:cmdexec.(*CmdExecutor).GlusterdCheck: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:10:57 heketi/apps/glusterfs/app_node.go:107:glusterfs.(*App).NodeAdd: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:10:57 heketi/apps/glusterfs/app_node.go:108:glusterfs.(*App).NodeAdd: New Node doesn't have glusterd running
    [negroni] 2021-06-29T09:10:57Z | 200 |      353.242µs | 10.102.18.156:8080 | GET /clusters/8e17d5f80328a9e8c7d141ab4034e2e6
    [heketi] INFO 2021/06/29 09:10:57 Deleted cluster [8e17d5f80328a9e8c7d141ab4034e2e6]
    [negroni] 2021-06-29T09:10:57Z | 200 |      3.360667ms | 10.102.18.156:8080 | DELETE /clusters/8e17d5f80328a9e8c7d141ab4034e2e6
    [heketi] INFO 2021/06/29 09:12:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:12:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:14:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:14:03 Cleaned 0 nodes from health cache

      解决办法: 创建 role 并绑定到 ServiceAccount,

    [root@k8s-master01 kubernetes]#kubectl create clusterrole foo --verb=get,list,watch,create --resource=pods,pods/status,pods/exec
    clusterrole.rbac.authorization.k8s.io/foo created

      再次执行gluster添加命令,观察日志:

    [heketi] INFO 2021/06/29 09:12:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:12:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:14:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:14:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:16:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:16:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:18:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:18:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:20:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:20:03 Cleaned 0 nodes from health cache

      再使用 Heketi 创建 GFS 集群:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
    Creating cluster ... ID: ba8f4a8a29e5c436d0c84c45ad9e00d3
        Allowing file volumes on cluster.
        Allowing block volumes on cluster.
        Creating node k8s-master01 ... Unable to create node: New Node doesn't have glusterd running
        Creating node k8s-master02 ... Unable to create node: New Node doesn't have glusterd running
        Creating node k8s-master03 ... Unable to create node: New Node doesn't have glusterd running
    [root@k8s-master01 kubernetes]#

      再打开一个窗口,查看日志:

    [heketi] INFO 2021/06/29 09:42:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:42:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:44:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:44:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:46:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:46:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:48:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:48:03 Cleaned 0 nodes from health cache
    [heketi] INFO 2021/06/29 09:50:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:50:03 Cleaned 0 nodes from health cache
    [negroni] 2021-06-29T09:51:42Z | 200 |      102.535µs | 10.102.18.156:8080 | GET /clusters
    [negroni] 2021-06-29T09:51:42Z | 201 |      3.432335ms | 10.102.18.156:8080 | POST /clusters
    [cmdexec] INFO 2021/06/29 09:51:42 Check Glusterd service status in node k8s-master01
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:134:kube.TargetDaemonSet.GetTargetPod: pods is forbidden: User "system:serviceaccount:devops:heketi-service-account" cannot list resource "pods" in API group "" in the namespace "devops"
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:135:kube.TargetDaemonSet.GetTargetPod: Failed to get list of pods
    [cmdexec] ERROR 2021/06/29 09:51:42 heketi/executors/cmdexec/peer.go:80:cmdexec.(*CmdExecutor).GlusterdCheck: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:107:glusterfs.(*App).NodeAdd: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:108:glusterfs.(*App).NodeAdd: New Node doesn't have glusterd running
    [negroni] 2021-06-29T09:51:42Z | 400 |      34.875543ms | 10.102.18.156:8080 | POST /nodes
    [cmdexec] INFO 2021/06/29 09:51:42 Check Glusterd service status in node k8s-master02
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:134:kube.TargetDaemonSet.GetTargetPod: pods is forbidden: User "system:serviceaccount:devops:heketi-service-account" cannot list resource "pods" in API group "" in the namespace "devops"
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:135:kube.TargetDaemonSet.GetTargetPod: Failed to get list of pods
    [cmdexec] ERROR 2021/06/29 09:51:42 heketi/executors/cmdexec/peer.go:80:cmdexec.(*CmdExecutor).GlusterdCheck: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:107:glusterfs.(*App).NodeAdd: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:108:glusterfs.(*App).NodeAdd: New Node doesn't have glusterd running
    [negroni] 2021-06-29T09:51:42Z | 400 |      5.317761ms | 10.102.18.156:8080 | POST /nodes
    [cmdexec] INFO 2021/06/29 09:51:42 Check Glusterd service status in node k8s-master03
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:134:kube.TargetDaemonSet.GetTargetPod: pods is forbidden: User "system:serviceaccount:devops:heketi-service-account" cannot list resource "pods" in API group "" in the namespace "devops"
    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:135:kube.TargetDaemonSet.GetTargetPod: Failed to get list of pods
    [cmdexec] ERROR 2021/06/29 09:51:42 heketi/executors/cmdexec/peer.go:80:cmdexec.(*CmdExecutor).GlusterdCheck: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:107:glusterfs.(*App).NodeAdd: Failed to get list of pods
    [heketi] ERROR 2021/06/29 09:51:42 heketi/apps/glusterfs/app_node.go:108:glusterfs.(*App).NodeAdd: New Node doesn't have glusterd running
    [negroni] 2021-06-29T09:51:42Z | 400 |      4.586467ms | 10.102.18.156:8080 | POST /nodes
    [negroni] 2021-06-29T09:51:42Z | 200 |      237.734µs | 10.102.18.156:8080 | GET /clusters/ba8f4a8a29e5c436d0c84c45ad9e00d3
    [heketi] INFO 2021/06/29 09:51:42 Deleted cluster [ba8f4a8a29e5c436d0c84c45ad9e00d3]
    [negroni] 2021-06-29T09:51:42Z | 200 |      895.405µs | 10.102.18.156:8080 | DELETE /clusters/ba8f4a8a29e5c436d0c84c45ad9e00d3
    [heketi] INFO 2021/06/29 09:52:03 Starting Node Health Status refresh
    [heketi] INFO 2021/06/29 09:52:03 Cleaned 0 nodes from health cache

      终于找到为啥了:

    [kubeexec] ERROR 2021/06/29 09:51:42 heketi/pkg/remoteexec/kube/target.go:134:kube.TargetDaemonSet.GetTargetPod: pods is forbidden: User "system:serviceaccount:devops:heketi-service-account" cannot list resource "pods" in API group "" in the namespace "devops"

      删除clusterrolebinding,重新创建新的clusterrolebinding后,成功!

    [root@k8s-master01 kubernetes]#kubectl delete clusterrolebinding heketi-gluster-admin
    clusterrolebinding.rbac.authorization.k8s.io "heketi-gluster-admin" deleted
    [root@k8s-master01 kubernetes]#kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=cluster-admin --serviceaccount=devops:heketi-service-account
    clusterrolebinding.rbac.authorization.k8s.io/heketi-gluster-admin created
    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
    Creating cluster ... ID: c934f76dfae0fc21e0d8820c5e2ee401
        Allowing file volumes on cluster.
        Allowing block volumes on cluster.
        Creating node k8s-master01 ... ID: aaf700d47bfa7d2c0bd2a08e66a0d1f3
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
        Creating node k8s-master02 ... ID: 04b711a1eb44601f8d6b5c002b28aaf9
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
        Creating node k8s-master03 ... ID: cca811a225c58034b3d79fc2c2d01be4
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
    [root@k8s-master01 kubernetes]#

      第二天打开电脑,开机后发现 Heketi 配置失效了,原来是没有配置持久卷,就把上面部分步骤重新做一遍,在到执行 Heketi 创建 GFS 集群时,又报错了,命令执行报错如下:

    [root@k8s-master01 kubernetes]#kubectl logs -f deploy-heketi-6565469fdf-n2wnh -n devops^C
    [root@k8s-master01 kubernetes]#kubectl create clusterrole foo --verb=get,list,watch,create --resource=pods,pods/status,pods/exec
    Error from server (AlreadyExists): clusterroles.rbac.authorization.k8s.io "foo" already exists
    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
        Found node k8s-master01 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
        Found node k8s-master02 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
        Found node k8s-master03 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
        Found node k8s-master01 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... OK
        Found node k8s-master02 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.
        Found node k8s-master03 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... Unable to add device: Initializing device /dev/sdb failed (already initialized or contains data?):   Device /dev/sdb excluded by a filter.

      解决办法如下,先查看pod的日志

    [root@k8s-master01 kubernetes]#kubectl logs -f deploy-heketi-6565469fdf-n2wnh
    [negroni] 2021-07-01T02:46:30Z | 200 |      77.337µs | 10.102.18.156:8080 | GET /clusters
    [negroni] 2021-07-01T02:46:30Z | 200 |      210.78µs | 10.102.18.156:8080 | GET /clusters/221eddbc9d9ec714e6de6c19f5e86e09
    [negroni] 2021-07-01T02:46:30Z | 200 |      446.48µs | 10.102.18.156:8080 | GET /nodes/1e515e038850e2f725125cd55a19d278
    [negroni] 2021-07-01T02:46:30Z | 200 |      256.658µs | 10.102.18.156:8080 | GET /nodes/4154491e2eb27e7017f9b8dab8046076
    [negroni] 2021-07-01T02:46:30Z | 200 |      244.247µs | 10.102.18.156:8080 | GET /nodes/45d66ab47e0e299b25c66a57c667b1de
    [negroni] 2021-07-01T02:46:30Z | 200 |      334.914µs | 10.102.18.156:8080 | GET /clusters/221eddbc9d9ec714e6de6c19f5e86e09
    [negroni] 2021-07-01T02:46:30Z | 200 |      460.879µs | 10.102.18.156:8080 | GET /clusters/221eddbc9d9ec714e6de6c19f5e86e09
    [heketi] INFO 2021/07/01 02:46:30 Adding device /dev/sdb to node 4154491e2eb27e7017f9b8dab8046076
    [negroni] 2021-07-01T02:46:30Z | 202 |      4.574525ms | 10.102.18.156:8080 | POST /devices
    [asynchttp] INFO 2021/07/01 02:46:30 Started job 0c89db58f2ffcf410c0777d2f20a08b3
    [negroni] 2021-07-01T02:46:30Z | 200 |      74.084µs | 10.102.18.156:8080 | GET /queue/0c89db58f2ffcf410c0777d2f20a08b3
    [kubeexec] DEBUG 2021/07/01 02:46:30 heketi/pkg/remoteexec/log/commandlog.go:34:log.(*CommandLogger).Before: Will run command [/usr/sbin/lvm pvcreate -qq --metadatasize=128M --dataalignment=256K '/dev/sdb'] on [pod:glusterfs-d2glt c:glusterfs ns:devops (from host:k8s-master02 selector:glusterfs-node)]
    [kubeexec] DEBUG 2021/07/01 02:46:30 heketi/pkg/remoteexec/kube/exec.go:72:kube.ExecCommands: Current kube connection count: 0
    [kubeexec] ERROR 2021/07/01 02:46:30 heketi/pkg/remoteexec/log/commandlog.go:56:log.(*CommandLogger).Error: Failed to run command [/usr/sbin/lvm pvcreate -qq --metadatasize=128M --dataalignment=256K '/dev/sdb'] on [pod:glusterfs-d2glt c:glusterfs ns:devops (from host:k8s-master02 selector:glusterfs-node)]: Err[command terminated with exit code 5]: Stdout []: Stderr [WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: [n]
      Aborted wiping of dos.
      1 existing signature left on the device.
    ]
    [kubeexec] DEBUG 2021/07/01 02:46:30 heketi/pkg/remoteexec/log/commandlog.go:34:log.(*CommandLogger).Before: Will run command [/usr/sbin/lvm pvs -o pv_name,pv_uuid,vg_name --reportformat=json /dev/sdb] on [pod:glusterfs-d2glt c:glusterfs ns:devops (from host:k8s-master02 selector:glusterfs-node)]
    [kubeexec] DEBUG 2021/07/01 02:46:30 heketi/pkg/remoteexec/kube/exec.go:72:kube.ExecCommands: Current kube connection count: 0
    [asynchttp] INFO 2021/07/01 02:46:30 Completed job 0c89db58f2ffcf410c0777d2f20a08b3 in 343.470109ms
    [kubeexec] ERROR 2021/07/01 02:46:30 heketi/pkg/remoteexec/log/commandlog.go:56:log.(*CommandLogger).Error: Failed to run command [/usr/sbin/lvm pvs -o pv_name,pv_uuid,vg_name --reportformat=json /dev/sdb] on [pod:glusterfs-d2glt c:glusterfs ns:devops (from host:k8s-master02 selector:glusterfs-node)]: Err[command terminated with exit code 5]: Stdout [  {
          "report": [
              {
                  "pv": [
                  ]
              }
          ]
      }
    ]: Stderr [  Failed to find physical volume "/dev/sdb".
    ]
    [negroni] 2021-07-01T02:46:31Z | 500 |      75.41µs | 10.102.18.156:8080 | GET /queue/0c89db58f2ffcf410c0777d2f20a08b3
    [negroni] 2021-07-01T02:46:31Z | 200 |      200.176µs | 10.102.18.156:8080 | GET /clusters/221eddbc9d9ec714e6de6c19f5e86e09
    [heketi] INFO 2021/07/01 02:46:31 Adding device /dev/sdb to node 45d66ab47e0e299b25c66a57c667b1de
    [negroni] 2021-07-01T02:46:31Z | 202 |      1.013933ms | 10.102.18.156:8080 | POST /devices
    [asynchttp] INFO 2021/07/01 02:46:31 Started job eee9aed41f9be12d74592b3f1d9212ef
    [negroni] 2021-07-01T02:46:31Z | 200 |      73.998µs | 10.102.18.156:8080 | GET /queue/eee9aed41f9be12d74592b3f1d9212ef
    [kubeexec] DEBUG 2021/07/01 02:46:31 heketi/pkg/remoteexec/log/commandlog.go:34:log.(*CommandLogger).Before: Will run command [/usr/sbin/lvm pvcreate -qq --metadatasize=128M --dataalignment=256K '/dev/sdb'] on [pod:glusterfs-ttv65 c:glusterfs ns:devops (from host:k8s-master03 selector:glusterfs-node)]
    [kubeexec] DEBUG 2021/07/01 02:46:31 heketi/pkg/remoteexec/kube/exec.go:72:kube.ExecCommands: Current kube connection count: 0
    [kubeexec] ERROR 2021/07/01 02:46:31 heketi/pkg/remoteexec/log/commandlog.go:56:log.(*CommandLogger).Error: Failed to run command [/usr/sbin/lvm pvcreate -qq --metadatasize=128M --dataalignment=256K '/dev/sdb'] on [pod:glusterfs-ttv65 c:glusterfs ns:devops (from host:k8s-master03 selector:glusterfs-node)]: Err[command terminated with exit code 5]: Stdout []: Stderr [WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: [n]
      Aborted wiping of dos.
      1 existing signature left on the device.
    ]
    [kubeexec] DEBUG 2021/07/01 02:46:31 heketi/pkg/remoteexec/log/commandlog.go:34:log.(*CommandLogger).Before: Will run command [/usr/sbin/lvm pvs -o pv_name,pv_uuid,vg_name --reportformat=json /dev/sdb] on [pod:glusterfs-ttv65 c:glusterfs ns:devops (from host:k8s-master03 selector:glusterfs-node)]
    [kubeexec] DEBUG 2021/07/01 02:46:31 heketi/pkg/remoteexec/kube/exec.go:72:kube.ExecCommands: Current kube connection count: 0
    [kubeexec] ERROR 2021/07/01 02:46:31 heketi/pkg/remoteexec/log/commandlog.go:56:log.(*CommandLogger).Error: Failed to run command [/usr/sbin/lvm pvs -o pv_name,pv_uuid,vg_name --reportformat=json /dev/sdb] on [pod:glusterfs-ttv65 c:glusterfs ns:devops (from host:k8s-master03 selector:glusterfs-node)]: Err[command terminated with exit code 5]: Stdout [  {
          "report": [
              {
                  "pv": [
                  ]
              }
          ]
      }
    ]: Stderr [  Failed to find physical volume "/dev/sdb".
    kubectl logs -f deploy-heketi-6565469fdf-n2wnh

      发现:

    [kubeexec] ERROR 2021/07/01 02:46:30 heketi/pkg/remoteexec/log/commandlog.go:56:log.(*CommandLogger).Error: Failed to run command [/usr/sbin/lvm pvcreate -qq --metadatasize=128M --dataalignment=256K '/dev/sdb'] on [pod:glusterfs-d2glt c:glusterfs ns:devops (from host:k8s-master02 selector:glusterfs-node)]: Err[command terminated with exit code 5]: Stdout []: Stderr [WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: [n]
      Aborted wiping of dos.
      1 existing signature left on the device.
    ]

      先umount /dev/sdb,再执行:

    [root@k8s-master01 ~]#parted /dev/sdb
    GNU Parted 3.1
    Using /dev/sdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) mklabel msdos                                                    
    Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
    Yes/No? yes
    (parted) quit
    Information: You may need to update /etc/fstab.
    
    [root@k8s-master01 ~]#pvcreate /dev/sdb
    WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
      Wiping dos signature on /dev/sdb.
      Physical volume "/dev/sdb" successfully created.
    [root@k8s-master01 ~]#

      再执行 Heketi 创建 GFS 集群,再次成功!

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology load --json=topology-sample.json
        Found node k8s-master01 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Found device /dev/sdb
        Found node k8s-master02 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... OK
        Found node k8s-master03 on cluster 221eddbc9d9ec714e6de6c19f5e86e09
            Adding device /dev/sdb ... OK
    [root@k8s-master01 kubernetes]#

      汲取之前创建的 Heketi 未配置持久化卷,如果 Heketi 的 Pod 重启,可能会丢失之前的配置信息,所以现在创建 Heketi 持久化卷,对 Heketi 的数据进行持久化。该持久化方式采用 GFS 提供的动态存储,也可以采用其他方式进行持久化:

    #所有节点安装 device-mapper*
    [root@k8s-master01 ~]#yum install -y device-mapper*
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    aliyun-docker-ce                                                                     | 3.5 kB  00:00:00     
    base                                                                                 | 3.6 kB  00:00:00     
    epel                                                                                 | 4.7 kB  00:00:00     
    extras                                                                               | 2.9 kB  00:00:00     
    updates                                                                              | 2.9 kB  00:00:00     
    (1/2): epel/x86_64/updateinfo                                                        | 1.0 MB  00:00:01     
    (2/2): epel/x86_64/primary_db                                                        | 6.9 MB  00:00:12     
    Package device-mapper-persistent-data-0.8.5-3.el7_9.2.x86_64 already installed and latest version
    Package 7:device-mapper-event-libs-1.02.170-6.el7_9.5.x86_64 already installed and latest version
    Package 7:device-mapper-1.02.170-6.el7_9.5.x86_64 already installed and latest version
    Package 7:device-mapper-libs-1.02.170-6.el7_9.5.x86_64 already installed and latest version
    Package 7:device-mapper-event-1.02.170-6.el7_9.5.x86_64 already installed and latest version
    Resolving Dependencies
    --> Running transaction check
    ---> Package device-mapper-devel.x86_64 7:1.02.170-6.el7_9.5 will be installed
    --> Processing Dependency: pkgconfig(libudev) for package: 7:device-mapper-devel-1.02.170-6.el7_9.5.x86_64
    ---> Package device-mapper-event-devel.x86_64 7:1.02.170-6.el7_9.5 will be installed
    ---> Package device-mapper-multipath.x86_64 0:0.4.9-134.el7_9 will be installed
    ---> Package device-mapper-multipath-devel.x86_64 0:0.4.9-134.el7_9 will be installed
    ---> Package device-mapper-multipath-libs.x86_64 0:0.4.9-134.el7_9 will be installed
    ---> Package device-mapper-multipath-sysvinit.x86_64 0:0.4.9-134.el7_9 will be installed
    --> Running transaction check
    ---> Package systemd-devel.x86_64 0:219-78.el7_9.3 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ============================================================================================================
     Package                                  Arch           Version                      Repository       Size
    ============================================================================================================
    Installing:
     device-mapper-devel                      x86_64         7:1.02.170-6.el7_9.5         updates         206 k
     device-mapper-event-devel                x86_64         7:1.02.170-6.el7_9.5         updates         174 k
     device-mapper-multipath                  x86_64         0.4.9-134.el7_9              updates         148 k
     device-mapper-multipath-devel            x86_64         0.4.9-134.el7_9              updates          79 k
     device-mapper-multipath-libs             x86_64         0.4.9-134.el7_9              updates         268 k
     device-mapper-multipath-sysvinit         x86_64         0.4.9-134.el7_9              updates          64 k
    Installing for dependencies:
     systemd-devel                            x86_64         219-78.el7_9.3               updates         216 k
    
    Transaction Summary
    ============================================================================================================
    Install  6 Packages (+1 Dependent package)
    
    Total download size: 1.1 M
    Installed size: 1.3 M
    Downloading packages:
    (1/7): device-mapper-event-devel-1.02.170-6.el7_9.5.x86_64.rpm                       | 174 kB  00:00:00     
    (2/7): device-mapper-devel-1.02.170-6.el7_9.5.x86_64.rpm                             | 206 kB  00:00:00     
    (3/7): device-mapper-multipath-0.4.9-134.el7_9.x86_64.rpm                            | 148 kB  00:00:00     
    (4/7): device-mapper-multipath-devel-0.4.9-134.el7_9.x86_64.rpm                      |  79 kB  00:00:00     
    (5/7): device-mapper-multipath-sysvinit-0.4.9-134.el7_9.x86_64.rpm                   |  64 kB  00:00:00     
    (6/7): device-mapper-multipath-libs-0.4.9-134.el7_9.x86_64.rpm                       | 268 kB  00:00:00     
    (7/7): systemd-devel-219-78.el7_9.3.x86_64.rpm                                       | 216 kB  00:00:00     
    ------------------------------------------------------------------------------------------------------------
    Total                                                                       713 kB/s | 1.1 MB  00:00:01     
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : device-mapper-multipath-libs-0.4.9-134.el7_9.x86_64                                      1/7 
      Installing : device-mapper-multipath-0.4.9-134.el7_9.x86_64                                           2/7 
      Installing : systemd-devel-219-78.el7_9.3.x86_64                                                      3/7 
      Installing : 7:device-mapper-devel-1.02.170-6.el7_9.5.x86_64                                          4/7 
      Installing : 7:device-mapper-event-devel-1.02.170-6.el7_9.5.x86_64                                    5/7 
      Installing : device-mapper-multipath-devel-0.4.9-134.el7_9.x86_64                                     6/7 
      Installing : device-mapper-multipath-sysvinit-0.4.9-134.el7_9.x86_64                                  7/7 
      Verifying  : device-mapper-multipath-libs-0.4.9-134.el7_9.x86_64                                      1/7 
      Verifying  : device-mapper-multipath-sysvinit-0.4.9-134.el7_9.x86_64                                  2/7 
      Verifying  : 7:device-mapper-devel-1.02.170-6.el7_9.5.x86_64                                          3/7 
      Verifying  : device-mapper-multipath-0.4.9-134.el7_9.x86_64                                           4/7 
      Verifying  : device-mapper-multipath-devel-0.4.9-134.el7_9.x86_64                                     5/7 
      Verifying  : 7:device-mapper-event-devel-1.02.170-6.el7_9.5.x86_64                                    6/7 
      Verifying  : systemd-devel-219-78.el7_9.3.x86_64                                                      7/7 
    
    Installed:
      device-mapper-devel.x86_64 7:1.02.170-6.el7_9.5                                                           
      device-mapper-event-devel.x86_64 7:1.02.170-6.el7_9.5                                                     
      device-mapper-multipath.x86_64 0:0.4.9-134.el7_9                                                          
      device-mapper-multipath-devel.x86_64 0:0.4.9-134.el7_9                                                    
      device-mapper-multipath-libs.x86_64 0:0.4.9-134.el7_9                                                     
      device-mapper-multipath-sysvinit.x86_64 0:0.4.9-134.el7_9                                                 
    
    Dependency Installed:
      systemd-devel.x86_64 0:219-78.el7_9.3                                                                     
    
    Complete!
    yum install -y device-mapper*

      将配置信息保存为文件,并创建持久化相关信息

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' setup-openshift-heketi-storage Saving heketi-storage.json
    Error: Volume group "vg_1649049e5e56ca80f5d8c999fe5f7e44" not found
      Cannot process volume group vg_1649049e5e56ca80f5d8c999fe5f7e44

      查看 topology info:

    [root@k8s-master01 kubernetes]#heketi-cli topology info
    Error: Invalid JWT token: Token missing iss claim
    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology info
    
    Cluster Id: 221eddbc9d9ec714e6de6c19f5e86e09
    
        File:  true
        Block: true
    
        Volumes:
    
        Nodes:
    
        Node Id: 1e515e038850e2f725125cd55a19d278
        State: online
        Cluster Id: 221eddbc9d9ec714e6de6c19f5e86e09
        Zone: 1
        Management Hostnames: k8s-master01
        Storage Hostnames: 192.168.153.41
        Devices:
            Id:1649049e5e56ca80f5d8c999fe5f7e44   Name:/dev/sdb            State:online    Size (GiB):499     Used (GiB):2       Free (GiB):497     
                Bricks:
                    Id:5c27b9746dd3f888a2e1b24b569a3341   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_1649049e5e56ca80f5d8c999fe5f7e44/brick_5c27b9746dd3f888a2e1b24b569a3341/brick
    
        Node Id: 4154491e2eb27e7017f9b8dab8046076
        State: online
        Cluster Id: 221eddbc9d9ec714e6de6c19f5e86e09
        Zone: 1
        Management Hostnames: k8s-master02
        Storage Hostnames: 192.168.153.42
        Devices:
            Id:407895720847863c230097f19c566a02   Name:/dev/sdb            State:online    Size (GiB):499     Used (GiB):2       Free (GiB):497     
                Bricks:
                    Id:324b16b31c6d82ebb6d0c088cd461025   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_407895720847863c230097f19c566a02/brick_324b16b31c6d82ebb6d0c088cd461025/brick
    
        Node Id: 45d66ab47e0e299b25c66a57c667b1de
        State: online
        Cluster Id: 221eddbc9d9ec714e6de6c19f5e86e09
        Zone: 1
        Management Hostnames: k8s-master03
        Storage Hostnames: 192.168.153.43
        Devices:
            Id:55d6a98d41a7e405b8b5ceef20432344   Name:/dev/sdb            State:online    Size (GiB):499     Used (GiB):2       Free (GiB):497     
                Bricks:
                    Id:30302ee4860525e756588ed1de2f0d88   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_55d6a98d41a7e405b8b5ceef20432344/brick_30302ee4860525e756588ed1de2f0d88/brick
    [root@k8s-master01 kubernetes]#
    heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology info

      发现 vg_1649049e5e56ca80f5d8c999fe5f7e44 在 Storage Hostnames: 192.168.153.41 Id:5c27b9746dd3f888a2e1b24b569a3341   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_1649049e5e56ca80f5d8c999fe5f7e44/brick_5c27b9746dd3f888a2e1b24b569a3341/brick

      把执行报错的命令再执行一遍:

    [root@k8s-master01 kubernetes]# heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' setup-openshift-heketi-storage Saving heketi-storage.json
    Error: Failed to allocate new volume: Volume name 'heketidbstorage' already in use
    [root@k8s-master01 kubernetes]#

      查看日志 kubectl logs -f deploy-heketi-6565469fdf-n2wnh:

    1 [negroni] 2021-07-01T03:10:40Z | 200 |      150.487µs | 10.102.18.156:8080 | GET /clusters
    2 [negroni] 2021-07-01T03:10:40Z | 200 |      328.205µs | 10.102.18.156:8080 | GET /clusters/221eddbc9d9ec714e6de6c19f5e86e09
    3 [heketi] ERROR 2021/07/01 03:10:40 heketi/apps/glusterfs/volume_entry.go:919:glusterfs.eligibleClusters.func1: Name heketidbstorage already in use in cluster 221eddbc9d9ec714e6de6c19f5e86e09
    4 [heketi] ERROR 2021/07/01 03:10:40 heketi/apps/glusterfs/volume_entry.go:939:glusterfs.eligibleClusters: No clusters eligible to satisfy create volume request
    5 [heketi] ERROR 2021/07/01 03:10:40 heketi/apps/glusterfs/operations_manage.go:220:glusterfs.AsyncHttpOperation: Create Volume Build Failed: Volume name 'heketidbstorage' already in use
    6 [negroni] 2021-07-01T03:10:40Z | 500 |      579.071µs | 10.102.18.156:8080 | POST /volumes
    7 [heketi] INFO 2021/07/01 03:11:14 Starting Node Health Status refresh
    8 [cmdexec] INFO 2021/07/01 03:11:14 Check Glusterd service status in node k8s-master01

      继续排查:

      查看集群信息常用的命令:

    查看 topology info
        heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' topology info [flags]
    查看 node info
        heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' node info [node_id] [flags]
    查看 device info
        heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' device info [device_id] [flags]
    查看 cluster list
        heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' cluster list [flags]
    查看 cluster info
        heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' cluster info [cluster_id] [flags]

      查看 node info:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' node info 0b5ec08be973e47535ed25a36b44141a
    Node Id: 0b5ec08be973e47535ed25a36b44141a
    State: online
    Cluster Id: 1a24bdf9bc6a82a0530dcfbff24aad54
    Zone: 1
    Management Hostname: k8s-master03
    Storage Hostname: 192.168.153.43
    Devices:
    Id:936bddeece0f76fec700998c5520c6eb   Name:/dev/sdb            State:online    Size (GiB):499     Used (GiB):2       Free (GiB):497     Bricks:1       
    [root@k8s-master01 kubernetes]#

      查看 device info:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' device info 936bddeece0f76fec700998c5520c6eb
    Device Id: 936bddeece0f76fec700998c5520c6eb
    Name: /dev/sdb
    State: online
    Size (GiB): 499
    Used (GiB): 2
    Free (GiB): 497
    Bricks:
    Id:6b33d59f6da059a7d8e38696f8549001   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_936bddeece0f76fec700998c5520c6eb/brick_6b33d59f6da059a7d8e38696f8549001/brick
    [root@k8s-master01 kubernetes]#

      查看 cluster list:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' cluster list
    Clusters:
    Id:1a24bdf9bc6a82a0530dcfbff24aad54 [file][block]
    [root@k8s-master01 kubernetes]#

      查看 cluster info:

    [root@k8s-master01 kubernetes]#heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'My Secret' cluster info 1a24bdf9bc6a82a0530dcfbff24aad54
    Cluster id: 1a24bdf9bc6a82a0530dcfbff24aad54
    Nodes:
    0b5ec08be973e47535ed25a36b44141a
    3bfa2d1f005fe540df39843b8f8ea283
    9c678039658836b8ed4e96c97bdc8c2b
    Volumes:
    
    Block: true
    
    File: true
    [root@k8s-master01 kubernetes]#
     
  • 相关阅读:
    django 简单会议室预约(4)
    vi/vim编辑器
    django 简单会议室预约(3)
    django 简单会议室预约(2)
    VMware Workstation Pro许可证
    记录一次重装系统后的文件丢失
    win10下载软件防止被杀
    oracle数据泵导入导出部分用户
    求助:笔记本连接手机热点有限的访问权限
    下班老忘记打卡,在电脑上做一个定时下班打卡的弹窗
  • 原文地址:https://www.cnblogs.com/zuoyang/p/14948802.html
Copyright © 2020-2023  润新知