第 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. 先决条件
确保满足以下先决条件:
- 第 3.1.3 节 “Red Hat OpenShift Container Platform 和 Red Hat Openshift Container Storage 要求”
- 确保具有 Red Hat Gluster Storage Server 和 Red Hat Openshift Container Storage 支持的 OpenShift Container Platform 版本。有关支持的版本的更多信息,请参阅。 第 3.1.1 节 “支持的版本”
确保运行以下命令来获取最新版本的 Ansible 模板。
# yum update openshift-ansible
对于使用 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 标签,请执行以下命令:
在运行 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
编辑 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
在运行 gluster pod 的所有节点上运行以下命令。这将重置标签:
# restorecon /dev/log
执行以下命令检查所有卷的自我修复状态:
# 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]$"
等待自我修复完成。
执行以下命令并确保 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 中如何识别块卷和块卷。在 gluster pod 中的任何一个节点上执行以下命令,以设置可在
glusterfsd
进程的单一实例上运行的 brick(250)的最大数量:# gluster volume set all cluster.max-bricks-per-process 250
在 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
在具有 oc 客户端的节点上执行以下命令,以删除 gluster pod:
# oc delete pod <gluster_pod_name>
要验证 pod 是否已就绪,请执行以下命令:
# oc get pods -l glusterfs=storage-pod
登录托管 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
退出节点。
在 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
- 为其他 pod 执行这些步骤 4 到 9。
6.1.3. 使用 cns-deploy 升级现有版本
6.1.3.1. 升级 cns-deploy 和 Heketi Server
必须在客户端计算机上执行以下命令。
执行以下命令来更新 heketi 客户端和 cns-deploy 软件包:
# yum update cns-deploy -y # yum update heketi-client -y
备份 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
执行以下命令来删除 heketi 模板。
# oc delete templates heketi
执行以下命令来安装 heketi 模板。
oc create -f /usr/share/heketi/templates/heketi-template.yaml template "heketi" created
执行以下命令,将 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
执行以下命令来生成新的 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 格式严格是必需的(例如,没有结尾的空格、布尔值都为小写)。
-
执行以下命令,以创建用于存放配置文件的机密。
# oc create secret generic <heketi-config-secret> --from-file=heketi.json
注意如果 heketi-config-secret 文件已存在,则删除该文件并运行以下命令:
执行以下命令删除 heketi 的部署配置、服务和路由:
# oc delete deploymentconfig,service,route heketi
注意这些参数的名称可从以下命令的输出结果中引用:
# oc get all | grep heketi
编辑 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.5
或v3.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
执行以下命令来部署用于为 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
执行卷设置操作。执行以下命令来验证容器是否正在运行:
# 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 的步骤:
执行以下步骤停止 Heketi pod,以防止它接受任何新卷创建或卷删除请求:
执行以下命令访问项目:
# oc project <project_name>
例如:
# oc project storage-project
执行以下命令以获取
DeploymentConfig
:# oc get ds
执行以下命令,将 heketi 服务器设置为仅接受来自 local-client 的请求:
# heketi-cli server mode set local-client
等待持续操作完成,并执行以下命令来监控是否有持续操作:
# heketi-cli server operations info
执行以下命令,将副本数从 1 减少为 0。这会关闭 heketi pod:
# oc scale dc <heketi_dc> --replicas=0
执行以下命令来验证 heketi pod 不再存在:
# oc get pods
执行以下命令查找 gluster 的 DaemonSet 名称
# oc get ds
执行以下命令删除 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
执行以下命令验证所有旧的 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
执行以下命令,以删除旧的 glusterfs 模板。
# oc delete templates glusterfs
例如,
# oc delete templates glusterfs template “glusterfs” deleted
执行以下命令以注册新的 glusterfs 模板。
# oc create -f /usr/share/heketi/templates/glusterfs-template.yaml
例如,
# oc create -f /usr/share/heketi/templates/glusterfs-template.yaml template “glusterfs” created
标记具有 Red Hat Gluster Storage pod 的所有 OpenShift Container Platform 节点:
使用以下命令检查是否使用适当的标签标记节点:
# oc get nodes -l glusterfs=storage-host
编辑 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.5
或v3.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
执行以下命令来创建 gluster DaemonSet:
# oc process glusterfs | oc create -f -
例如,
# oc process glusterfs | oc create -f - Deamonset “glusterfs” created
注意如果集群有超过 1000 个卷,请参阅 如何更改 Openshift Container Storage 的默认 PVS 限制 ,并在进行升级前添加必要的参数。
执行以下命令来标识需要删除的旧 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
执行以下命令并确保 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 中如何识别块卷和块卷。执行以下命令以删除旧的 gluster pod。
Gluster pod 应该遵循滚动升级。因此,您必须确保新 pod 正在运行,然后才能删除下一个旧的 gluster pod。我们支持 OnDelete Strategy DaemonSet 更新策略
。使用 OnDelete Strategy 更新策略时,只有在您手动删除旧的 DaemonSet pod 时,才会创建新的 DaemonSet pod。要删除旧的 gluster pod,请执行以下命令:
# oc delete pod <gluster_pod>
例如,
# oc delete pod glusterfs-0vcf3 pod “glusterfs-0vcf3” deleted
注意在删除下一个 pod 之前,必须进行自我修复检查:
运行以下命令访问 gluster pod 上的 shell:
# oc rsh <gluster_pod_name>
运行以下命令检查所有卷的自我修复状态:
# for eachVolume in $(gluster volume list); do gluster volume heal $eachVolume info ; done | grep "Number of entries: [^0]$"
删除 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 …
执行以下命令来验证 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
执行以下命令来验证是否将 pod 升级到最新版本:
# oc rsh <gluster_pod_name> glusterd --version
例如:
# oc rsh glusterfs-4cpcc glusterd --version glusterfs 6.0
在其中一个 gluster pod 上执行以下命令,以检查 Red Hat Gluster Storage op-version:
# gluster vol get all cluster.op-version
升级 Gluster pod 后,请确保将 Heketi 设置为运营模式:
扩展 DC(部署配置)。
# oc scale dc <heketi_dc> --replicas=1
在任意 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" 选项指定从应用传输的最大时间(以秒为单位)。
它用于检测强制断开连接和死连接(如果意外关闭,防火墙会被提前激活,等等),并使应用程序能够减少整体故障转移时间。
使用以下命令列出 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
远程 shell 到其中一个 glusterfs pod。例如:
# oc rsh glusterfs-0vcf3
执行以下命令:
# 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
如果 gluster-block-provisoner-pod 已经存在,则执行以下命令来删除它:
# oc delete dc glusterblock-provisioner-dc
例如:
# oc delete dc glusterblock-storage-provisioner-dc
从旧 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
执行以下命令来部署 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
Brick 多路是一个功能,允许在一个进程中添加多个 brick。这可以减少资源消耗,并允许我们运行超过相同内存消耗的 brick 数。从 Container-Native Storage 3.6 点启用它。在从 Container-Native Storage 3.10 升级到 Red Hat Openshift Container Storage 3.11 的过程中,要打开 brick 多路,请执行以下命令:
要执行到 Gluster pod 中,请执行以下命令以及 rsh 到 gluster pod:
# oc rsh <gluster_pod_name>
验证 brick 多路状态:
# gluster v get all all
如果被禁用,则执行以下命令以启用 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
列出受信存储池中的所有卷。只有在执行卷设置操作时,才需要执行此步骤:
例如:
# gluster volume list heketidbstorage vol_194049d2565d2a4ad78ef0483e04711e ... ...
重启所有卷。只有在卷集操作和上一步中执行时才需要执行此步骤:
# gluster vol stop <VOLNAME> # gluster vol start <VOLNAME>
- 在 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。
- 如果您有 glusterfs registry pod,请执行以下步骤 第 6.2 节 “升级 glusterfs registry 组中的 pod” 中列出的步骤来升级 heketi 和 glusterfs registry pod。
- 如果您没有 glusterfs registry pod,然后执行 第 6.3 节 “启动 Heketi Pod” 中列出的步骤返回您的 heketi pod,然后执行 第 6.4 节 “升级 Red Hat OpenShift Container Platform 节点上的客户端” 中列出的步骤来升级 Red Hat Openshift Container Platform 节点上的客户端。
6.1.4. 使用 Ansible 升级现有版本
6.1.4.1. 升级 Heketi Server
必须在客户端计算机上执行以下命令。
执行以下步骤检查所有待处理的 Heketi operatons:
执行以下命令访问项目:
# oc project <project_name>
例如:
# oc project storage-project
等待持续操作完成,并执行以下命令来监控是否有持续操作:
# heketi-cli server operations info
备份 Heketi 数据库文件。
# heketi-cli db dump > heketi-db-dump-$(date -I).json
注意创建的 json 文件可用于恢复,因此应存储在您选择的持久性存储中。
执行以下命令来更新 heketi 客户端软件包。更新其安装的所有 OCP 节点上的
heketi-client
软件包。较新的安装可能没有在任何 OCP 节点上安装了heketi-client
rpm:# yum update heketi-client -y
执行以下命令以获取当前的 HEKETI_ADMIN_KEY:
只要其基础架构不使用,OCS 管理员可以选择为用户密钥设置任何短语。它没有被任何 OCS 默认安装的资源使用。
# oc get secret heketi-storage-admin-secret -o jsonpath='{.data.key}'|base64 -d;echo
如果之前设置了
HEKETI_USER_KEY
,您可以使用以下命令获取它:# oc describe pod <heketi-pod>
执行以下命令来删除 heketi 模板。
# oc delete templates heketi
执行以下命令来安装 heketi 模板。
# oc create -f /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/heketi-template.yml template "heketi" created
执行以下步骤编辑模板:
# 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
如果现有模板的 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
如果模板只有 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 限制 ,并在进行升级前添加必要的参数。
执行以下命令删除 heketi 的部署配置、服务和路由:
注意这些参数的名称可从以下命令的输出结果中引用:
# oc get all | grep heketi
# oc delete deploymentconfig,service,route heketi-storage
执行以下命令来部署用于为 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
执行卷设置操作。执行以下命令来验证容器是否正在运行:
# 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 的步骤:
执行以下步骤停止 Heketi pod,以防止它接受任何新卷创建或卷删除请求:
执行以下命令访问项目:
# oc project <project_name>
例如:
# oc project storage-project
执行以下命令以获取
DeploymentConfig
:# oc get dc
执行以下命令,将 heketi 服务器设置为仅接受来自 local-client 的请求:
# heketi-cli server mode set local-client
等待持续操作完成,并执行以下命令来监控是否有持续操作:
# heketi-cli server operations info
执行以下命令,将副本数从 1 减少为 0。这会关闭 heketi pod:
# oc scale dc <heketi_dc> --replicas=0
执行以下命令来验证 heketi pod 不再存在:
# oc get pods
执行以下命令查找 gluster 的 DaemonSet 名称
# oc get ds
执行以下命令删除 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
执行以下命令验证所有旧的 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
执行以下命令,以删除旧的 glusterfs 模板。
# oc delete templates glusterfs
执行以下命令以注册新的 glusterfs 模板。
# oc create -f /usr/share/ansible/openshift-ansible/roles/openshift_storage_glusterfs/files/glusterfs-template.yml template "glusterfs" created
执行以下命令来编辑旧的 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
如果模板包含 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 限制 ,并在进行升级前添加必要的参数。
如果模板只有一个 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 变量设置为正确的值
标记具有 Red Hat Gluster Storage pod 的所有 OpenShift Container Platform 节点:
使用以下命令检查是否使用适当的标签标记节点:
# oc get nodes -l glusterfs=storage-host
执行以下命令来创建 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
执行以下命令并确保 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 中如何识别块卷和块卷。执行以下命令以删除旧的 gluster pod。
Gluster pod 应该遵循滚动升级。因此,您必须确保新 pod 正在运行,然后才能删除下一个旧的 gluster pod。我们支持 OnDelete Strategy DaemonSet 更新策略
。使用 OnDelete Strategy 更新策略时,只有在您手动删除旧的 DaemonSet pod 时,才会创建新的 DaemonSet pod。要删除旧的 gluster pod,请执行以下命令:
# oc delete pod <gluster_pod>
例如,
# oc delete pod glusterfs-0vcf3 pod “glusterfs-0vcf3” deleted
注意在删除下一个 pod 之前,必须进行自我修复检查:
运行以下命令访问 gluster pod 上的 shell:
# oc rsh <gluster_pod_name>
运行以下命令检查所有卷的自我修复状态:
# for eachVolume in $(gluster volume list); do gluster volume heal $eachVolume info ; done | grep "Number of entries: [^0]$"
删除 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 …
执行以下命令来验证 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
执行以下命令来验证是否将 pod 升级到最新版本:
# oc rsh <gluster_pod_name> glusterd --version
例如:
# oc rsh glusterfs-4cpcc glusterd --version glusterfs 6.0
在其中一个 gluster pod 上执行以下命令,以检查 Red Hat Gluster Storage op-version:
# gluster vol get all cluster.op-version
升级 Gluster pod 后,请确保将 Heketi 设置为运营模式:
扩展 DC(部署配置)。
# oc scale dc <heketi_dc> --replicas=1
在任意 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" 选项指定从应用传输的最大时间(以秒为单位)。
它用于检测强制断开连接和死连接(如果意外关闭,防火墙会被提前激活,等等),并使应用程序能够减少整体故障转移时间。
使用以下命令列出 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
远程 shell 到其中一个 glusterfs pod。例如:
# oc rsh glusterfs-0vcf3
执行以下命令:
# 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
如果 gluster-block-provisoner-pod 已经存在,则执行以下命令来删除它:
# oc delete dc glusterblock-provisioner-dc
例如:
# oc delete dc glusterblock-storage-provisioner-dc
执行以下命令,以删除旧的 glusterblock provisioner 模板。
# oc delete templates glusterblock-provisioner
创建 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
根据 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
如果模板包含 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
如果模板只有一个 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
从旧 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
在运行 oc process 前,请确定正确的
置备程序
名称。如果集群中有多个gluster 块置备程序
,该名称必须与所有其他置备程序
不同。
例如,
-
如果名称应该为
gluster.org/glusterblock-<namespace>
,则命名空间将被部署置备程序的命名空间替换。 -
如果只有一个置备程序,在 3.11.8 之前安装,
gluster.org/glusterblock
就足够。如果当前使用的名称已经有唯一的命名空间后缀,则重复利用现有名称。
-
如果名称应该为
编辑模板后,执行以下命令创建部署配置:
# 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
Brick 多路是一个功能,允许在一个进程中添加多个 brick。这可以减少资源消耗,并允许我们运行超过相同内存消耗的 brick 数。从 Container-Native Storage 3.6 点启用它。在从 Container-Native Storage 3.10 升级到 Red Hat Openshift Container Storage 3.11 的过程中,要打开 brick 多路,请执行以下命令:
要执行到 Gluster pod 中,请执行以下命令以及 rsh 到 gluster pod:
# oc rsh <gluster_pod_name>
验证 brick 多路状态:
# gluster v get all all
如果被禁用,则执行以下命令以启用 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
列出受信存储池中的所有卷。只有在执行卷设置操作时,才需要执行此步骤:
例如:
# gluster volume list heketidbstorage vol_194049d2565d2a4ad78ef0483e04711e ... ...
重启所有卷。只有在卷集操作和上一步中执行时才需要执行此步骤:
# gluster vol stop <VOLNAME> # gluster vol start <VOLNAME>
在 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。
注意- 如果您有 glusterfs registry pod,请执行以下步骤 第 6.2 节 “升级 glusterfs registry 组中的 pod” 中列出的步骤来升级 heketi 和 glusterfs registry pod。
- 如果您没有 glusterfs registry pod,然后执行 第 6.3 节 “启动 Heketi Pod” 中列出的步骤返回您的 heketi pod,然后执行 第 6.4 节 “升级 Red Hat OpenShift Container Platform 节点上的客户端” 中列出的步骤来升级 Red Hat Openshift Container Platform 节点上的客户端。
使用 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 -