VPP Agent Getting Started

容器部署

部署 docker

$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

拉取 vpp-agent 镜像

镜像包含 vpp-agent 和 vpp

$ docker pull ligato/vpp-agent

拉取 etcd 镜像 和启动 etcd

$ docker pull quay.io/coreos/etcd:v3.1.0
$ docker run -p 2379:2379 --name etcd --rm quay.io/coreos/etcd:v3.1.0 /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379

启动 vpp-agent 和 vpp

docker run -it --rm --name vpp-agent -p 5002:5002 -p 9191:9191 --privileged ligato/vpp-agent

查看信息

docker ps -f name=vpp-agent

编译部署

安装 go

$ wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.16.7.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin

拉取代码

git clone  https://github.com/ligato/vpp-agent.git

编译最新稳定版本

使用国内代理

$ export GO111MODULE=on
$ export GOPROXY=https://goproxy.cn

编译

$ cd vpp-agent
$ make cmd

查看对应的二进制

$ ls cmd

设置配置

创建配置集目录

$ mkdir /opt/vpp-agent/dev

/opt/vpp-agent/dev/etcd.conf

insecure-transport: true
dial-timeout: 1s
endpoints:
 - "127.0.0.1:2379"

/opt/vpp-agent/dev/grpc.conf

endpoint: 0.0.0.0:9111

/opt/vpp-agent/dev/supervisor.conf vpp-agent-init 使用

programs:
  - name: "vpp"
    executable-path: "/usr/bin/vpp"
    executable-args: ["-c", "/etc/vpp/vpp.conf"]
  - name: "agent"
    executable-path: "/bin/vpp-agent"
    executable-args: ["--config-dir=/opt/vpp-agent/dev"]
hooks:
  - cmd: "/opt/vpp-agent/dev/init_hook.sh"

/opt/vpp-agent/dev/init_hook.sh

#!/usr/bin/env bash

terminate_process () {
    PID=$(pidof $1)
    if [[ ${PID} != "" ]]; then
        kill ${PID}
        echo "process $1 terminated"
    fi
}

if [[ "${SUPERVISOR_PROCESS_NAME}" = "agent" && "${SUPERVISOR_PROCESS_STATE}" = "terminated" ]]; then
    terminate_process vpp-agent-init
fi

if [[ "${SUPERVISOR_PROCESS_NAME}" = "vpp" && "${SUPERVISOR_PROCESS_STATE}" = "terminated" ]]; then
    terminate_process vpp-agent-init

启动

$ ./vpp-agent -config-dir=/opt/vpp-agent/dev

测试一下

$ curl -X  GET http://localhost:9191/dump/vpp/v2/interfaces

Astri 分支部署

拉取分支

$ git clone -b main http://gitlab.sh.99cloud.net/5GS/vpp-agent.git

编译生成 deb 包

$ cd vpp-agent
$ git tag -a v1.0 -m "test"
$ make deb

安装

$ sudo dpkg -i docker/astri/*.deb

配置文件

redis-server 的配置文件,使用 docker/astri/prod/redis-server.conf

vpp-agent 配置文件位于 /etc/vpp-agent 下

redis.conf

# NodeConfig
db: 0
dial-timeout: 0
enable-query-on-slave: false
endpoint: 127.0.0.1:6379
password: ""
pool:
  busy-timeout: 0
  idle-check-frequency: 0
  idle-timeout: 0
  max-connections: 0
ead-timeout: 0
tls:
  ca-file: ""
  cert-file: ""
  enabled: false
  key-file: ""
  skip-verify: false
write-timeout: 0

vpp-ifplugin.conf ifplugin stopwatch 数据库

stopwatch: true
status-publishers: [etcd, redis]

vpp-ifplugin.conf

stopwatch: true
status-publishers: [etcd, redis]

filedb.conf

# A set of files/directories with configuration files. If target is a directory, all .json or .yaml files are read.
configuration-paths: ["/etc/vpp-agent/"]

# Path where the status data will be stored. If not defined, status is not propagated. File extension determines
# whether the data will be stored as .json or .yaml. Target may cannot a directory.
status-path: "/etc/vpp-agent/ha.json"

vpp-upfplugin.conf

# VPP agent allows to send context data back to ETCD/Redis.
# To allow it, add desired status publishers. Currently supported
# for [etcd] and [redis] (both options can be chosen together)
publishers:
  - redis
instanceid: "upfconfig-123"
grpcserver: "mp.default.svc.cluster.local:8081"

启动

$ vpp-agent

调试

安装调试工具

$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv

调试

$ dlv exec vpp-agent/cmd/vpp-agent -- -config-dir=/etc/vpp-agent

如果调试失败,可以尝试直接 go build 生成二进制文件

$ cd vpp-agent/cmd/vpp-agent
$ go build