网教网

搜索
查看: 122|回复: 5

基础网络运维架构(未完)

[复制链接]

2

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2023-1-12 08:55:28 | 显示全部楼层 |阅读模式
前言

因为内部设备较多,且涉及协议较复杂(主要是IS-IS和BGP)所以在此做个留档。一些内容做了脱敏处理。各种设施我已知的一些技术点都放在附录里。我主要负责上层应用中告警治理这一块。本文主要是为了留档以及对自己做个计划。会简单介绍各个组件的作用功能,然后主要内容放在告警治理和故障处理优化这一块。

底层基础设施


CMDB

运维主要是针对现有的网络架构和设备进行的,所以很少涉及到搭建环节,搭建环节已经由交付的同学给我们做好了。线上设备主要是POP点和DC内的设备。线上设备的所有信息都会存在CMDB中。如需要判断交换机的厂商,获取SN,接口下挂服务器等信息,则需要调用CMDB相关的API。

SNMP监控

监控是必不可少的,对于网络设备来说,SNMP是一个很好的获取信息的方式,内部的SNMP监控不是我写的,看上去像是魔改的Prometheus,数据库用的influxdb。主要针对设备的接口状态(UP还是Down),接口流量等进行监控,然后根据时间进行打点,再把这些点串起来。例如:当接口的Operate状态和Admin状态不一致时(例如接口下执行了no shutdown但是模块坏了,就属于operate和admin状态不一致。如果两个都是Down或者都是Up,则为正常状态)会推送到统一的告警平台,然后由统一告警平台推送企业微信消息产生告警。

Syslog服务器

对于一些比较难搞或者比较复杂的项目,则使用Syslog监控,其原理是以Region为单位部署Syslog服务器,其功能是收集所有设备的Syslog。Syslog服务器的IP是一个AnycastIP,所以设备会将Syslog上报到离自己最近的Syslog以保证实效性。针对一些常见的Syslog,如BGP邻居Down,路由超过限制,BFD抖动,NQA失败等,使用正则去管理需要告警的Log并推送到统一告警平台。另外所有Log会存入Es中方便后续查找。
底层基础设施大概就这么多,那么目前我们有的组件如下图所示。



网元就是各种网络设备



SNMP监控



Syslog服务器管理界面

有了如上的基础设施以后,就可以搭建一些东西了。另外这边非常不推荐在设备较多的时候使用netmiko或者paramiko直接对设备进行读写操作。一是不安全,二是如果有多人同时去做一些操作的话难免会出现问题。所以需要有一个中间层,对下操作网元,对上暴露接口,统一管理。当有多人请求时对设备加锁也好排队也好,总之底层不建议对设备进行并发操作。

中间层组件

这一层主要是针对一些特定的操作进行的定制化组件。运维方面,在大部分时间我都很少需要批量对设备下配置。更多的其实是读取配置。目前我已知的组件如下
配置数据库

定期拉取CMDB中所有上线状态交换机的裸配置(就是show running或者displ cu)直接干进数据库,不做任何序列化操作。后端数据库使用Mongo

交换机信息数据库

定期拉取CMDB中所有上线状态交换机的状态。例如LLDP信息,路由表,BGP邻居等状态配置,对上层应用提供查询的功能。这个里面的数据非实时的。主要是提供有时候服务器要和交换机建立BGP需要查询AS号的BGP AS数据,或者需要绘制拓扑图的场景要查询LLDP之类的信息所使用的冷数据。该数据对实时性要求没那么高 ,所以是一天刷一次。
命令行驱动

使用gRPC调用,下发操作者想要的命令,返回交换机回显的结果。当然该接口也会有限制,QPS不能太高否则如果有人对着设备疯狂拿诊断日志就会把设备弄死。这里还涉及一个安全网关。但是我作为使用者大部分情况下是不感知的。所以这里就不说了。当然,我作为使用者不能直接调用这个驱动,需要开发命令行驱动的同学给我再封装一层接口。比如我想获取交换机某个BGP邻居的实时状态,那么就需要单独开发一个获取BGP状态的接口提供给我。
上层应用

告警平台和告警推送

一线的同学们有一个告警平台,全公司所有的告警都会在该平台上注册,根据注册时的配置决定是否将告警推送到企业微信。如下图所示



BGP断了的告警

目前会由我写的自动化组件去判断邻居是否UP。如果已经自己恢复了就会弹出如下信息。



自动完成

其实告警平台的原理也很简单。我们用的是企业微信,企业微信可以做机器人,从上文提到的Syslog服务器收到一条log以后,如果匹配配置页面提供的正则,就会给到告警平台,告警平台再给到企业微信机器人就最终会呈现出这个效果。

当然文章到目前为止,我们只看到了Syslog--->告警平台这条线。其他的组件好像并没有用上。后面的文章会接着介绍其他的组件和功能以及需要优化的点。

故障处理

针对一些常见的故障,目前是走的告警回调,整个流程如下


告警回调是指触发告警时,统一告警平台会将告警信息发到配置的API中。大部分故障处理的逻辑都是如此。目前能覆盖的告警后文会介绍并给出详细判断逻辑。
BGP邻居Down告警

内网大部分都是BGP的。这里会有几个点
1、有时候我们交换机互联的服务器下线了,针对这些告警,我认为业务方应该有自己的服务器监控,我们无需再监控业务方的服务器的BGP状态。所以会针对BGP的邻居地址进行判断,若在CMDB中查询到是服务器的地址,则无视该告警。
2、如果不是服务器(也就是CMDB中针对邻居地址查不到服务器)那么就需要调用之前提到的BGP邻居状态接口。如果在检查的时候已经是Established,则无视该告警,如果不是,则会弹出一个比较显眼的红字,如下图


