目录

文章目录

  • 目录
  • 部署架构
  • 安装步骤
    • 安装 ETCD
    • 容器部署 VPP & VPP Agent
    • 编译安装 VPP Agent
  • Managing the VPP Agent
    • etcdctl
    • REST API
      • NB Configuration
      • SB Dumps
      • Execute VPP CLI commands through a REST API
    • VPP CLI
    • Agentctl

部署架构

安装步骤

安装 ETCD

  • docker run on console
$ docker run --rm --name etcd -p 2379:2379 -e ETCDCTL_API=3 quay.io/coreos/etcd /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379
$ docker ps -f name=etcd
  • etcdctl
$ docker exec -it etcd etcdctl version
etcdctl version: 3.3.8
API version: 3.3$ docker exec -it etcd etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 571.723µs

容器部署 VPP & VPP Agent

$ docker pull ligato/vpp-agent$ docker run -it --rm --name vpp-agent -p 5002:5002 -p 9191:9191 --privileged ligato/vpp-agent
INFO[0000] Starting agent version: v0.0.0-dev            BuildDate= CommitHash= loc="agent/agent.go(134)" logger=agent
INFO[0000] Agent started with 2 plugins (took 1ms)       loc="agent/agent.go(179)" logger=agent___  _____  ___ _______ ____ ____ ___ / /_| |/ / _ \/ _ /___/ _ '/ _ '/ -_/ _ / __/  vpp-agent v3.3.0-alpha-28-g412190182|___/ .__/ .__/   \_'_/\_' /\__/_//_\__/   Wed May 12 15:07:23 UTC 2021 (24 days ago)/_/  /_/           /___/                root@buildkitsandbox (go1.15.2 linux/amd64)
...$ docker exec -it vpp-agent ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 15:11 pts/0    00:00:01 vpp-agent-init
root        16     1  8 15:11 pts/0    00:06:05 /usr/bin/vpp -c /etc/vpp/vpp.con
root        17     1  0 15:11 pts/0    00:00:05 /bin/vpp-agent --config-dir=/opt
root       838     0  0 16:21 pts/1    00:00:00 ps -ef

可见,VPP Data Plane 和 VPP Agent 都运行在容器中了。其中,

  • VPP CLI:5050
  • VPP Agent REST API:9191

编译安装 VPP Agent

编译安装适用开发环境。

  • 程序编译
$ git clone https://github.com/ligato/vpp-agent
$ git checkout release/3.2.x
$ make cmd$ ll cmd/
total 24
drwxr-xr-x  5 root root 4096 Jun  7 15:58 ./
drwxr-xr-x 17 root root 4096 Jun  7 16:12 ../
drwxr-xr-x  6 root root 4096 Jun  7 16:15 agentctl/
drwxr-xr-x  3 root root 4096 Jun  7 16:15 vpp-agent/
drwxr-xr-x  2 root root 4096 Jun  7 16:15 vpp-agent-init/
...
  • 配置
$ mkdir /opt/vpp-agent-conf-dir/$ cat /opt/vpp-agent-conf-dir/etcd.conf
insecure-transport: true
dial-timeout: 1s
endpoints:- "<etcd-server-ipaddr>:2379"$ cat /opt/vpp-agent-conf-dir/grpc.conf
endpoint: 0.0.0.0:9111$ cat /opt/vpp-agent-conf-dir/supervisor.conf
programs:- name: "vpp"executable-path: "/usr/bin/vpp"executable-args: ["-c", "/etc/vpp/vpp.conf"]- name: "agent"executable-path: "/opt/vpp-agent/cmd/vpp-agent/vpp-agent"executable-args: ["--config-dir=/opt/vpp-agent-conf-dir"]
hooks:- cmd: "/opt/vpp-agent-conf-dir/init_hook.sh"$ cat /opt/vpp-agent-conf-dir/init_hook.sh
#!/usr/bin/env bashterminate_process () {PID=$(pidof $1)if [[ ${PID} != "" ]]; thenkill ${PID}echo "process $1 terminated"fi
}if [[ "${SUPERVISOR_PROCESS_NAME}" = "agent" && "${SUPERVISOR_PROCESS_STATE}" = "terminated" ]]; thenterminate_process vpp-agent-init
fiif [[ "${SUPERVISOR_PROCESS_NAME}" = "vpp" && "${SUPERVISOR_PROCESS_STATE}" = "terminated" ]]; thenterminate_process vpp-agent-init
firoot
  • 启动 VPP Agent
