24.6. 回滚到 OpenShift SDN 网络供应商
作为集群管理员,您可以使用 离线 迁移方法或有限的实时迁移方法从 OVN-Kubernetes 网络插件回滚到 OpenShift SDN 网络插件。这只能在迁移到 OVN-Kubernetes 网络插件后完成。
- 如果您使用离线迁移方法从 OVN-Kubernetes 网络插件迁移到 OpenShift SDN 网络插件,您应该使用离线迁移回滚方法。
- 如果您使用有限的实时迁移方法从 OVN-Kubernetes 网络插件迁移到 OpenShift SDN 网络插件,则应使用有限的实时迁移回滚方法。
从 OpenShift Container Platform 4.14 开始,OpenShift SDN CNI 已被弃用。自 OpenShift Container Platform 4.15 起,网络插件不是新安装的选项。在以后的发行版本中,计划删除 OpenShift SDN 网络插件,并不再被支持。红帽将在删除前对这个功能提供程序错误修正和支持,但不会再改进这个功能。作为 OpenShift SDN CNI 的替代选择,您可以使用 OVN Kubernetes CNI。如需更多信息,请参阅 OpenShift SDN CNI 删除。
24.6.1. 使用离线迁移方法回滚到 OpenShift SDN 网络插件
集群管理员可以使用离线迁移方法回滚到 OpenShift SDN Container Network Interface (CNI) 网络插件。在迁移过程中,您必须手动重新引导集群中的每个节点。使用离线迁移方法时,集群会存在一些停机时间。
在启动回滚前,您必须等待 OpenShift SDN 到 OVN-Kubernetes 网络插件的迁移过程成功。
如果需要回滚到 OpenShift SDN,下表描述了这个过程。
用户发起的步骤 | 迁移操作 |
---|---|
挂起 MCO 以确保它不会中断迁移。 | MCO 停止。 |
将名为 |
|
更新 |
|
重新引导集群中的每个节点。 |
|
在集群重启中的所有节点后启用 MCO。 |
|
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 可以使用具有 cluster-admin 角色的用户访问集群。
- 集群安装在使用 OVN-Kubernetes 网络插件配置的基础架构上。
- etcd 数据库的最新备份可用。
- 可以为每个节点触发手动重新引导。
- 集群处于已知良好状态,没有任何错误。
流程
停止由 Machine Config Operator(MCO)管理的所有机器配置池:
在 CLI 中输入以下命令来停止
master
配置池:$ oc patch MachineConfigPool master --type='merge' --patch \ '{ "spec": { "paused": true } }'
在 CLI 中输入以下命令来停止
worker
机器配置池:$ oc patch MachineConfigPool worker --type='merge' --patch \ '{ "spec":{ "paused": true } }'
要准备迁移,请在 CLI 中输入以下命令将 migration 字段设置为
null
:$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": null } }'
在 CLI 中输入以下命令,检查
Network.config.openshift.io
对象的迁移状态是否为空。空命令输出表示对象不在迁移操作中。$ oc get Network.config cluster -o jsonpath='{.status.migration}'
将补丁应用到
Network.operator.openshift.io
对象,通过在 CLI 中输入以下命令将网络插件设置为 OpenShift SDN:$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": { "networkType": "OpenShiftSDN" } } }'
重要如果您在
Network.operator.openshift.io
对象上的补丁操作完成前将补丁应用到Network.config.openshift.io
对象,Cluster Network Operator (CNO) 进入降级状态,这会导致 slight 延迟直到 CNO 从降级状态恢复。在 CLI 中输入以下命令,确认
Network.config.openshift.io 集群
对象的网络插件的迁移状态为OpenShiftSDN
:$ oc get Network.config cluster -o jsonpath='{.status.migration.networkType}'
将补丁应用到
Network.config.openshift.io
对象,通过在 CLI 中输入以下命令将网络插件设置为 OpenShift SDN:$ oc patch Network.config.openshift.io cluster --type='merge' \ --patch '{ "spec": { "networkType": "OpenShiftSDN" } }'
可选:禁用将几个 OVN-Kubernetes 功能自动迁移到 OpenShift SDN 等效功能:
- 出口 IP
- 出口防火墙
- 多播
要为之前记录的 OpenShift SDN 功能禁用配置自动迁移,请指定以下键:
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": { "networkType": "OpenShiftSDN", "features": { "egressIP": <bool>, "egressFirewall": <bool>, "multicast": <bool> } } } }'
其中:
bool
:指定是否启用功能的迁移。默认值是true
。可选: 您可以自定义 OpenShift SDN 的以下设置,以满足您的网络基础架构的要求:
- 最大传输单元(MTU)
- VXLAN 端口
要自定义之前记录的设置或两个设置,请在 CLI 中自定义并输入以下命令。如果您不需要更改默认值,请从补丁中省略该键。
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "openshiftSDNConfig":{ "mtu":<mtu>, "vxlanPort":<port> }}}}'
mtu
-
VXLAN 覆盖网络的 MTU。这个值通常是自动配置的;但是,如果集群中的节点没有都使用相同的 MTU,那么您必须将此值明确设置为比最小节点 MTU 的值小
50
。 port
-
VXLAN 覆盖网络的 UDP 端口。如果没有指定值,则默认为
4789
。端口不能与 OVN-Kubernetes 使用的生成端口相同。Geneve 端口的默认值为6081
。
patch 命令示例
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "openshiftSDNConfig":{ "mtu":1200 }}}}'
重新引导集群中的每个节点。您可以使用以下方法之一重新引导集群中的节点:
使用
oc rsh
命令,您可以使用类似如下的 bash 脚本:#!/bin/bash readarray -t POD_NODES <<< "$(oc get pod -n openshift-machine-config-operator -o wide| grep daemon|awk '{print $1" "$7}')" for i in "${POD_NODES[@]}" do read -r POD NODE <<< "$i" until oc rsh -n openshift-machine-config-operator "$POD" chroot /rootfs shutdown -r +1 do echo "cannot reboot node $NODE, retry" && sleep 3 done done
通过
ssh
命令,您可以使用类似如下的 bash 脚本:该脚本假设您已将 sudo 配置为不提示输入密码。#!/bin/bash for ip in $(oc get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}') do echo "reboot node $ip" ssh -o StrictHostKeyChecking=no core@$ip sudo shutdown -r -t 3 done
等待 Multus 守护进程集的 rollout 完成。运行以下命令查看您的 rollout 状态:
$ oc -n openshift-multus rollout status daemonset/multus
Multus pod 的名称采用
multus-<xxxxx>
的形式,其中<xxxxx>
是由字母组成的随机序列。pod 可能需要一些时间才能重启。输出示例
Waiting for daemon set "multus" rollout to finish: 1 out of 6 new pods have been updated... ... Waiting for daemon set "multus" rollout to finish: 5 of 6 updated pods are available... daemon set "multus" successfully rolled out
重新引导集群中的节点并推出 multus pod 后,通过运行以下命令启动所有机器配置池:
启动 master 配置池:
$ oc patch MachineConfigPool master --type='merge' --patch \ '{ "spec": { "paused": false } }'
启动 worker 配置池:
$ oc patch MachineConfigPool worker --type='merge' --patch \ '{ "spec": { "paused": false } }'
当 MCO 更新每个配置池中的机器时,它会重新引导每个节点。
默认情况下,MCO 会在一个时间段内为每个池更新一台机器,因此迁移完成所需要的时间会随集群大小的增加而增加。
确认主机上新机器配置的状态:
要列出机器配置状态和应用的机器配置名称,请在 CLI 中输入以下命令:
$ oc describe node | egrep "hostname|machineconfig"
输出示例
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: Done
验证以下语句是否正确:
-
machineconfiguration.openshift.io/state
字段的值为Done
。 -
machineconfiguration.openshift.io/currentConfig
字段的值等于machineconfiguration.openshift.io/desiredConfig
字段的值。
-
要确认机器配置正确,在 CLI 中输入以下命令:
$ oc get machineconfig <config_name> -o yaml
这里的
<config_name>
是machineconfiguration.openshift.io/currentConfig
字段中机器配置的名称。
确认迁移成功完成:
要确认网络插件是 OpenShift SDN,请在 CLI 中输入以下命令。
status.networkType
的值必须是OpenShiftSDN
。$ oc get Network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'
要确认集群节点处于
Ready
状态,请在 CLI 中输入以下命令:$ oc get nodes
如果节点一直处于
NotReady
状态,检查机器配置守护进程 pod 日志并解决所有错误。要列出 pod,在 CLI 中输入以下命令:
$ oc get pod -n openshift-machine-config-operator
输出示例
NAME READY STATUS RESTARTS AGE machine-config-controller-75f756f89d-sjp8b 1/1 Running 0 37m machine-config-daemon-5cf4b 2/2 Running 0 43h machine-config-daemon-7wzcd 2/2 Running 0 43h machine-config-daemon-fc946 2/2 Running 0 43h machine-config-daemon-g2v28 2/2 Running 0 43h machine-config-daemon-gcl4f 2/2 Running 0 43h machine-config-daemon-l5tnv 2/2 Running 0 43h machine-config-operator-79d9c55d5-hth92 1/1 Running 0 37m machine-config-server-bsc8h 1/1 Running 0 43h machine-config-server-hklrm 1/1 Running 0 43h machine-config-server-k9rtx 1/1 Running 0 43h
配置守护进程 pod 的名称使用以下格式:
machine-config-daemon-<seq>
。<seq>
值是一个随机的五个字符的字母数字序列。要显示以上输出中显示的每个机器配置守护进程 pod 的 pod 日志,请在 CLI 中输入以下命令:
$ oc logs <pod> -n openshift-machine-config-operator
其中
pod
是机器配置守护进程 pod 的名称。- 解决上一命令输出中显示的日志中的任何错误。
要确认您的 pod 不在错误状态,请在 CLI 中输入以下命令:
$ oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}'
如果节点上的 pod 处于错误状态,请重新引导该节点。
只有在迁移成功且集群处于良好状态时完成以下步骤:
要从 Cluster Network Operator 配置对象中删除迁移配置,请在 CLI 中输入以下命令:
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": null } }'
要删除 OVN-Kubernetes 配置,请在 CLI 中输入以下命令:
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "defaultNetwork": { "ovnKubernetesConfig":null } } }'
要删除 OVN-Kubernetes 网络供应商命名空间,请在 CLI 中输入以下命令:
$ oc delete namespace openshift-ovn-kubernetes
24.6.2. 使用有限的实时迁移方法回滚到 OpenShift SDN 网络插件
作为集群管理员,您可以使用有限的实时迁移方法回滚到 OpenShift SDN Container Network Interface (CNI) 网络插件。使用此方法迁移过程中,节点会自动重新引导,并且对集群的服务不会中断。
在启动回滚前,您必须等待 OpenShift SDN 到 OVN-Kubernetes 网络插件的迁移过程成功。
如果需要回滚到 OpenShift SDN,下表描述了这个过程。
用户发起的步骤 | 迁移操作 |
---|---|
通过将 |
|
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 可以使用具有 cluster-admin 角色的用户访问集群。
- 集群安装在使用 OVN-Kubernetes 网络插件配置的基础架构上。
- etcd 数据库的最新备份可用。
- 可以为每个节点触发手动重新引导。
- 集群处于已知良好状态,没有任何错误。
流程
要启动回滚到 OpenShift SDN,请输入以下命令:
$ oc patch Network.config.openshift.io cluster --type='merge' --patch '{"metadata":{"annotations":{"network.openshift.io/network-type-migration":""}},"spec":{"networkType":"OpenShiftSDN"}}'
要监控迁移的进度,请输入以下命令:
$ watch -n1 'oc get network.config/cluster -o json | jq ".status.conditions[]|\"\\(.type) \\(.status) \\(.reason) \\(.message)\"" -r | column --table --table-columns NAME,STATUS,REASON,MESSAGE --table-columns-limit 4; echo; oc get mcp -o wide; echo; oc get node -o "custom-columns=NAME:metadata.name,STATE:metadata.annotations.machineconfiguration\\.openshift\\.io/state,DESIRED:metadata.annotations.machineconfiguration\\.openshift\\.io/desiredConfig,CURRENT:metadata.annotations.machineconfiguration\\.openshift\\.io/currentConfig,REASON:metadata.annotations.machineconfiguration\\.openshift\\.io/reason"'
该命令每秒打印以下信息:
-
network.config.openshift.io/cluster
对象的状态的条件,报告迁移的进度。 -
与
machine-config-operator
资源相关的不同节点的状态,包括它们是否正在升级或已升级,以及它们的当前和所需的配置。
-
只有在迁移成功且集群处于良好状态时完成以下步骤:
输入以下命令从
network.config
自定义资源中删除network.openshift.io/network-type-migration=
注解:$ oc annotate network.config cluster network.openshift.io/network-type-migration-
输入以下命令删除 OVN-Kubernetes 网络供应商命名空间:
$ oc delete namespace openshift-ovn-kubernetes