ovs hot upgrade

关于ovs版本的升级,其提供了一个配置项flow-restore-wait,用来决定什么时候开始处理流量。详细解释可参考官网,摘录如下:

image.png

关于升级,还可参考下面链接
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"

也可参考:ovs hot upgrade - 简书 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值