第 6 章 以融合模式升级 Red Hat Openshift Container Storage

本章论述了将环境从融合模式 3.10 升级到 Red Hat Openshift Container Storage in Converged Mode 3.11 的步骤。

注意
  • 本指南中通篇使用新的 registry 名称 registry.redhat.io。但是,如果您还没有迁移到新 registry,在相关位置将将所有 registry.redhat.io 替换为适用的 registry.access.redhat.com
  • 按照相同的升级步骤,将您的环境从 Red Hat Openshift Container Storage in Converged Mode 3.11.0 升级到 Red Hat Openshift Container Storage in Converged Mode 3.11.8。在开始升级过程前,请确保配置了正确的镜像和版本号。
  • Red Hat Openshift Container Storage 3.11.8 的有效镜像有:

    • registry.redhat.io/rhgs3/rhgs-server-rhel7:v3.11.8
    • registry.redhat.io/rhgs3/rhgs-volmanager-rhel7:v3.11.8
    • registry.redhat.io/rhgs3/rhgs-gluster-block-prov-rhel7:v3.11.8
    • registry.redhat.io/rhgs3/rhgs-s3-server-rhel7:v3.11.8

6.1. 升级 glusterfs 组中的 pod

以下小节提供了升级 Glusterfs pod 的步骤。

6.1.1. 先决条件

确保满足以下先决条件:

注意

对于使用 cns-deploy 工具的部署,模板位于以下位置:

  • gluster 模板 - /usr/share/heketi/templates/glusterfs-template.yaml
  • heketi 模板 - /usr/share/heketi/templates/heketi-template.yaml
  • glusterblock-provisioner 模板 - /usr/share/heketi/templates/glusterblock-provisioner.yaml

对于使用 ansible playbook 的部署,模板可从以下位置获取:

  • Gluster 模板 - /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/glusterfs-template.yml
  • heketi 模板 - /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/heketi-template.yml
  • glusterblock-provisioner 模板 - /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/glusterblock-provisioner.yml

6.1.2. 恢复 /dev/log 的原始标签值

注意

只有在您将环境从 Red Hat Container Native Storage 3.9 升级到 Red Hat Openshift Container Storage 3.11.8 时,才应按照以下步骤操作。

如果您要将环境从 Red Hat Openshift Container Storage 3.10 及以上升级到 Red Hat Openshift Container Storage 3.11.8,请跳过此步骤。

要恢复原始 selinux 标签,请执行以下命令:

  1. 在运行 gluster pod 的所有节点上创建目录和软链接:

    # mkdir /srv/<directory_name>
    # cd /srv/<directory_name>/   # same dir as above
    # ln -sf /dev/null systemd-tmpfiles-setup-dev.service
    # ln -sf /dev/null systemd-journald.service
    # ln -sf /dev/null systemd-journald.socket
  2. 编辑 daemonset,它将在具有 oc 客户端的节点上创建 glusterfs pod:

    # oc edit daemonset <daemonset_name>

    在 volumeMounts 部分添加卷的映射:

    - mountPath: /usr/lib/systemd/system/systemd-journald.service
      name: systemd-journald-service
    - mountPath: /usr/lib/systemd/system/systemd-journald.socket
      name: systemd-journald-socket
    - mountPath: /usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service
    name: systemd-tmpfiles-setup-dev-service

    在 volumes 部分为列出的每个服务添加新主机路径:

    注意

    此处提到的路径应与第 1 步中所述相同。

    - hostPath:
       path: /srv/<directory_name>/systemd-journald.socket
       type: ""
      name: systemd-journald-socket
    - hostPath:
       path: /srv/<directory_name>/systemd-journald.service
       type: ""
      name: systemd-journald-service
    - hostPath:
       path: /srv/<directory_name>/systemd-tmpfiles-setup-dev.service
       type: ""
    name: systemd-tmpfiles-setup-dev-service
  3. 在运行 gluster pod 的所有节点上运行以下命令。这将重置标签:

    # restorecon /dev/log
  4. 执行以下命令检查所有卷的自我修复状态:

    # oc rsh <gluster_pod_name>
    # for each_volume in `gluster volume list`; do gluster volume heal $each_volume info ; done  | grep  "Number of entries: [^0]$"

    等待自我修复完成。

  5. 执行以下命令并确保 brick 不超过 90%:

    # df -kh | grep -v ^Filesystem | awk '{if(int($5)>90) print $0}'
    注意

    如果 brick 接近 100% 利用率,则这些 brick 的逻辑卷管理器(LVM)激活可能需要很长时间,或者在 pod 或节点重启后可能会卡住。建议关闭该 brick 的利用率或扩展使用逻辑卷(LV)的物理卷。

    注意

    df 命令不适用于属于块卷(BHV)的 brick。在 BHV 上,由 df 命令生成的 brick 的 used 大小是该 Gluster 卷的 blockvolumes 添加的大小,它不是 blockvolumes 中驻留的数据量。如需更多信息,请参阅 Openshift Container Storage 中如何识别块卷和块卷

  6. 在 gluster pod 中的任何一个节点上执行以下命令,以设置可在 glusterfsd 进程的单一实例上运行的 brick(250)的最大数量:

    # gluster volume set all cluster.max-bricks-per-process 250
    1. 在 gluster pod 中的任何一个节点上执行以下命令来确保正确设置了选项:

      # gluster volume get all cluster.max-bricks-per-process

      例如:

      # gluster volume get all cluster.max-bricks-per-process
      cluster.max-bricks-per-process 250
  7. 在具有 oc 客户端的节点上执行以下命令,以删除 gluster pod:

    # oc delete pod <gluster_pod_name>
  8. 要验证 pod 是否已就绪,请执行以下命令:

    # oc get pods -l glusterfs=storage-pod
  9. 登录托管 pod 的节点,再检查 /dev/log 的 selinux 标签

    # ls -lZ /dev/log

    输出应该显示 devlog_t 标签

    例如:

    #  ls -lZ /dev/log
    srw-rw-rw-. root root system_u:object_r:devlog_t:s0    /dev/log

    退出节点。

  10. 在 gluster pod 中,检查标签值是否为 devlog_t:

    # oc rsh <gluster_pod_name>
    # ls -lZ /dev/log

    例如:

    #  ls -lZ /dev/log
    srw-rw-rw-. root root system_u:object_r:devlog_t:s0    /dev/log
  11. 为其他 pod 执行这些步骤 4 到 9。