再来一次就是字面意思再检查一次(有时候交换机在海外就会特别慢,后端会超时)
新增代办是在我们自己的在线表格里新增一条记录(一般是真的有故障的时候就会记一下,方便交接和统计工作量)
接口Down

类似BGP邻居down,不过该项比较简单,是通过SNMP监控获取的状态,然后推送到统一告警平台。如下图


类似BGP,也会有自动检查程序,一开始是通过SNMP获取,后期也是通过下发命令的方式获取的(为了统一后端接口的操作,而且那个SNMP的后端也没有在用了)
接口误码(CRC)

这个是通过SNMP监控获取的,每分钟获取接口下Errors的数量,如果超过1就会上报告警平台。


交换机互联的部分需要人来处理(主要是让机房现场人员去更换模块或者线缆)。但是互联服务器部分不能直接更换。有的服务器做了bond可以换,但是有的服务器没有冗余,直接拔线容易出事。所以这里也需要在CMDB中查询交换机下联的是不是服务器。如果是服务器的话需要一线同学通知业务方,由业务方评估是否更换线缆,模块。


不足和需要优化的点

告警过多的问题



如上图所示,交换机A和B之间的接口如果抖动一次,极端情况下,则会产生4条告警。

  • 交换机A的邻居down
  • 交换机B的邻居down
  • 交换机A的接口状态不一致
  • 交换机B的接口状态不一致
而实际上,由于SNMP监控1分钟采一个点,实际上小于1分钟的接口抖动是观察不出来的。所以可能只会产生2条告警。这一点需要优化。目前我想的是通过Syslog监控接口抖动的日志,但是这样的话接入层交换机每天会有大量的接口down。这一点很头痛。
容易被忽略的告警

还是如上图,交换机AB之间如果邻居反复抖动,由于自检的存在,是观察不出来的。因为会一直被自检自动完成。运维人员很难去一直盯着告警看。所以还需要一个带统计功能的组件。定时统计每个设备每个邻居抖动的次数。这样能够有效观察到一直在抖动的BGP邻居。

愿景

其实BFD抖动,BGP抖动这种肯定不是根因,很多故障其实查到最后就是某个接口频繁抖动但是各种监控都不可视,因为监控粒度问题。

以及各种丢包是不是和流量有关(之前遇到过流量跑高导致的丢包)

是否可以根据一些告警之间的关联性去做告警判断。以及在长链路的排查中是否可以自动去做一些基础的基线检查。我们来设想一种场景,两个机房的服务器互访有丢包。目前需要排查网络这边的问题。当然不一定是网络的问题,服务器的负载以及服务器本身的服务都有可能有问题。这种多链路的排查是比较头疼的。看看下面的拓扑就让人头皮发麻。


上图是内部的路由生成工具,一开始是拿python写的但是已经年久失修了。最近准备用golang重写。如果读者感兴趣可以单独开一篇介绍。

总之在多链路排障的时候,每一根黄色的线都有可能出问题。因为内部采用CLOS架构,每个设备都会有大量负载路由。这个时候既然我们每个设备都是上线的,那么SNMP监控,Syslog服务器肯定都有相关的数据。是否可以自动化拉一波基本的信息,例如每个接口有没有误码和no buffer丢包,是否有接口抖动,BGP抖动,BFD抖动等等(之前都是人肉去一个个看的。非常痛苦)。图上的链路还算少的。真的碰到跨域的链路如果要人肉去查的话是真的很麻烦的一件事情。

代码部分

附录

组件涉及到的技术点

目前我已知的:
我自己的故障处理自动化是Python写的。最近在拿Go重写
Syslog是用Go写的,数据存在Es里。
SNMP监控是用Prometheus魔改的,数据库使用的influxdb。
一线同学用的告警平台是用Go写的。
配置数据库,交换机信息数据库都是用Go去抓取信息,然后序列化存在MongoDB中。
序列化尽量用textfsm解大表。比如路由表我们看的是display ip routing-table,然而这张表经常会有一些奇葩东西导致不好解,所以这边都是直接disp ip routing-table verbose。哪怕有多个下一跳也不会出现空行导致的正则没法写的情况。
命令行驱动是用Go写的。安全网关也是用Go写的。
自动化的同学针对命令行驱动外面还包了一层,我无法直接调用命令行驱动,而是给自动化的同学提需求,定制接口。例如我需要BGP邻居的信息,他们就会给我开发一个提供BGP邻居的接口。输入交换机IP和邻居地址,返回状态。
回复

使用道具 举报

1

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-1-12 08:56:09 | 显示全部楼层
[赞]请问cmdb有什么好用的推荐吗
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-12 08:56:36 | 显示全部楼层
额。。自己写[笑哭]
回复

使用道具 举报

0

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-1-12 08:57:06 | 显示全部楼层
无非就是对库的CRUD和对设备做基线检查确保录入的和实际的一致。后端好说。前端我不会。文章的CMDB是其他组的同学开发的,我只负责用[笑哭]
回复

使用道具 举报

1

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-1-12 08:58:06 | 显示全部楼层
苦于找不到合适的开源cmdb,但是这东西有很底层,没有它上层的事情又不方便。
回复

使用道具 举报

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-12 08:58:25 | 显示全部楼层
知乎上搜一下cmdb。挺多的[笑哭]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表