VPP是一种高性能、灵活、可扩展和可编程的网络数据包处理软件,在云计算、NFV、边缘计算和高性能路由中都有广泛的应用。VPP是一个开源项目,而不是一个产品。开源项目是由社区驱动维护和开发。但作为一个产品就需要进行研发软件集成,测试,打包,发布和运维。下面是国外netgate公司高性能软件路由器TNSR,它就是vpp产品化的商用软件。架构如下:
上面架构中控制面软件FRR、strongswan、clixon软件都是以独立进程方式部署的,通过vpp提供的vapi接口建立配置下发通道。控制面进程异常导致转发面业务中断问题时有发生,就需要一套精细的进程管理方案。在vpp 最新发布23.10版本中发布fateshare插件就提供了很好的解决方案来管理控制器进程,使用vpp单一进程来管理控制面所有进程。
代码语言:javascript复制vpp是作为服务器端的,vpp异常之后,需要控制面软件重新与vpp建立vapi连接通道,否则配置将无法下发。我们的产品实现思路也比较简单,就是监控vpp进程号ID是否存在变化,变化存在就相应的把这种其他控制面进程重新启动一下。方法启动简单,但也引入了很多问题的。
fateshare: a plugin for managing child processes
For the reasons of modularity and security, it is useful
to have various functionality split into processes different from VPP.
However, this approach presents the challenges of managing those processes,
and is markedly different from simply running everything within VPP process.
This plugin is an experiment in having the VPP itself start off a monitor
process which in turn starts the child processes, and restarts them if they
quit.
If the VPP process ceases to exist, the monitor process terminates all
the descendant processes and quits itself.
This allows to preserve the "single entity to manage" approach of
simply running a barebones VPP.
An example of running it:
export DPDK_CONFIG=""
export DISABLED_PLUGINS=dpdk
export EXTRA_VPP_CONFIG="fateshare { monitor ./build-root/install-vpp_debug-native/vpp/bin/vpp_fateshare_monitor command ./test1 }"
make run
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
Change-Id: I66221fd7403f220d9652fe76958ca499cfd070a7
Type: feature
介绍翻译如下:fatshare:管理子进程的插件-----出于模块化和安全性的考虑,将各种功能划分为与VPP不是同一进程是很有用的。然而,这种方法也为管理这些进程提供了挑战。这个插件是一个实验,让VPP本身启动一个监控进程,然后启动子进程,如果子进程退出,则重新启动它们。如果VPP进程不再存在,monitor进程终止所有子进程并退出自己。这允许保留简单运行VPP的“单一实体管理”方法。
接下来就尝试使用一下这个插件,此插件默认是关闭状态的,需要在配置文件enable插件,并且需要在配置文件中新增fatshare配置段监控项。
代码语言:javascript复制##1、打开fateshare插件,在plugins配置中enable fateshare插件即可
plugins {
#打开fateshare插件
plugin fateshare_plugin.so {enable}
}
##2、在faeshare配置增加监控项。支持同时监控多个子进程。
#vpp_fateshare_monitor是监控程序,test1是运行子程序。
fateshare {
monitor /root/workspace/vpp/build-root/install-vpp-native/vpp/bin/vpp_fateshare_monitor command /root/test1
}
test1子进程是是简单写的一个shell脚本,如下:
代码语言:javascript复制#!/bin/bash
echo "test1 start time `date`" >>/tmp/txt1
while [ 1 -le 10 ]
do
date
sleep 1
done
默认在tmp路径下,存在四个日志文件:
代码语言:javascript复制txt1 ##记录test1软件启动时间
vpp-fateshare-monitor-log.txt #fateshare监控日志
vpp-fateshare-monitor-log.txt-stderr.txt ##子进程错误日志记录
vpp-fateshare-monitor-log.txt-stdout.txt #子进程标准输出日志记录
下面就分别模拟test1进程异常退出,和vpp异常退出。查看软件是否都可以正常被拉起来。
代码语言:javascript复制#正常的进程ID
root 298353 1 99 15:29 ? 00:50:54 /usr/bin/vpp -c /etc/vpp/startup.conf
root 298354 298353 0 15:29 ? 00:00:00 /root/workspace/vpp/build-root/install-vpp-native/vpp/bin/vpp_fateshare_monitor 298353 /tmp/vpp-fateshare-monitor-log.txt /root/test1
root 298355 298354 0 15:29 ? 00:00:01 /bin/bash /root/test1
#模拟test1异常。test1进程被父进程298354 重新拉起。
root@jinsh:/tmp# kill -9 298355
root@jinsh:/tmp# ps -ef | grep test1
root 298354 298353 0 15:29 ? 00:00:00 /root/workspace/vpp/build-root/install-vpp-native/vpp/bin/vpp_fateshare_monitor 298353 /tmp/vpp-fateshare-monitor-log.txt /root/test1
root 305168 298354 0 16:24 ? 00:00:00 /bin/bash /root/test1
#默认vpp异常。监控进程和子进程都可以重新被拉起
root@jinsh:/tmp# kill -9 `pidof vpp`
root@jinsh:/tmp# ps -ef| grep vpp
root 305376 1 99 16:26 ? 00:00:05 /usr/bin/vpp -c /etc/vpp/startup.conf
root 305377 305376 0 16:26 ? 00:00:00 /root/workspace/vpp/build-root/install-vpp-native/vpp/bin/vpp_fateshare_monitor 305376 /tmp/vpp-fateshare-monitor-log.txt /root/test1
root 305378 305377 0 16:26 ? 00:00:00 /bin/bash /root/test1
至此,我们就介绍完此插件的功能,功能实现代码不多,需要了解更多实现细节就需要阅读源码了。其实还有一个比较好的参考案例,就是FRR软件,FRR软件中各种模块BFD,OSPF,BGP等都是独立进程,依靠watch_frr软件进行管理的,具体实现方式就需要阅读源码了。