$ ./vpp-agent -config-dir=/opt/vpp-agent-conf-dir___  _____  ___ _______ ____ ____ ___ / /_| |/ / _ \/ _ /___/ _ '/ _ '/ -_/ _ / __/  vpp-agent v3.2.0|___/ .__/ .__/   \_'_/\_' /\__/_//_\__/   Mon Jun  7 16:12:39 CST 2021 (20 minutes ago)/_/  /_/           /___/                root@upf1 (go1.14.2 linux/amd64)
...
  • 测试:又返回则表示 VPP Agent 和 VPP 连接成功。
$ curl -X POST 'http://localhost:9191/vpp/command?Content-Type=application/json' \
-H 'Content-Type: application/json' \
-d '{"vppclicommand":"show version"}'

Managing the VPP Agent

etcdctl

通过 etcdctl CLI 来操作 VPP Agent 在 ETCD 中的数据,继而来完成对 VPP Agent 的管理。在 ETCD 中,VPP Agent 相关的记录会使用 /vnf-agent/ 前缀。

  • 查看 VPP Agent 相关的记录:
$ docker exec -it etcd etcdctl get --prefix /vnf-agent//vnf-agent/vpp1/check/status/v1/agent
{"build_version":"v3.3.0-alpha-28-g412190182","build_date":"Wed May 12 15:07:23 UTC 2021","state":"OK","start_time":"1622905897","last_change":"1622905903","last_update":"1622906057","commit_hash":"4121901","plugins":[{"name":"govpp","state":"OK"},{"name":"VPPAgent","state":"OK"},{"name":"etcd","state":"OK"},{"name":"vpp-ifplugin","state":"OK"}]}
/vnf-agent/vpp1/check/status/v1/plugin/VPPAgent
{"state":"OK","last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/etcd
{"state":"OK","last_change":"1622905902","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/govpp
{"state":"OK","last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-abfplugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-aclplugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-dnsplugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-ifplugin
{"state":"OK","last_change":"1622905903","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-ipsec-plugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-l2plugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-l3plugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-natplugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-srplugin
{"last_change":"1622905897","last_update":"1622906057"}
/vnf-agent/vpp1/check/status/v1/plugin/vpp-wg-plugin
{"last_change":"1622905897","last_update":"1622906057"}
  • 创建一个 loopback interface 并配置 IP address:
docker exec etcd etcdctl put /vnf-agent/vpp1/config/vpp/v2/interfaces/loop1 \'{"name":"loop1","type":"SOFTWARE_LOOPBACK","enabled":true,"ip_addresses":["192.168.1.1/24"]}'docker exec etcd etcdctl get /vnf-agent/vpp1/config/vpp/v2/interfaces/loop1
  • Configure a bridge domain.
docker exec etcd etcdctl put /vnf-agent/vpp1/config/vpp/l2/v2/bridge-domain/bd1 \'{"name":"bd1","forward":true,"learn":true,"interfaces":[{"name":"loop1"}]}'docker exec etcd etcdctl get /vnf-agent/vpp1/config/vpp/l2/v2/bridge-domain/bd1

REST API

  • API 文档:https://docs.ligato.io/en/latest/api/api-vpp-agent/

VPP Agent 实现了两个 API:

  1. NB API:外部客户端与 VPP Agent 进行交互的接口,客户端可以完成 VPP configuration management。
  2. SB API:VPP Agent 与 VPP Data Plane 进行交互的接口。完成 VPP Data Plane 的 Events、Notifications 和 Configuration Dumps 操作。

通过 VPP Agent 提供的 REST plugin 我们可以完成以下两类操作:

  1. NB configuration management
  2. SB VPP configuration dumps

NB Configuration

NB Configuration 用于完成对 VPP Data Plane 的查询、配置、验证等操作。

  • PUT /configuration
  • PUT /configuration?replace
  • GET /configuration
  • GET /info/configuration/jsonschema
  • POST /configuration/validate

例如:

$ cat loop-bd.yamlvppConfig:interfaces:- name: "loop1"type: SOFTWARE_LOOPBACKenabled: trueipAddresses:- 192.168.1.1/24bridgeDomains:- name: bd1forward: truelearn: trueinterfaces:- name: loop1$ curl -X PUT -H "Content-Type: application/yaml" --data-binary @loop-bd.yaml http://localhost:9191/configuration

SB Dumps

SB Dumps 仅用于获取 VPP Data Plane 的运行时配置信息。详细见 API 文档。

例如:查询 VPP Interfaces 配置信息。

  • GET /dump/vpp/v2/interfaces
  • GET /dump/vpp/v2/interfaces/loopback
  • GET /dump/vpp/v2/interfaces/ethernet
  • GET /dump/vpp/v2/interfaces/vxlan
  • GET /dump/vpp/v2/interfaces/tap
  • GET /dump/vpp/v2/interfaces/memif
  • GET /dump/vpp/v2/interfaces/afpacket
$ curl -X GET http://localhost:9191/dump/vpp/v2/interfaces{"0": {"interface": {"name": "UNTAGGED-local0","type": "SOFTWARE_LOOPBACK","physAddress": "00:00:00:00:00:00"},"interface_meta": {"sw_if_index": 0,"sub_sw_if_index": 0,"l2_address": "AAAAAAAA","internal_name": "local0","dev_type": "local","is_admin_state_up": false,"is_link_state_up": false,  # Link 状态信息。"link_duplex": 0,"link_mtu": 0,"mtu": [0,0,0,0],"link_speed": 0,"sub_id": 0,"tag": "","dhcp": null,"vrf_ipv4": 0,"vrf_ipv6": 0,"pci": 0}}
}

Execute VPP CLI commands through a REST API

VPP Agent REST Plugin 还支持通过 REST API 来执行 VPP CLI 指令,例如:

$ curl -X POST 'http://localhost:9191/vpp/command?Content-Type=application/json' \
-H 'Content-Type: application/json' \
-d '{"vppclicommand":"show version"}'"vpp v20.09.0-63~g8b4bd27d6~b83 built by root on cec6be71f709 at 2021-04-21T19:48:17\n"

VPP CLI

通过 VPP CLI 直接操作 VPP Data Plane。

$ docker exec -it vpp-agent vppctl -s localhost:5002_______    _        _   _____  _____/ __/ _ \  (_)__    | | / / _ \/ _ \_/ _// // / / / _ \   | |/ / ___/ ___//_/ /____(_)_/\___/   |___/_/  /_/vpp# show inter addr
local0 (dn):# or
$ docker exec -it vpp-agent vppctl -s localhost:5002 show interface address
local0 (dn):

Agentctl

Agentctl 是 VPP Agent 的 CLI Tool,通过 Agentctl 来操作 VPP Agent,继而完成对 VPP Data Plane 的操作。

$ docker exec -it vpp-agent agentctl --help
Usage:  agentctl [options] COMMAND__      __  _____ ____ ____ ___  / /_____/ /_/ // _ '/ _ '/ -_) _ \/ __/ __/ __/ /\_,_/\_, /\__/_//_/\__/\__/\__/_//___/COMMANDSconfig      Manage agent configurationdump        Dump running stategenerate    Generate config samplesimport      Import config data from filekvdb        Manage agent data in KVDBlog         Manage agent loggingmetrics     Get runtime metricsmodel       Manage known modelsreport      Create error reportservice     Manage agent servicesstatus      Retrieve agent status and version infovalues      Retrieve values from schedulervpp         Manage VPP instanceOPTIONS:--config string            Path to config file.--config-dir string        Path to directory with config file.-D, --debug                    Enable debug mode-e, --etcd-endpoints strings   Etcd endpoints to connect to, default from ETCD_ENDPOINTS env var (default [127.0.0.1:2379])--grpc-port int            gRPC server port (default 9111)-H, --host string              Address on which agent is reachable, default from AGENT_HOST env var (default "127.0.0.1")--http-basic-auth string   Basic auth for HTTP connection in form "user:pass"--http-port int            HTTP server port (default 9191)--insecure-tls             Use TLS without server's certificate validation-l, --log-level string         Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")--service-label string     Service label for specific agent instance, default from MICROSERVICE_LABEL env var-v, --version                  Print version info and quitRun 'agentctl COMMAND --help' for more information on a command.$ docker exec -it vpp-agent agentctl config get
netallocConfig: {}
linuxConfig: {}
vppConfig: {}

FD.io/VPP — VPP Agent — Quickstart相关推荐

  1. FD.io/VPP — IPSec

    目录 文章目录 目录 VPP/IPSec Configuration Use case 1 HTTP Server configuration strongSwan initiator configu ...

  2. FD.io/VPP — VPP 的配置与运行

    目录 文章目录 目录 配置 80-vpp.conf startup.conf 可以配置 VPP 的 Threading Modes 运行示例 non-DPDK 模式运行 VPP DPDK 模式运行 V ...

  3. FD.io/VPP — VPP 的安装部署

    目录 文章目录 目录 源码编译安装 Troubleshooting 问题 1:Errors were encountered while processing 问题 2:NASM is not ins ...

  4. FD.io/VPP — Overview

    目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...

  5. FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接

    目录 下载RPM/DEB包 往期文章回顾与推荐 FD.io是一些项目和库的集合,基于DPDK并逐渐演化,支持在通用硬件平台上部署灵活可变的业务.FD.io为软件定义基础设施的开发者提供了一个通用平台, ...

  6. FD.io VPP官方邮件列表

    https://www.mail-archive.com/vpp-dev@lists.fd.io/ 邮件内容更新截至2020年9月21日17:23:47 Messages by Thread [vpp ...

  7. FD.io VPP:用户文档:VPP RPM包的构建与离线安装

    VPP RPM包的构建与离线安装 RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过设置代理 ...

  8. FD.io VPP:CentOS7下构建自己的VPP RPM包

    FD.io VPP:用户文档 构建VPP RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过 ...

  9. FD.io VPP的C语言接口如何使用:FD.io VPP: How To Use The C API

    目录 引言 - Introduction C语言API概述 - C API Overview 运行环境 - The Runtime Environment API回顾 - Message API Re ...

  10. How-to: Build VPP FD.IO development environment with Mellanox DPDK PMD.

    目录 References Prerequisite Installation, Compilation and Configuration VPP is an open-source Vector ...

最新文章

  1. 自定义DataSet
  2. 解决 ubuntu 14.04.1 下一个sublime text3 3065 中国输入的问题
  3. Nacos(十一)之NacosSync 介绍
  4. pip修改下载源为国内源 linux系统
  5. Microsoft SQL Server 2005 CTP 简体中文版
  6. 斯坦福 CS183 Peter Thiel 创业课资料整理
  7. 总结过去10年的程序员生涯_给程序员的一些总结性忠告
  8. 2021-05-31驱动总裁万能网卡版
  9. python模块使用手册_Python中文手册-Python模块
  10. python汉化包放哪_python 汉化
  11. 如何加密PDF?使用福昕PDF编辑器加密PDF文件实操
  12. redis获取哈希类型的值,hget、hmget、hgetall
  13. python解码base64_Python Base64转码解码
  14. 【win10+cuda7.5+cudnn6.0安装caffe⑥】报错及处理方式
  15. 【软件应用】word数学公式插件TeXsword安装
  16. 与 ST_Geometry 配合使用的 SQL 函数
  17. 权重衰退之罚(规则项)
  18. modern android5.1,Modern版IT之家v5.1.1更新:ARM版重构+横屏模式修复
  19. ASP.NET下FCKeditor配置方法全解
  20. SimpleDateFormat 带纳秒时间的处理

热门文章

  1. c++ 暂停功能_app下载功能背后的逻辑
  2. iOS cell 里需要创建n个元素
  3. 脑机接口EEG信号分类算法
  4. 共空间模式 Common Spatial Pattern(CSP)原理和实战
  5. 统计学习方法笔记(九)-最大熵原理及python实现
  6. c 创建mysql实体模型_EntityFrameworkCore 根据实体类自动创建数据库
  7. 贝佐斯明抢马斯克太空生意:数十亿美元组卫星互联网,5年内发射3236颗卫星...
  8. 8坨穿越千年的便便,让哈佛科学家找到治疗糖尿病的线索 | Nature
  9. 俄罗斯黑客收到500万美元赎金!美国燃油管道商认怂,民众为抢汽油大打出手...
  10. 倒计时2天!AI大咖云集、30场技术公开课,还有乐队... 年度最有意思的AI开发者活动来了!...