关于ovs版本的升级,其提供了一个配置项flow-restore-wait,用来决定什么时候开始处理流量。详细解释可参考官网,摘录如下:
关于升级,还可参考下面链接
https://ovs-dpdk-1808-merge.readthedocs.io/en/latest/intro/install/general.html#hot-upgrading
Upgrading Open vSwitch from one version to the next version with minimum disruption of traffic going through the system that is using that Open vSwitch needs some considerations:
If the upgrade only involves upgrading the userspace utilities and daemons of Open vSwitch, make sure that the new userspace version is compatible with the previously loaded kernel module.
An upgrade of userspace daemons means that they have to be restarted. Restarting the daemons means that the OpenFlow flows in the ovs-vswitchd daemon will be lost. One way to restore the flows is to let the controller re-populate it. Another way is to save the previous flows using a utility like ovs-ofctl and then re-add them after the restart. Restoring the old flows is accurate only if the new Open vSwitch interfaces retain the old ‘ofport’ values.
When the new userspace daemons get restarted, they automatically flush the old flows setup in the kernel. This can be expensive if there are hundreds of new flows that are entering the kernel but userspace daemons are busy setting up new userspace flows from either the controller or an utility like ovs-ofctl. Open vSwitch database provides an option to solve this problem through the other_config:flow-restore-wait column of the Open_vSwitch table. Refer to the ovs-vswitchd.conf.db(5) manpage for details.
If the upgrade also involves upgrading the kernel module, the old kernel module needs to be unloaded and the new kernel module should be loaded. This means that the kernel network devices belonging to Open vSwitch is recreated and the kernel flows are lost. The downtime of the traffic can be reduced if the userspace daemons are restarted immediately and the userspace flows are restored as soon as possible.
The ovs-ctl utility’s restart function only restarts the userspace daemons, makes sure that the ‘ofport’ values remain consistent across restarts, restores userspace flows using the ovs-ofctl utility and also uses the other_config:flow-restore-wait column to keep the traffic downtime to the minimum. The ovs-ctl utility’s force-reload-kmod function does all of the above, but also replaces the old kernel module with the new one. Open vSwitch startup scripts for Debian, XenServer and RHEL use ovs-ctl’s functions and it is recommended that these functions be used for other software platforms too.
下面这个脚本restart_ovs.sh用来保存流表信息,重启ovs,重新加载流表,最终使ovs正常work
#!/bin/sh
export LC_ALL=C
get_top_of_version() {
ovs-vsctl get bridge "$1" protocol | sed -n 's/^.*"\([^"]*\)"]$/\1/p'
}
save_flows () {
for bridge; do
of_version=$(get_top_of_version "$bridge")
: ${of_version:=OpenFlow14}
printf "ovs-ofctl -O $of_version add-tlv-map %s '" "$bridge"
ovs-ofctl -O $of_version dump-tlv-map $bridge | \
awk '/^ 0x/ {if (cnt != 0) printf ","; \
cnt++;printf "{class="$1",type="$2",len="$3"}->"$4}'
echo "'"
if [ "$of_version" '<' OpenFlow14 ]; then
echo "ovs-ofctl -O $of_version add-flows $bridge \
\"$workdir/$bridge.flows.dump\""
else
echo "ovs-ofctl -O $of_version --bundle add-flows $bridge \
\"$workdir/$bridge.flows.dump\""
fi
ovs-ofctl -O $of_version dump-flows --no-names --no-stats "$bridge" | \
sed -e '/NXST_FLOW/d' \
-e '/OFPST_FLOW/d' \
-e 's/\(idle\|hard\)_age=[^,]*,//g' \
> "$workdir/$bridge.flows.dump"
done
}
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
# Save flows
bridges=$(ovs-vsctl -- --real list-br)
flows=$(save_flows $bridges)
# Restart the database first, since a large database may take a
# while to load, and we want to minimize forwarding disruption.
systemctl --job-mode=ignore-dependencies restart ovsdb-server
# Stop ovs-vswitchd.
systemctl --job-mode=ignore-dependencies stop ovs-vswitchd
# Start vswitchd by asking it to wait till flow restore is finished.
ovs-vsctl --no-wait set open_vswitch . other_config:flow-restore-wait="true"
systemctl --job-mode=ignore-dependencies start ovs-vswitchd
# Restore saved flows and inform vswitchd that we are done.
eval "$flows"
ovs-vsctl --if-exists remove open_vswitch . other_config \
flow-restore-wait="true"
网友评论