SONiC Telemetry/gNMI 探究
SONiC Telemetry 是 SONiC 的遥测服务,其原分支位于GitHub - sonic-net/sonic-telemetry
但是该分支已经在2022年8月被归档
新的分支位于 GitHub - sonic-net/sonic-gnmi
从代码结构上看,两者代码和功能相同,最大的区别是从 Azure/sonic-telemetry 转移到了 sonic-net/sonic-gnmi
前置知识:什么是gNMI,它和gRPC是什么关系
gNMI是一套基于gRPC的标准化网络管理接口
gRPC是由google研发的RPC消息框架
RPC是远程过程调用的简称,gRPC通过在不同的应用程序之间内置gRPC Server和 gRPC Stub完成通信
gRPC架构,来自其官网
ProtoBuf是一套灵活的接口定义语言,其可以通过 potoc
方便的生成各种语言的接口
如有以下内容的Protobuf文件
syntax = "proto3";
// The greeter service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
该定义声明了一个SayHello接口,并定义了当传递字符量name的HelloRequest时,返回字符量message的Response.
通过protoc工具,则可以通过生成其在各种语言中的调用方法
#生成C++中的protobuf调用
protoc --cpp_out=cpp_out/ hello.proto
#生成Python中的protobuf调用
protoc --python_out=cpp_out/ hello.proto
扩展: 为什么纯C没有Protobuf的官方支持?
并不是说C完全没有Protobuf的支持,仍然有C的网络项目提供了Protobuf样例,例如FRR。
但是gRPC官方推荐的通信手段是HTTP/2,C语言本身没有HTTP/2标准库,而不同平台上移植HTTP/2附加的TLS、其他加密压缩、流控特性也是不同的,故而protoc
没有提供标准的C代码生成
但通过C代码结合第三方库去实现一个gRPC服务端/客户端是完全可行的
主线:gNMI?
在了解前置知识以后,回到gNMI本身,
gNMI是来自openconfig的开源网络管理接口(Network Management Interface)
一般作为接口,那么必然(或者在遥远的未来必然)会有相应的实现。
而gNMI官方便提供了一个相应的实现
该如何使用它?
官方的说明是
go get -u github.com/openconfig/gnmi/cmd/gnmi_cli
但该方法在最新的golang上面实测已经不可用
#应当使用
go install github.com/openconfig/gnmi/cmd/gnmi_cli@latest
来安装
Q: 为什么我安装以后仍然找不到该文件
对于go而言,其安装是编译可执行文件并拷贝到 GOPATH 中的 bin 目录,通常这种情况是没有将GOPATH加入到PATH环境变量中,可以使用该方法找到文件
moxi@Morxi-workstation:~$ go env | grep GOPATH
GOPATH="/home/moxi/go"
moxi@Morxi-workstation:~$ cd /home/moxi/go
moxi@Morxi-workstation:~/go$ ls
bin pkg
moxi@Morxi-workstation:~/go$ cd bin/
moxi@Morxi-workstation:~/go/bin$ ls
gnmi_cli
gnmi_cli提供的功能可以很方便的在这里找到,
gnmi/cmd/gnmi_cli/gnmi_cli.go at master · openconfig/gnmi · GitHub
是不是一直没出场:SONiC Telemetry/SONiC-gNMI
在上一章节引入了 gNMI CLI , 那么对应的 gNMI Server 呢 ?
OpenConfig自己又不生产网络设备,这事就轮到了SONiC,SONiC提供了一个框架,供厂商去实现
来自其项目首页
左边的 gNMI server 和 gNMIDiaout Publish service 便是 gNMI 在SONiC中的实现
说白了就是可以从机器上的各种模块把数据取出来,但是分成了两个服务端。一个服务端对外是被动的,被链接以后会主动的发数据,另一个服务端对外是主动的,会主动连接外部的服务端去发送数据
SONiC-gNMi往gNMI里面添加了一些patch,和openconfig的gNMI有略微区别,它在README里面讲到了这些差异 gnmi_cli is updated with following args
gNOI
在 gNMI 的 test_server 里面,有一套 gNOI 的依赖
gNOI是OpenConfig的一套接口,用于在网络设备上面执行特定的命令,
SONiC也给了相应的实现,其提供了如下功能
service SonicService {
rpc ShowTechsupport (TechsupportRequest) returns (TechsupportResponse) {}
rpc CopyConfig(CopyConfigRequest) returns (CopyConfigResponse) {}
rpc ImageInstall(ImageInstallRequest) returns (ImageInstallResponse) {}
rpc ImageRemove(ImageRemoveRequest) returns (ImageRemoveResponse) {}
rpc ImageDefault(ImageDefaultRequest) returns (ImageDefaultResponse) {}
rpc ClearNeighbors(ClearNeighborsRequest) returns (ClearNeighborsResponse) {}
}
把它跑起来:
Dial_in模式的Server
./telemetry --port 8080 -insecure true --allow_no_client_auth --logtostderr
Dial_in模式的下面通过gnmi_get获取数据
./gnmi_get -xpath_target COUNTERS_DB -xpath COUNTERS_PORT_NAME_MAP -target_addr 10.2.2.2:8080 -alsologtostderr -insecure true
#在设备上面启动服务
root@sonic:/# /usr/sbin/dialout_client_cli -insecure -logtostderr -v 1
#在一个外部服务其上面启动server
root@ASW:/tmp# ./dialout_server_cli -allow_no_client_auth -logtostderr -port 8081 -insecure -v 2
其中,insecure是不进行CA加密,这个在本地测试的时候比较有用,市场环境下务必部署证书
也可以直接在sonic上面本地登录然后启动验证,开两个SSH就行
这篇只是简单的梳理一下最近想到的一个模块,后续会逐步的将自己的实验环境整理好发出
Powered by Morxi/Moxi