将Catalyst9300上的Prometheus Exporter作为Docker容器运行

首先,

由于Catalyst9300的IOS XE 16.12.1开始原生支持Docker容器,因此将Prometeus Exporter作为Docker容器运行。

请参考以下文件,了解Catalyst9300对本地Docker容器的支持。

[Qiita] 尝试使用Catalyst9300进行Docker应用托管
https://qiita.com/tetsusat/items/ec11ddb70197b24175e8

【思科官方文档】可编程配置指南:应用托管
链接:https://www.cisco.com/c/zh_cn/td/docs/ios-xml/ios/prog/configuration/1612/b_1612_programmability_cg/application_hosting.html

如何实现

使用Telegraf将作为遥测数据输入的信息以Prometheus Exporter格式输出,而不是使用容易变得复杂的SNMP Exporter。通过这样做,您可以使用一个配置适应来自路由器的任何指标信息。

Telegraf是什么?

Telegraf是一种插件驱动的服务器代理,用于从各种输入收集指标并将其发送到不同的输出。由于对输入和输出都是插件驱动的,所以可以轻松进行扩展。 它由Go编写,并编译为没有外部依赖的单个二进制文件,所需的内存占用量最小化。

[InfluxData官方] Telegraf
https://www.influxdata.com/time-series-platform/telegraf/

[InfluxData官网] Telegraf
https://www.influxdata.com/time-series-platform/telegraf/

思科遥测_MDT插件

Cisco Telemetry MDT通过Telegraf Input插件,从Cisco IOS XR、IOS XE和NX-OS平台收集遥测数据。

[GitHub] cisco_telemetry_mdt
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cisco_telemetry_mdt

【GitHub】cisco_telemetry_mdt
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cisco_telemetry_mdt

prometheus_client插件

prometheus_client是Telegraf Output插件,用于将Telegraf收集的指标数据导出给Prometheus服务器。

【Github】prometheus_client
https://github.com/influxdata/telegraf/tree/master/plugins/outputs/prometheus_client

【Github】prometheus_client
https://github.com/influxdata/telegraf/tree/master/plugins/outputs/prometheus_client

准备

首先,我們將在一台普通的Linux伺服器上嘗試。我們將使用InfluxData公司維護的Docker官方映像檔作為我的Docker映像檔。

    https://hub.docker.com/_/telegraf

拉取 Docker 镜像。

$ docker pull telegraf:1.12.4-alpine

我将创建Telegraf配置文件的模板。

$ docker run --rm telegraf:1.12.4-alpine \
      telegraf -sample-config \
      --input-filter cisco_telemetry_mdt \
      --output-filter prometheus_client > telegraf.conf

我们将取消outputs.prometheus_client部分中collectors_exclude行的注释。

...
# Configuration for the Prometheus client to spawn
[[outputs.prometheus_client]]
  ## Address to listen on
  listen = ":9273"

  ## Use HTTP Basic Authentication.
  # basic_username = "Foo"
  # basic_password = "Bar"

  ## If set, the IP Ranges which are allowed to access metrics.
  ##   ex: ip_range = ["192.168.0.0/24", "192.168.1.0/30"]
  # ip_range = []

  ## Path to publish the metrics on.
  # path = "/metrics"

  ## Expiration interval for each metric. 0 == no expiration
  # expiration_interval = "60s"

  ## Collectors to enable, valid entries are "gocollector" and "process".
  ## If unset, both are enabled.
  collectors_exclude = ["gocollector", "process"]
...

开始运行。

$ docker run -d --name=telegraf \
      -p 57000:57000 \
      -p 9273:9273 \
      -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
      telegraf:1.12.4-alpine

我会确认它已正确启动。

$ docker logs -f telegraf
2019-11-11T12:15:52Z I! Starting Telegraf 1.12.4
2019-11-11T12:15:52Z I! Using config file: /etc/telegraf/telegraf.conf
2019-11-11T12:15:52Z I! Loaded inputs: cisco_telemetry_mdt
2019-11-11T12:15:52Z I! Loaded aggregators:
2019-11-11T12:15:52Z I! Loaded processors:
2019-11-11T12:15:52Z I! Loaded outputs: prometheus_client
2019-11-11T12:15:52Z I! Tags enabled: host=2cd9e20e70b1
2019-11-11T12:15:52Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"2cd9e20e70b1", Flush Interval:10s

Catalyst应用程序托管

希望能够像在普通的Linux服务器上运行时那样,在启动Docker容器时从Catalyst的Flash等传递Telegraf的配置文件。但我没有找到这种方法,所以我将Telegraf的配置文件直接嵌入Docker镜像中。如前所述,无论是什么遥测数据,Telegraf的配置文件只需一种模式即可,所以就这样吧,不用担心,我会搞定的。

首先,需要在Linux环境下进行操作以构建Docker映像。

在当前目录下创建如下的Dockerfile。

FROM telegraf:1.12.4-alpine
COPY telegraf.conf /etc/telegraf/telegraf.conf

构建Docker镜像。

$ docker build -t telegraf_prom .

以Tar格式输出构建的Docker镜像。

$ docker save telegraf_prom -o telegraf.tar

用某种方式将Docker镜像以Tar格式复制到Catalyst的Flash中。

从这里开始,在Catalyst上进行工作。

我将配置应用程序托管的设置。

app-hosting appid telegraf
 app-vnic management guest-interface 0
  guest-ipaddress 192.0.2.101 netmask 255.255.255.0
 app-default-gateway 192.0.2.254 guest-interface 0
 app-resource docker
  run-opts 1 "-p 57000:57000"
  run-opts 2 "-p 9273:9273"
 app-resource profile custom
  cpu 7400
  memory 2048

将之前创建的Docker镜像安装到应用程序托管平台上。

Switch#app-hosting install appid telegraf package flash:telegraf.tar

激活应用托管。

Switch#app-hosting activate appid telegraf

开始运行应用程序托管。

Switch#app-hosting start appid telegraf

我們在 Catalyst 中進行遙測的設定。

telemetry ietf subscription 1
 encoding encode-kvgpb
 filter xpath /process-cpu-ios-xe-oper:cpu-usage/cpu-utilization/five-seconds
 source-vrf Mgmt-vrf
 stream yang-push
 update-policy periodic 1000
 receiver ip address 192.0.2.101 57000 protocol grpc-tcp
!
netconf-yang

当您使用浏览器访问http://192.0.2.101:9273/metrics时,应该能够将数据成功导出到Prometheus服务器。顺便提一下,source中显示的是Catalyst管理接口的IP地址,它是Telemetry数据的发送源。

$ curl 192.0.2.101:9273/metrics
# HELP Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds Telegraf collected metric
# TYPE Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds untyped
Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds{host="772599aa3993",source="192.0.2.1",subscription="1"} 3

结束了

广告
将在 10 秒后关闭
bannerAds