云原生之深入解析Kubernetes Pod的网络状态监控

2023-09-15 14:42:42

一、前言

  • 在 Kubernetes 系统里,由 kubelet 内置的 cadvisor 组件收集每个容器资源监控信息,但官方基于性能相关的考虑,如果抓取这些每个容器中网络相关的指标,将会耗费大量的 CPU 内存资源,cadvisor 中默认给关掉了网络等相关指标的收集。
    • https://github.com/google/cadvisor/blob/master/docs/runtime_options.md#metrics
    • https://github.com/kubernetes/kubernetes/issues/60279
  • 因此在 prometheus 默认抓取的 kubelet cadvisor metrics 端点,监控上报的数据中,容器网络相关的指标 container_network_tcp_usage_total 和 container_network_udp_usage_total 等都为0,但实际业务监控中可能需要这些指标的收集,用于监控告警以及排查问题。

二、方案①

  • 如果想要从 cadvisor 中获取这些指标,需要修改 kubelet 文件里的配置,即需要修改 kubelet 源码并重新编译,这个并不 native。
  • 另一种方案是自己部署 cadvisor daemonset,并开启 tcp网络指标的收集,使用 prometheus 来抓取这些指标,但这样就是重复部署了 cadvisor 组件,并且经过测试,部署的 cadvisor 在 64C384G 运行有 300 个 container 的物理机上占用了5核CPU和5G内存的资源,资源占用巨大,这也是 cadvisor 默认关闭网络指标收集的原因。同时 prometheus 的抓取配置文件也需要修改,不然会同时抓取生成两份 cadvisor 指标。
  • 经过以上测试,采用额外 cadvisor 部署并使用 prometheus 抓取的方案资源消耗巨大,会有重复指标的收集,并且需要自己再次从 prometheus 中查询处理并上传到 open-falcon 监控平台。

三、方案②

  • 想要获取每个容器内的网络连接指标,在每个容器中内置监控组件并不现实,并且容器的网络指标收集与虚拟机的网络指标收集有差异,监控 agent 并不通用。
  • 我们知道容器的虚拟化是利用 namespace 把每个进程的网络做了隔离,使用 nsenter 工具可以在每个进程的网络空间内执行相关的网络操作命令,请参考:Docker: any way to list open sockets inside a running docker container?
  • 另外,项目容器名与宿主上设备的映射关系可以通过 docker 的 api 来查到,比如 pid 进程对应关系以及网卡设备对应关系等。
  • 通过以上可知,自己手动编写脚本,只抓取需要的网络指标数据,在宿主机上定时执行获取每个应用容器的网络状态并格式化为监控数据格式上传到 open-falcon 监控平台中,做统一的监控告警。
  • 以 ss --summary 为例,显示了各种状态的 tcp 连接情况,以及 udp 等连接情况,读取统计到的数据字段:
Total: 141267 (kernel 7503901)
TCP:   28090 (estab 80, closed 27999, orphaned 139, synrecv 0, timewait 6586/0), ports 0

Transport Total     IP        IPv6
*   7503901   -         -
RAW   0         0         0
UDP   3         3         0
TCP   91        91        0
INET   94        94        0
FRAG   0         0         0
  • 在上述配置的机器(64C384G 运行有 300 个 container 的物理机)中执行效率在分钟级。
  • 使用 ss 命令获取网络状态信息较慢,考虑两个优化:
    • 将串行执行每个容器的网络状态命令,改为多线程并发执行,控制并发数并注意 CPU 的消耗使用;
    • 将通过 ss 命令获取信息改为直接读取 /proc/{pid}/net/sockstat 文件获取对应进程的网络状态统计信息。

四、方案③

  • 使用方案②的优化版本,不使用 ss 命令来获取每个容器网络空间的网络状态,直接读取每个容器对应 pid 下的 sockstat 文件,即 /proc/{pid}/net/sockstat 文件,效率比 ss 命令快很多,并且通过 docker api 与 docker 交换,获取运行的每个容器对应的 pod name 和 pid 信息,效率比执行命令快很多。
  • sockstat 文件信息:
sockets: used 141118
TCP: inuse 89 orphan 96 tw 7181 alloc 21341 mem 13896
UDP: inuse 3 mem 116
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
  • TCP inuse 是的值是取自 tcp4_hashed+tcp6_hashed,是正在使用的 TCP 套接字的数量,而不是 establish 状态的 tcp 连接;establish 状态的 tcp 连接状态需要从 /proc/net/snmp 文件中获取,读取 CurrEstab 字段。
  • 该方案将网络连接的 Establish、InUse、TimeWait、Orphan、Total、UDP 六个状态值上报到 open-falcon 监控平台中,从而获得 prometheus 监控中没有的容器内部网络连接状态,做数据监控告警。
  • 在上述配置的机器(64C384G 运行有 300 个 container 的物理机)中执行效率在毫秒级 (300ms 左右),内存消耗约 40M,所以该项目使用方案③实现。
更多推荐

大数据-玩转数据-Flink SQL编程

一、概念1.1ApacheFlink两种关系型APIApacheFlink有两种关系型API来做流批统一处理:TableAPI和SQL。TableAPI是用于Scala和Java语言的查询API,它可以用一种非常直观的方式来组合使用选取、过滤、join等关系型算子。FlinkSQL是基于ApacheCalcite来实现

【云原生】k8s存储管理中ConfigMap & Secret的使用

目录1ConfigMap1.1简介1.2优点1.3定义ConfigMap1.4使用2Secret2.1简介2.1定义Secret2.2使用1ConfigMap1.1简介在Kubernetes中,ConfigMap是一种用于存储非敏感信息的Kubernetes对象。它用于存储配置数据,如键值对、整个配置文件或JSON数据

【K8S系列】Weave Net 故障排除的常见问题和解决方案

写在前面当使用WeaveNet进行容器网络配置时,可能会遇到一些常见的故障情况。以下是一些常见问题及其解决方案:问题列表1节点无法加入WeaveNet网络解决方案检查节点之间的网络连通性,确保可以通过IP地址相互访问。检查节点的防火墙设置,确保允许WeaveNet的流量通过。确保在每个节点上正确安装了WeaveNet,

04-前端基础CSS第二天

01-CSS第二天导读目标:能使用emmet语法能够使用CSS复合选择器能够写出伪类选择器的使用规范能够说出元素有几种显示模式能够写出元素显示模式的相互转换代码能够写出背景图片的设置方式能够计算CSS的权重目录:Emmet语法CSS的复合选择器CSS的元素显示模式CSS的背景CSS的三大特性CSS的注释02-emmet

在字节当了几个月的牛马,醒悟了。

作者:阿秀InterviewGuide大厂面试真题网站:https://top.interviewguide.cn小伙伴们大家好,我是阿秀。以前也分享过不少实习体验,比如去年就分享了一位师弟的美团实习体验:美团实习三个月,我受益良多,今天来分享一下一位学习圈中学弟的字节实习体验。他周围同事都是硕士起步,只有他是双非本,

Java毕业设计-基于SpringBoot的租房网站的设计与实现

大家好,今天为大家打来的是基于SpringBoot的租房网站的设计与实现博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录一、前言介绍二、主要技术三、系统设计(部分)3.1、主要功能模块设计3.

普中51-矩阵按键

矩阵按键原理图如下:行列扫描行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所

Web自动化测试理解

最近几天,由于工作需要接触Web自动化测试,所以我从网上找的资料,学习了解,然后自己总结汇总的随笔,如文章中有不足的地方,请大家多多指教;或者文章内容与他人相似,望见谅。手工测试跟自动化测试区别:手工测试:就是由人去一个一个输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。自动化测试:自动化测试

植隆业务中台与金蝶云星空对接集成服务工单查询接口连通应收单新增(6202-开票申请(代理商-销售类))

植隆业务中台与金蝶云星空对接集成服务工单查询接口连通应收单新增(6202-开票申请(代理商-销售类))数据源系统:植隆业务中台承载了企业核心关键业务,是企业的核心业务能力,也是企业数字化转型的重点。业务中台的建设目标是:“将可复用的业务能力沉淀到业务中台,实现企业级业务能力复用和各业务板块之间的联通和协同,确保关键业务

竞赛选题 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录1前言2情感文本分类2.1参考论文2.2输入层2.3第一层卷积层:2.4池化层:2.5全连接+softmax层:2.6训练方案3实现3.1sentence部分3.2filters部分3.3featuremaps部分3.41max部分3.5concat1max部分3.6关键代码4实现效果4.1测试英文情感分类效果

72、Spring Data JPA 的 Specification 动态查询

Specification:规范、规格★Specification查询它也是SpringData提供的查询——是对JPA本身Criteria动态查询的包装。▲为何要有动态查询页面上常常会让用户添加不同的查询条件,程序就需要根据用户输入的条件,动态地组合不同的查询条件。JPA为动态查询提供了Criteria查询支持。Sp

热文推荐