5.8. 恢复 OpenShift Data Foundation 扩展集群
鉴于具有扩展集群灾难恢复解决方案是为环境出现完全或部分故障时为环境提供抗压性,因此了解应用程序及其存储的不同恢复方法非常重要。
应用程序的机构决定了它在一个活动区域中再次可用的速度。
当区域出现问题时,有不同的方法来恢复应用及其存储。恢复时间取决于应用程序的架构。不同的恢复方法如下:
5.8.1. 了解区失败 复制链接链接已复制到粘贴板!
在本小节中,区失败代表区中的所有 OpenShift Container Platform、master 和 worker 节点不再与第二个数据区中的资源进行通信(例如关闭节点)。如果数据区域之间的通信仍处于可以部分工作的状态(不时出现启动或关闭的情况),集群、存储和网络管理员需要断开数据区之间的通信路径,才能成功恢复。
安装示例应用程序时,请关闭 OpenShift Container Platform 节点(至少使用 OpenShift Data Foundation 设备的节点),以测试数据区的故障,以验证您的 file-uploader 应用程序是否可用,您可以上传新文件。
要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃。
5.8.2. 使用 RWX 存储恢复区感知 HA 应用程序 复制链接链接已复制到粘贴板!
使用 topologyKey: topology.kubernetes.io/zone 部署的应用程序,在每个数据区中调度一个或多个副本,并使用共享存储,即 ReadWriteMany (RWX) CephFS 卷,在几分钟后,在几分钟后,新 pod 会被推出部署并处于待处理状态,直到区域恢复为止。
此类型的应用示例在 Install Zone Aware Sample Application 部分中进行了详细说明。
在区域恢复期间,如果应用容器集在挂载 CephFS 卷时进入 CrashLoopBackOff (CLBO) 状态,然后重启调度 Pod 的节点。等待一段时间,然后检查 pod 是否再次运行。
要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃。
5.8.3. 使用 RWX 存储恢复 HA 应用程序 复制链接链接已复制到粘贴板!
使用 topologyKey: kubernetes.io/hostname 或没有拓扑配置的应用程序无法防止同一区域中的所有应用副本。
即使 Pod spec 中有 podAntiAffinity 和 topologyKey: kubernetes.io/hostname 也会发生,因为此反关联性规则基于主机且不是基于区域的规则。
如果发生这种情况,且所有副本都位于失败的区域中,则使用 ReadWriteMany(RWX)存储的应用程序需要 6-8 分钟才可以在活跃区域中恢复。此暂停时间用于故障区中的 OpenShift Container Platform 节点变为 NotReady (60 秒),然后让默认 pod 驱除超时过期(300 秒)。
为了防止在非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点 中的步骤操作,以防止在非正常节点关闭过程中卷崩溃。
5.8.4. 使用 RWO 存储恢复应用程序 复制链接链接已复制到粘贴板!
使用 ReadWriteOnce(RWO)存储的应用程序具有在此 Kubernetes 问题中描述的已知行为。因此,如果数据区失败,该区中的任何应用程序 pod 都挂载 RWO 卷(例如,基于 cephrbd 的卷)都会在 6-8 分钟后处于 Terminating 状态,且不会在没有手动干预的情况下在活跃区中重新创建。
要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃。
5.8.5. 恢复 StatefulSet pod 复制链接链接已复制到粘贴板!
作为 StatefulSet 一部分的 Pod 的问题与 pod 挂载 ReadWriteOnce(RWO)卷相似。Kubernetes 资源 StatefulSet 注意事项中会引用更多信息。
要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃。
5.8.6. 隔离和污点节点,以防止在非正常节点关闭过程中卷崩溃 复制链接链接已复制到粘贴板!
以下流程需要在非正常节点关闭过程中执行,以防止卷内容损坏。
先决条件
-
按照 创建 OpenShift Data Foundation 集群的 Create 'NetworkFenceClass' 部分中的步骤来创建
NetworkFenceClass。
流程
创建
NetworkFenceCR 以隔离停机的存储节点的 IP。获取需要隔离的 NodeName :
$ oc get node获取与上一步中找到的节点对应的
csiaddonsnode对象:$ oc get csiaddonsnode -n openshift-storage |grep -i <nodename> |grep -i daemonset从上一步中找到的
csiaddonsnode对象获取 IP 地址,并创建NetworkFenceCR,并确保它处于Fenced状态:$ oc get csiaddonsnode <csi-addons-name> -o jsonpath='{.status.networkFenceClientStatus}' [{"ClientDetails":[{"cidrs":["10.244.0.1/32"],"id":"a815fe8e-eabd-4e87-a6e8-78cebfb67d08"}],"networkFenceClassName":"networkfenceclass-sample"}]将
<csi-addons-name> 替换为上一步中找到的csiaddonsnode对象。使用 OpenShift 节点名称为上述 CIDR 创建
NetworkFenceCR 以便轻松识别:apiVersion: csiaddons.openshift.io/v1alpha1 kind: NetworkFence metadata: name: <openshift-node-name> spec: cidrs: - 10.244.0.1/32 driver: openshift-storage.rbd.csi.ceph.com fenceState: Fenced parameters: clusterID: openshift-storage secret: name: rook-csi-rbd-provisioner namespace: openshift-storage-
: 指定集群 ID,可以从parameters.clusterIDocs-storagecluster-ceph-rbdstorageclass 中的 parameter.clusterID 获取。 -
secret.name: 指定网络隔离操作所需的 secret 名称。这可以从ocs-storagecluster-ceph-rbdstorageclass 中的parameters.csi.storage.k8s.io/provisioner-secret-name获取。 -
secret.namespace: 指定 secret 所在的命名空间。这可以从parameters.csi.storage.k8s.io/provisioner-secret-namespace'in 'ocs-storagecluster-ceph-rbd storageclass获取。
-
验证网络隔离是否已成功完成:
$ oc get networkfence输出示例:
NAME DRIVER CIDRS FENCESTATE AGE RESULT <openshift-node-name> openshift-storage.rbd.csi.ceph.com ["10.244.0.1/32"] Fenced 42h Succeeded
为停机的节点添加污点:
$ oc adm taint nodes <node-name> node.kubernetes.io/out-of-service=nodeshutdown:NoExecute监控应用程序重新定位到存活节点。
对所有节点执行上述步骤。
节点返回后恢复
节点恢复在线后,您需要取消保护节点并删除节点上的污点,以将 pod 调度到这些节点上。
在 CR 中将
NetworkFence状态更改为UnFenced,并等待它变为 unfenced将
NetworkFence设置为UnFenced:$ oc patch networkfence <network-fence-object-name> -p '{"spec":{"fenceState":"Unfenced"}}' --type=merge验证 Network UnFencing 是否已成功完成:
$ oc get networkfence输出示例:
NAME DRIVER CIDRS FENCESTATE AGE RESULT <openshift-node-name> openshift-storage.rbd.csi.ceph.com ["10.244.0.1/32"] unfenced 42h Succeeded
- 重新引导节点。
取消污点的节点:
$ oc adm taint nodes <node-name> node.kubernetes.io/out-of-service=nodeshutdown:NoExecute-对所有节点重复这些步骤。