6.1.3. 使用 cns-deploy 升级现有版本

6.1.3.1. 升级 cns-deploy 和 Heketi Server

必须在客户端计算机上执行以下命令。

  1. 执行以下命令来更新 heketi 客户端和 cns-deploy 软件包:

    # yum update cns-deploy -y
    # yum update heketi-client -y
  2. 备份 Heketi 数据库文件

    # heketi-cli db dump > heketi-db-dump-$(date -I).json
    • 执行以下命令以获取当前的 HEKETI_ADMIN_KEY:

      只要其基础架构不使用,OCS 管理员可以选择为用户密钥设置任何短语。它没有被任何 OCS 默认安装的资源使用。

      oc get secret <heketi-admin-secret> -o jsonpath='{.data.key}'|base64 -d;echo
  3. 执行以下命令来删除 heketi 模板。

    # oc delete templates heketi
  4. 执行以下命令来安装 heketi 模板。

    oc create -f /usr/share/heketi/templates/heketi-template.yaml
    template "heketi" created
  5. 执行以下命令,将 heketi 服务帐户授予必要的特权。

    # oc policy add-role-to-user edit system:serviceaccount:<project_name>:heketi-service-account
    # oc adm policy add-scc-to-user privileged -z heketi-service-account

    例如,

    # oc policy add-role-to-user edit system:serviceaccount:storage-project:heketi-service-account
    # oc adm policy add-scc-to-user privileged -z heketi-service-account
  6. 执行以下命令来生成新的 heketi 配置文件。

    # sed -e "s/\${HEKETI_EXECUTOR}/kubernetes/" -e "s#\${HEKETI_FSTAB}#/var/lib/heketi/fstab#" -e "s/\${SSH_PORT}/22/" -e "s/\${SSH_USER}/root/" -e "s/\${SSH_SUDO}/false/" -e "s/\${BLOCK_HOST_CREATE}/true/" -e "s/\${BLOCK_HOST_SIZE}/500/" "/usr/share/heketi/templates/heketi.json.template" > heketi.json
    • BLOCK_HOST_SIZE 参数控制自动创建的 Red Hat Gluster Storage 卷的大小(以 GB 为单位)用于托管 gluster-block 卷(更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/index#Block_Storage)。此默认配置将动态创建块托管大小为 500GB 的卷,因为需要更多空间。
    • 或者,将 /usr/share/heketi/templates/heketi.json.template 文件复制到当前目录中的 heketi.json,并直接编辑新文件,将每个"${VARIABLE}" 字符串替换为所需参数。

      注意

      JSON 格式严格是必需的(例如,没有结尾的空格、布尔值都为小写)。

  7. 执行以下命令,以创建用于存放配置文件的机密。

    # oc create secret generic <heketi-config-secret> --from-file=heketi.json
    注意

    如果 heketi-config-secret 文件已存在,则删除该文件并运行以下命令:

  8. 执行以下命令删除 heketi 的部署配置、服务和路由:

    # oc delete deploymentconfig,service,route heketi
    注意

    这些参数的名称可从以下命令的输出结果中引用:

    # oc get all | grep heketi
  9. 编辑 heketi 模板。

    • 编辑 HEKETI_USER_KEY 和 HEKETI_ADMIN_KEY 参数。

      # oc edit template heketi
      parameters:
      - description: Set secret for those creating volumes as type user
        displayName: Heketi User Secret
        name: HEKETI_USER_KEY
        value: <heketiuserkey>
      - description: Set secret for administration of the Heketi service as user admin
        displayName: Heketi Administrator Secret
        name: HEKETI_ADMIN_KEY
        value: <adminkey>
      - description: Set the executor type, kubernetes or ssh
        displayName: heketi executor type
        name: HEKETI_EXECUTOR
        value: kubernetes
      - description: Set the hostname for the route URL
        displayName: heketi route name
        name: HEKETI_ROUTE
        value: heketi-storage
      - displayName: heketi container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-volmanager-rhel7
      - displayName: heketi container image version
        name: IMAGE_VERSION
        required: true
        value: v3.11.8
      - description: A unique name to identify this heketi service, useful for running
          multiple heketi instances
        displayName: GlusterFS cluster name
        name: CLUSTER_NAME
        value: storage
      注意

      如果集群有超过 1000 个卷,请参阅 如何更改 Openshift Container Storage 的默认 PVS 限制 ,并在进行升级前添加必要的参数。

    • 添加名为 HEKETI_LVM_WRAPPER 且值为 /usr/sbin/exec-on-host 的 ENV。

      - description: Heketi can use a wrapper to execute LVM commands, i.e. run commands
      in the host namespace instead of in the Gluster container.
      displayName: Wrapper for executing LVM commands
      name: HEKETI_LVM_WRAPPER
      value: /usr/sbin/exec-on-host
    • 添加一个名为 HEKETI_DEBUG_UMOUNT_FAILURES,值为 true 的 ENV。

      - description: When unmounting a brick fails, Heketi will not be able to cleanup the
      Gluster volume completely. The main causes for preventing to unmount a brick,
      seem to originate from Gluster processes. By enabling this option, the heketi.log
      will contain the output of 'lsof' to aid with debugging of the Gluster processes
      and help with identifying any files that may be left open.
      displayName: Capture more details in case brick unmounting fails
      name: HEKETI_DEBUG_UMOUNT_FAILURES
      required=true
    • 添加一个带有名为 HEKETI_CLI_USER,值为 admin 的 ENV。
    • 添加名为 HEKETI_CLI_KEY 以及为 ENV HEKETI_ADMIN_KEY 提供的相同值的 ENV。
    • 根据您要升级到的版本,将 IMAGE_VERSION 中的替换为 v3.11.5v3.11.8

      - displayName: heketi container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-volmanager-rhel7
      - displayName: heketi container image version
        name: IMAGE_VERSION
        required: true
        value: v3.11.8
  10. 执行以下命令来部署用于为 OpenShift 创建持久性卷的 Heketi 服务、路由和部署配置:

    # oc process heketi | oc create -f -
    
      service "heketi" created
      route "heketi" created
    deploymentconfig "heketi" created
    注意

    建议为数据库工作负载调整 heketidbstorage 卷。新安装的 Openshift Container Storage 部署会自动调整 heketidbstorage 卷。对于旧的部署,请按照 KCS 文章 规划在 Openshift Container Storage 上运行容器化 DB 或 nosql 工作负载? 并为卷 heketidbstorage 执行卷设置操作。

  11. 执行以下命令来验证容器是否正在运行:

    # oc get pods

    例如:

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    heketi-storage-4-9fnvz                        2/2       Running   0          8d

6.1.3.2. 升级 Red Hat Gluster Storage Pod

必须在客户端计算机上执行以下命令。

以下是为 glusterfs 更新 DaemonSet 的步骤:

  1. 执行以下步骤停止 Heketi pod,以防止它接受任何新卷创建或卷删除请求:

    1. 执行以下命令访问项目:

      # oc project <project_name>

      例如:

      # oc project storage-project
    2. 执行以下命令以获取 DeploymentConfig

      # oc get ds
    3. 执行以下命令,将 heketi 服务器设置为仅接受来自 local-client 的请求:

      # heketi-cli server mode set local-client
    4. 等待持续操作完成,并执行以下命令来监控是否有持续操作:

      # heketi-cli server operations info
    5. 执行以下命令,将副本数从 1 减少为 0。这会关闭 heketi pod:

      # oc scale dc <heketi_dc> --replicas=0
    6. 执行以下命令来验证 heketi pod 不再存在:

      # oc get pods
  2. 执行以下命令查找 gluster 的 DaemonSet 名称

    # oc get ds
  3. 执行以下命令删除 DaemonSet:

    # oc delete ds <ds-name> --cascade=false

    在删除旧 DaemonSet 时,使用 --cascade=false 选项不会删除 gluster pod,而是只删除 DaemonSet。删除旧的 DaemonSet 后,您必须加载新的 DaemonSet。手动删除旧 pod 时,所创建的新 pod 将具有新 DaemonSet 的配置。

    例如,

    # oc delete ds glusterfs --cascade=false
    daemonset "glusterfs" deleted
  4. 执行以下命令验证所有旧的 pod 是否都正常运行:

    # oc get pods

    例如,

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d
  5. 执行以下命令,以删除旧的 glusterfs 模板。

    # oc delete templates glusterfs

    例如,

    # oc delete templates glusterfs
    template “glusterfs” deleted
  6. 执行以下命令以注册新的 glusterfs 模板。

    # oc create -f /usr/share/heketi/templates/glusterfs-template.yaml

    例如,

    # oc create -f /usr/share/heketi/templates/glusterfs-template.yaml
      template “glusterfs” created
  7. 标记具有 Red Hat Gluster Storage pod 的所有 OpenShift Container Platform 节点:

    1. 使用以下命令检查是否使用适当的标签标记节点:

      # oc get nodes -l glusterfs=storage-host
  8. 编辑 glusterfs 模板。

    • 执行以下命令:

      # oc edit template glusterfs
    • 在卷挂载下添加以下行:

       - name: kernel-modules
         mountPath: "/usr/lib/modules"
         readOnly: true
       - name: host-rootfs
         mountPath: "/rootfs"
    • 在卷下添加以下行:

       - name: kernel-modules
         hostPath:
         path: "/usr/lib/modules"
       - name: host-rootfs
         hostPath:
         path: "/"
    • 根据您要升级到的版本,将 IMAGE_VERSION 中的替换为 v3.11.5v3.11.8

      - displayName: heketi container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-volmanager-rhel7
      - displayName: heketi container image version
        name: IMAGE_VERSION
        required: true
        value: v3.11.8
  9. 执行以下命令来创建 gluster DaemonSet:

    # oc process glusterfs | oc create -f -

    例如,

    # oc process glusterfs | oc create -f -
    Deamonset “glusterfs” created
    注意

    如果集群有超过 1000 个卷,请参阅 如何更改 Openshift Container Storage 的默认 PVS 限制 ,并在进行升级前添加必要的参数。

  10. 执行以下命令来标识需要删除的旧 gluster pod:

    # oc get pods

    例如,

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d
  11. 执行以下命令并确保 brick 不超过 90%:

    # df -kh | grep -v ^Filesystem | awk '{if(int($5)>90) print $0}'
    注意

    如果 brick 接近 100% 利用率,则这些 brick 的逻辑卷管理器(LVM)激活可能需要很长时间,或者在 pod 或节点重启后可能会卡住。建议关闭该 brick 的利用率或扩展使用逻辑卷(LV)的物理卷。

    注意

    df 命令不适用于属于块卷(BHV)的 brick。在 BHV 上,由 df 命令生成的 brick 的 used 大小是该 Gluster 卷的 blockvolumes 添加的大小,它不是 blockvolumes 中驻留的数据量。如需更多信息,请参阅 Openshift Container Storage 中如何识别块卷和块卷

  12. 执行以下命令以删除旧的 gluster pod。Gluster pod 应该遵循滚动升级。因此,您必须确保新 pod 正在运行,然后才能删除下一个旧的 gluster pod。我们支持 OnDelete Strategy DaemonSet 更新策略。使用 OnDelete Strategy 更新策略时,只有在您手动删除旧的 DaemonSet pod 时,才会创建新的 DaemonSet pod。

    1. 要删除旧的 gluster pod,请执行以下命令:

      # oc delete pod <gluster_pod>

      例如,

      # oc delete pod glusterfs-0vcf3
      pod  “glusterfs-0vcf3” deleted
      注意

      在删除下一个 pod 之前,必须进行自我修复检查:

      1. 运行以下命令访问 gluster pod 上的 shell:

        # oc rsh <gluster_pod_name>
      2. 运行以下命令检查所有卷的自我修复状态:

        # for eachVolume in $(gluster volume list);  do gluster volume heal $eachVolume info ;  done | grep "Number of entries: [^0]$"
    2. 删除 pod 命令将终止旧的 pod 并创建一个新 pod。运行 # oc get pods -w 并检查 pod 的 Age,并且 READY 状态应当为 1/1。以下是显示从终止到创建 pod 的终止的状态进度的输出。

      # oc get pods -w
        NAME                             READY     STATUS        RESTARTS   AGE
        glusterfs-0vcf3                  1/1       Terminating   0          3d
      …
  13. 执行以下命令来验证 pod 是否正在运行:

    # oc get pods

    例如,

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d
  14. 执行以下命令来验证是否将 pod 升级到最新版本:

    # oc rsh <gluster_pod_name> glusterd --version

    例如:

     # oc rsh glusterfs-4cpcc glusterd --version
    glusterfs 6.0
  15. 在其中一个 gluster pod 上执行以下命令,以检查 Red Hat Gluster Storage op-version:

    # gluster vol get all cluster.op-version
  16. 升级 Gluster pod 后,请确保将 Heketi 设置为运营模式:

    • 扩展 DC(部署配置)。

      # oc scale dc <heketi_dc> --replicas=1
  17. 在任意 pod 中将 cluster.op-version 设置为 70200:

    重要

    在更改 cluster.op-version 前,确保所有 gluster pod 都已更新。

    # gluster --timeout=3600 volume set all cluster.op-version 70200
    • 执行以下步骤在所有卷上启用 server.tcp-user-timeout。

      注意

      "server.tcp-user-timeout" 选项指定从应用传输的最大时间(以秒为单位)。

      它用于检测强制断开连接和死连接(如果意外关闭,防火墙会被提前激活,等等),并使应用程序能够减少整体故障转移时间。

      1. 使用以下命令列出 glusterfs pod:

        # oc get pods

        例如:

        # oc get pods
        NAME                                          READY     STATUS    RESTARTS   AGE
        glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
        glusterfs-storage-5thpc                       1/1       Running   0          9d
        glusterfs-storage-hfttr                       1/1       Running   0          9d
        glusterfs-storage-n8rg5                       1/1       Running   0          9d
        heketi-storage-4-9fnvz                        2/2       Running   0          8d
      2. 远程 shell 到其中一个 glusterfs pod。例如:

        # oc rsh glusterfs-0vcf3
      3. 执行以下命令:

        # for eachVolume in `gluster volume list`; do echo $eachVolume; gluster volume set $eachVolume server.tcp-user-timeout 42 ; done

        例如:

        # for eachVolume in `gluster volume list`; do echo $eachVolume; gluster volume set $eachVolume server.tcp-user-timeout 42 ; done
          volume1
          volume set: success
          volume2
        volume set: success
  18. 如果 gluster-block-provisoner-pod 已经存在,则执行以下命令来删除它:

    # oc delete dc glusterblock-provisioner-dc

    例如:

    # oc delete dc glusterblock-storage-provisioner-dc
  19. 从旧 pod 中删除以下资源:

    # oc delete clusterroles.authorization.openshift.io glusterblock-provisioner-runner
    # oc delete serviceaccounts glusterblock-provisioner
    serviceaccount "glusterblock-provisioner" deleted
    # oc delete clusterrolebindings.authorization.openshift.io glusterblock-provisioner
  20. 执行以下命令来部署 gluster-block 置备程序:

    `sed -e 's/${NAMESPACE}/<NAMESPACE>/' /usr/share/heketi/templates/glusterblock-provisioner.yaml | sed -e 's/<VERSION>/<NEW-VERSION>/' | oc create -f -
    <VERSION>
    现有 OpenShift Container Storage 版本。
    <NEW-VERSION>

    取决于您要升级到的版本,是 3.11.5 或 3.11.8。

    # oc adm policy add-cluster-role-to-user glusterblock-provisioner-runner system:serviceaccount:<NAMESPACE>:glusterblock-provisioner

    例如:

    `sed -e 's/${NAMESPACE}/storage-project/' /usr/share/heketi/templates/glusterblock-provisioner.yaml | sed -e 's/3.11.4/3.11.8/' | oc create -f -
    # oc adm policy add-cluster-role-to-user glusterblock-provisioner-runner system:serviceaccount:storage-project:glusterblock-provisioner
  21. Brick 多路是一个功能,允许在一个进程中添加多个 brick。这可以减少资源消耗,并允许我们运行超过相同内存消耗的 brick 数。从 Container-Native Storage 3.6 点启用它。在从 Container-Native Storage 3.10 升级到 Red Hat Openshift Container Storage 3.11 的过程中,要打开 brick 多路,请执行以下命令:

    1. 要执行到 Gluster pod 中,请执行以下命令以及 rsh 到 gluster pod:

      # oc rsh <gluster_pod_name>
    2. 验证 brick 多路状态:

      # gluster v get all all
    3. 如果被禁用,则执行以下命令以启用 brick 多路:

      注意

      确保所有卷都处于 stop 状态,或者没有在启用了 brick 多路的情况下运行任何 brick。

      # gluster volume set all cluster.brick-multiplex on

      例如:

      # oc rsh glusterfs-770ql
      
        sh-4.2# gluster volume set all cluster.brick-multiplex on
        Brick-multiplexing is supported only for container workloads (Independent or Converged mode). Also it is advised to make sure that either all volumes are in stopped state or no bricks are running before this option is modified.Do you still want to continue? (y/n) y
      volume set: success
    4. 列出受信存储池中的所有卷。只有在执行卷设置操作时,才需要执行此步骤:

      例如:

      # gluster volume list
      
        heketidbstorage
        vol_194049d2565d2a4ad78ef0483e04711e
        ...
        ...

      重启所有卷。只有在卷集操作和上一步中执行时才需要执行此步骤:

      # gluster vol stop <VOLNAME>
      # gluster vol start <VOLNAME>
  22. 在 Red Hat Openshift Container Storage 中对 S3 兼容对象存储的支持处于技术预览阶段。要启用 S3 兼容对象存储,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html/operations_guide/s3_object_store
注意

6.1.4. 使用 Ansible 升级现有版本

6.1.4.1. 升级 Heketi Server

必须在客户端计算机上执行以下命令。

  1. 执行以下步骤检查所有待处理的 Heketi operatons:

    1. 执行以下命令访问项目:

      # oc project <project_name>

      例如:

      # oc project storage-project
    2. 等待持续操作完成,并执行以下命令来监控是否有持续操作:

      # heketi-cli server operations info
  2. 备份 Heketi 数据库文件。

    # heketi-cli db dump > heketi-db-dump-$(date -I).json
    注意

    创建的 json 文件可用于恢复,因此应存储在您选择的持久性存储中。

  3. 执行以下命令来更新 heketi 客户端软件包。更新其安装的所有 OCP 节点上的 heketi-client 软件包。较新的安装可能没有在任何 OCP 节点上安装了 heketi-client rpm:

    # yum update heketi-client -y
  4. 执行以下命令以获取当前的 HEKETI_ADMIN_KEY:

    只要其基础架构不使用,OCS 管理员可以选择为用户密钥设置任何短语。它没有被任何 OCS 默认安装的资源使用。

    # oc get secret heketi-storage-admin-secret -o jsonpath='{.data.key}'|base64 -d;echo
  5. 如果之前设置了 HEKETI_USER_KEY,您可以使用以下命令获取它:

    # oc describe pod <heketi-pod>
  6. 执行以下命令来删除 heketi 模板。

    # oc delete templates heketi
  7. 执行以下命令来安装 heketi 模板。

    # oc create -f /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/heketi-template.yml
    template "heketi" created
  8. 执行以下步骤编辑模板:

    # oc get templates
    NAME			  DESCRIPTION		     PARAMETERS		OBJECTS
    glusterblock-provisioner  glusterblock provisioner   3 (2 blank)	4
    			  template
    glusterfs		  GlusterFS DaemonSet 	     5 (1 blank)	1
    			  template
    heketi			  Heketi service deployment  7 (3 blank)	3
    template
    1. 如果现有模板的 IMAGE_NAME 和 IMAGE_VERSION 为两个参数,请编辑模板以更改 HEKETI_USER_KEY、HEKETI_ADMIN_KEY、HEKETI_ROUTE、IMAGE_NAME、IMAGE_VERSION、CLUSTER_NAME 和 HEKETI_LVM_RAPPER,如下例所示。

      # oc edit template heketi
      parameters:
        - description: Set secret for those creating volumes as type user
        displayName: Heketi User Secret
        name: HEKETI_USER_KEY
        value: <heketiuserkey>
        - description: Set secret for administration of the Heketi service as user admin
        displayName: Heketi Administrator Secret
        name: HEKETI_ADMIN_KEY
        value: <adminkey>
        - description: Set the executor type, kubernetes or ssh
        displayName: heketi executor type
        name: HEKETI_EXECUTOR
        value: kubernetes
        - description: Set the hostname for the route URL
        displayName: heketi route name
        name: HEKETI_ROUTE
        value: heketi-storage
        - displayName: heketi container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-volmanager-rhel7
        - displayName: heketi container image version
        name: IMAGE_VERSION
        required: true
        value: v3.11.8
        - description: A unique name to identify this heketi service, useful for running
        multiple heketi instances
        displayName: GlusterFS cluster name
        name: CLUSTER_NAME
        value: storage
        - description: Heketi can use a wrapper to execute LVM commands, i.e. run commands in the host namespace instead of in the Gluster container
        name: HEKETI_LVM_WRAPPER
        displayName: Wrapper for executing LVM commands
        value: /usr/sbin/exec-on-host
    2. 如果模板只有 IMAGE_NAME,则编辑模板以更改 HEKETI_USER_KEY、HEKETI_ADMIN_KEY、HEKETI_ROUTE、IMAGE_NAME、CLUSTER_NAME 和 HEKETI_LVM_WRAPPER,如下例所示。

      # oc edit template heketi
      parameters:
      - description: Set secret for those creating volumes as type user
        displayName: Heketi User Secret
        name: HEKETI_USER_KEY
        value: <heketiuserkey>
      - description: Set secret for administration of the Heketi service as user admin
        displayName: Heketi Administrator Secret
        name: HEKETI_ADMIN_KEY
        value: <adminkey>
      - description: Set the executor type, kubernetes or ssh
        displayName: heketi executor type
        name: HEKETI_EXECUTOR
        value: kubernetes
      - description: Set the hostname for the route URL
        displayName: heketi route name
        name: HEKETI_ROUTE
        value: heketi-storage
      - displayName: heketi container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-volmanager-rhel7:v3.11.8
      - description: A unique name to identify this heketi service, useful for running
         multiple heketi instances
        displayName: GlusterFS cluster name
        name: CLUSTER_NAME
        value: storage
      - description: Heketi can use a wrapper to execute LVM commands, i.e. run commands in the host namespace instead of in the Gluster container
        name: HEKETI_LVM_WRAPPER
        displayName: Wrapper for executing LVM commands
        value: /usr/sbin/exec-on-host
      注意

      如果集群有超过 1000 个卷,请参阅 如何更改 Openshift Container Storage 的默认 PVS 限制 ,并在进行升级前添加必要的参数。

  9. 执行以下命令删除 heketi 的部署配置、服务和路由:

    注意

    这些参数的名称可从以下命令的输出结果中引用:

    # oc get all | grep heketi
    # oc delete deploymentconfig,service,route heketi-storage
  10. 执行以下命令来部署用于为 OpenShift 创建持久性卷的 Heketi 服务、路由和部署配置:

    # oc process heketi | oc create -f -
    
    service "heketi" created
    route "heketi" created
    deploymentconfig "heketi" created
    注意

    建议为数据库工作负载调整 heketidbstorage 卷。新安装的 Openshift Container Storage 部署会自动调整 heketidbstorage 卷。对于旧的部署,请按照 KCS 文章 规划在 Openshift Container Storage 上运行容器化 DB 或 nosql 工作负载? 并为卷 heketidbstorage 执行卷设置操作。

  11. 执行以下命令来验证容器是否正在运行:

    # oc get pods

    例如:

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d

6.1.4.2. 升级 Red Hat Gluster Storage Pod

必须在客户端计算机上执行以下命令。

以下是为 glusterfs 更新 DaemonSet 的步骤:

  1. 执行以下步骤停止 Heketi pod,以防止它接受任何新卷创建或卷删除请求:

    1. 执行以下命令访问项目:

      # oc project <project_name>

      例如:

      # oc project storage-project
    2. 执行以下命令以获取 DeploymentConfig

      # oc get dc
    3. 执行以下命令,将 heketi 服务器设置为仅接受来自 local-client 的请求:

      # heketi-cli server mode set local-client
    4. 等待持续操作完成,并执行以下命令来监控是否有持续操作:

      # heketi-cli server operations info
    5. 执行以下命令,将副本数从 1 减少为 0。这会关闭 heketi pod:

      # oc scale dc <heketi_dc> --replicas=0
    6. 执行以下命令来验证 heketi pod 不再存在:

      # oc get pods
  2. 执行以下命令查找 gluster 的 DaemonSet 名称

    # oc get ds
  3. 执行以下命令删除 DaemonSet:

    # oc delete ds <ds-name> --cascade=false

    在删除旧 DaemonSet 时,使用 --cascade=false 选项不会删除 gluster pod,而是只删除 DaemonSet。删除旧的 DaemonSet 后,您必须加载新的 DaemonSet。手动删除旧 pod 时,所创建的新 pod 将具有新 DaemonSet 的配置。

    例如,

    # oc delete ds glusterfs-storage --cascade=false
    daemonset "glusterfs-storage" deleted
  4. 执行以下命令验证所有旧的 pod 是否都正常运行:

    # oc get pods

    例如,

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d
  5. 执行以下命令,以删除旧的 glusterfs 模板。

    # oc delete templates glusterfs
  6. 执行以下命令以注册新的 glusterfs 模板。

    # oc create -f /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/glusterfs-template.yml
    template "glusterfs" created
  7. 执行以下命令来编辑旧的 glusterfs 模板。

    # oc get templates
    NAME			  DESCRIPTION		     PARAMETERS		OBJECTS
    glusterblock-provisioner  glusterblock provisioner   3 (2 blank)	4
            template
    glusterfs		  GlusterFS DaemonSet 	     5 (1 blank)	1
            template
    heketi			  Heketi service deployment  7 (3 blank)	3
    template
    1. 如果模板包含 IMAGE_NAME 和 IMAGE_VERSION,则按以下方式更新 glusterfs 模板:例如:

      # oc edit template glusterfs
      - displayName: GlusterFS container image name
      	  name: IMAGE_NAME
      	  required: true
      	  value: registry.redhat.io/rhgs3/rhgs-server-rhel7
      - displayName: GlusterFS container image version
      	  name: IMAGE_VERSION
      	  required: true
      	  value: v3.11.8
      - description: A unique name to identify which heketi service manages this cluster, useful for running
           multiple heketi instances
        displayName: GlusterFS cluster name
        name: CLUSTER_NAME
        value: storage
      注意

      如果集群有超过 1000 个卷,请参阅 如何更改 Openshift Container Storage 的默认 PVS 限制 ,并在进行升级前添加必要的参数。

    2. 如果模板只有一个 IMAGE_NAME 作为参数,请按如下所示更新 glusterfs 模板:例如:

      # oc edit template glusterfs
      - displayName: GlusterFS container image name
        name: IMAGE_NAME
        required: true
        value: registry.redhat.io/rhgs3/rhgs-server-rhel7:v3.11.8
      - description: A unique name to identify which heketi service manages this cluster, useful for running
           multiple heketi instances
        displayName: GlusterFS cluster name
        name: CLUSTER_NAME
      value: storage
      注意

      确保 CLUSTER_NAME 变量设置为正确的值

  8. 标记具有 Red Hat Gluster Storage pod 的所有 OpenShift Container Platform 节点:

    1. 使用以下命令检查是否使用适当的标签标记节点:

      # oc get nodes -l glusterfs=storage-host
  9. 执行以下命令来创建 gluster DaemonSet:

    # oc process glusterfs | oc create -f -

    例如,

    # oc process glusterfs | oc create -f -
    Deamonset “glusterfs” created
    • 执行以下命令来标识需要删除的旧 gluster pod:

      # oc get pods

      例如,

      # oc get pods
      NAME                                          READY     STATUS    RESTARTS   AGE
      glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
      glusterfs-storage-5thpc                       1/1       Running   0          9d
      glusterfs-storage-hfttr                       1/1       Running   0          9d
      glusterfs-storage-n8rg5                       1/1       Running   0          9d
      heketi-storage-4-9fnvz                        2/2       Running   0          8d
  10. 执行以下命令并确保 brick 不超过 90%:

    # df -kh | grep -v ^Filesystem | awk '{if(int($5)>90) print $0}'
    注意

    如果 brick 接近 100% 利用率,则这些 brick 的逻辑卷管理器(LVM)激活可能需要很长时间,或者在 pod 或节点重启后可能会卡住。建议关闭该 brick 的利用率或扩展使用逻辑卷(LV)的物理卷。

    注意

    df 命令不适用于属于块卷(BHV)的 brick。在 BHV 上,由 df 命令生成的 brick 的 used 大小是该 Gluster 卷的 blockvolumes 添加的大小,它不是 blockvolumes 中驻留的数据量。如需更多信息,请参阅 Openshift Container Storage 中如何识别块卷和块卷

  11. 执行以下命令以删除旧的 gluster pod。Gluster pod 应该遵循滚动升级。因此,您必须确保新 pod 正在运行,然后才能删除下一个旧的 gluster pod。我们支持 OnDelete Strategy DaemonSet 更新策略。使用 OnDelete Strategy 更新策略时,只有在您手动删除旧的 DaemonSet pod 时,才会创建新的 DaemonSet pod。

    1. 要删除旧的 gluster pod,请执行以下命令:

      # oc delete pod <gluster_pod>

      例如,

      # oc delete pod glusterfs-0vcf3
      pod  “glusterfs-0vcf3” deleted
      注意

      在删除下一个 pod 之前,必须进行自我修复检查:

      1. 运行以下命令访问 gluster pod 上的 shell:

        # oc rsh <gluster_pod_name>
      2. 运行以下命令检查所有卷的自我修复状态:

        # for eachVolume in $(gluster volume list);  do gluster volume heal $eachVolume info ;  done | grep "Number of entries: [^0]$"
    2. 删除 pod 命令将终止旧的 pod 并创建一个新 pod。运行 # oc get pods -w 并检查 pod 的 Age,并且 READY 状态应当为 1/1。以下是显示从终止到创建 pod 的终止的状态进度的输出。

      # oc get pods -w
      NAME                             READY     STATUS        RESTARTS   AGE
      glusterfs-0vcf3                  1/1       Terminating   0          3d
      …
  12. 执行以下命令来验证 pod 是否正在运行:

    # oc get pods

    例如,

    # oc get pods
    NAME                                          READY     STATUS    RESTARTS   AGE
    glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
    glusterfs-storage-5thpc                       1/1       Running   0          9d
    glusterfs-storage-hfttr                       1/1       Running   0          9d
    glusterfs-storage-n8rg5                       1/1       Running   0          9d
    heketi-storage-4-9fnvz                        2/2       Running   0          8d
  13. 执行以下命令来验证是否将 pod 升级到最新版本:

    # oc rsh <gluster_pod_name> glusterd --version

    例如:

    # oc rsh glusterfs-4cpcc glusterd --version
    glusterfs 6.0
  14. 在其中一个 gluster pod 上执行以下命令,以检查 Red Hat Gluster Storage op-version:

    # gluster vol get all cluster.op-version
  15. 升级 Gluster pod 后,请确保将 Heketi 设置为运营模式:

    • 扩展 DC(部署配置)。

      # oc scale dc <heketi_dc> --replicas=1
  16. 在任意 pod 中将 cluster.op-version 设置为 70200:

    注意

    在更改 cluster.op-version 前,确保所有 gluster pod 都已更新。

    # gluster --timeout=3600 volume set all cluster.op-version 70200
  17. 执行以下步骤在所有卷上启用 server.tcp-user-timeout。

    注意

    "server.tcp-user-timeout" 选项指定从应用传输的最大时间(以秒为单位)。

    它用于检测强制断开连接和死连接(如果意外关闭,防火墙会被提前激活,等等),并使应用程序能够减少整体故障转移时间。

    1. 使用以下命令列出 glusterfs pod:

      # oc get pods

      例如:

      # oc get pods
      NAME                                          READY     STATUS    RESTARTS   AGE
      glusterblock-storage-provisioner-dc-1-ffgs5   1/1       Running   0          3m
      glusterfs-storage-5thpc                       1/1       Running   0          9d
      glusterfs-storage-hfttr                       1/1       Running   0          9d
      glusterfs-storage-n8rg5                       1/1       Running   0          9d
      heketi-storage-4-9fnvz                        2/2       Running   0          8d
    2. 远程 shell 到其中一个 glusterfs pod。例如:

      # oc rsh glusterfs-0vcf3
    3. 执行以下命令:

      # for eachVolume in `gluster volume list`; do echo $eachVolume; gluster volume set $eachVolume server.tcp-user-timeout 42 ; done

      例如:

      # for eachVolume in `gluster volume list`; do echo $eachVolume; gluster volume set $eachVolume server.tcp-user-timeout 42 ; done
          volume1
          volume set: success
          volume2
      volume set: success
  18. 如果 gluster-block-provisoner-pod 已经存在,则执行以下命令来删除它:

    # oc delete dc glusterblock-provisioner-dc

    例如:

    # oc delete dc glusterblock-storage-provisioner-dc
  19. 执行以下命令,以删除旧的 glusterblock provisioner 模板。

     # oc delete templates glusterblock-provisioner
  20. 创建 glusterblock provisioner 模板。例如:

    # oc create -f /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/glusterblock-provisioner.yml
    template.template.openshift.io/glusterblock-provisioner created
  21. 根据 OCP 版本,编辑 glusterblock-provisioner 模板,以更改 IMAGE_NAME、IMAGE_VERSION 和 NAMESPACE。

    # oc get templates
    NAME			  DESCRIPTION		     PARAMETERS		OBJECTS
    glusterblock-provisioner  glusterblock provisioner   3 (2 blank)	4
            template
    glusterfs		  GlusterFS DaemonSet 	     5 (1 blank)	1
            template
    heketi			  Heketi service deployment  7 (3 blank)	3
    template
    1. 如果模板包含 IMAGE_NAME 和 IMAGE_VERSION,则按如下所示更新 glusterblock-provisioner 模板:例如:

      # oc edit template glusterblock-provisioner
      - displayName: glusterblock provisioner container image name
      name: IMAGE_NAME
      required: true
      value: registry.redhat.io/rhgs3/rhgs-gluster-block-prov-rhel7
      - displayName: glusterblock provisioner container image version
      name: IMAGE_VERSION
      required: true
      value: v3.11.8
      - description: The namespace in which these resources are being created
      displayName: glusterblock provisioner namespace
      name: NAMESPACE
      required: true
      value: glusterfs
      - description: A unique name to identify which heketi service manages this cluster,
        useful for running multiple heketi instances
      displayName: GlusterFS cluster name
      name: CLUSTER_NAME
      value: storage
    2. 如果模板只有一个 IMAGE_NAME 作为参数,请按如下所示更新 glusterblock-provisioner 模板:例如:

      # oc edit template glusterblock-provisioner
      - displayName: glusterblock provisioner container image name
      name: IMAGE_NAME
      required: true
      value: registry.redhat.io/rhgs3/rhgs-gluster-block-prov-rhel7:v3.11.8
      - description: The namespace in which these resources are being created
      displayName: glusterblock provisioner namespace
      name: NAMESPACE
      required: true
      value: glusterfs
      - description: A unique name to identify which heketi service manages this cluster,
                  useful for running multiple heketi instances
      displayName: GlusterFS cluster name
      name: CLUSTER_NAME
      value: storage
  22. 从旧 pod 中删除以下资源

    # oc delete clusterroles.authorization.openshift.io glusterblock-provisioner-runner
    # oc delete serviceaccounts glusterblock-storage-provisioner
    # oc delete clusterrolebindings.authorization.openshift.io glusterblock-storage-provisioner
  23. 在运行 oc process 前,请确定正确的置备程序名称。如果集群中有多个 gluster 块置备程序,该名称必须与所有其他 置备程序 不同。
    例如,

    • 如果名称应该为 gluster.org/glusterblock-<namespace>,则命名空间将被部署置备程序的命名空间替换。
    • 如果只有一个置备程序,在 3.11.8 之前安装,gluster.org/glusterblock 就足够。如果当前使用的名称已经有唯一的命名空间后缀,则重复利用现有名称。
  24. 编辑模板后,执行以下命令创建部署配置:

    # oc process glusterblock-provisioner -o yaml | oc create -f -

    例如:

    # oc process glusterblock-provisioner -o yaml | oc create -f -
    clusterrole.authorization.openshift.io/glusterblock-provisioner-runner created
    serviceaccount/glusterblock-storage-provisioner created
    clusterrolebinding.authorization.openshift.io/glusterblock-storage-provisioner created
    deploymentconfig.apps.openshift.io/glusterblock-storage-provisioner-dc created
  25. Brick 多路是一个功能,允许在一个进程中添加多个 brick。这可以减少资源消耗,并允许我们运行超过相同内存消耗的 brick 数。从 Container-Native Storage 3.6 点启用它。在从 Container-Native Storage 3.10 升级到 Red Hat Openshift Container Storage 3.11 的过程中,要打开 brick 多路,请执行以下命令:

    1. 要执行到 Gluster pod 中,请执行以下命令以及 rsh 到 gluster pod:

      # oc rsh <gluster_pod_name>
    2. 验证 brick 多路状态:

      # gluster v get all all
    3. 如果被禁用,则执行以下命令以启用 brick 多路:

      注意

      确保所有卷都处于 stop 状态,或者没有在启用了 brick 多路的情况下运行任何 brick。

      # gluster volume set all cluster.brick-multiplex on

      例如:

      # oc rsh glusterfs-770ql
      sh-4.2# gluster volume set all cluster.brick-multiplex on
      Brick-multiplexing is supported only for container workloads (Independent or Converged mode). Also it is advised to make sure that either all volumes are in stopped state or no bricks are running before this option is modified.Do you still want to continue? (y/n) y
      volume set: success
    4. 列出受信存储池中的所有卷。只有在执行卷设置操作时,才需要执行此步骤:

      例如:

      # gluster volume list
      
      heketidbstorage
      vol_194049d2565d2a4ad78ef0483e04711e
      ...
      ...

      重启所有卷。只有在卷集操作和上一步中执行时才需要执行此步骤:

      # gluster vol stop <VOLNAME>
      # gluster vol start <VOLNAME>
  26. 在 Red Hat Openshift Container Storage 中对 S3 兼容对象存储的支持处于技术预览阶段。要启用 S3 兼容对象存储,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html/operations_guide/s3_object_store

    注意
  27. 使用 gluster 块卷置备的所有存储类必须与集群中的一个置备程序名称完全匹配。要检查在给定命名空间中引用块置备程序的存储类列表,请运行以下命令:

    # oc get sc -o custom-columns=NAME:.metadata.name,PROV:.provisioner,RSNS:.parameters.restsecretnamespace | grep 'gluster.org/glusterblock' | grep <namespace>

    例如:

    # oc get sc -o custom-columns=NAME:.metadata.name,PROV:.provisioner,RSNS:.parameters.restsecretnamespace | grep 'gluster.org/glusterblock' | grep app-storage
    glusterfs-storage-block   gluster.org/glusterblock-app-storage   app-storage

    如果每个存储类置备程序名称,如果它与为那个命名空间配置的块置备程序名称不匹配,则需要更新它。如果 块置备程序 名称已 与配置的置备程序 名称匹配,则不需要进行任何其他操作。使用上面生成的列表,并包括必须更新指定名称的所有存储类名称。
    对于此列表中的每个存储类,请执行以下操作:

    # oc get sc  -o yaml <storageclass>  > storageclass-to-edit.yaml
    # oc delete sc  <storageclass>
    # sed 's,gluster.org/glusterblock$,gluster.org/glusterblock-<namespace>,' storageclass-to-edit.yaml | oc create -f -

    例如:

    # oc get sc  -o yaml gluster-storage-block  > storageclass-to-edit.yaml
    # oc delete sc  gluster-storage-block
    # sed 's,gluster.org/glusterblock$,gluster.org/glusterblock-app-storage,' storageclass-to-edit.yaml | oc create -f -