# 6-西邮Linux内核团队 **Repository Path**: jinkai719/team-1902077371 ## Basic Information - **Project Name**: 6-西邮Linux内核团队 - **Description**: 热爱开源,践行开放、自由和分享。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 4 - **Created**: 2022-07-15 - **Last Updated**: 2025-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 6-容器网络可视化-西邮Linux内核团队 ## 1. 项目背景 容器是一个用于开发,交付和运行应用程序的开放平台,容器技术将我们的应用程序与基础架构分开,从而快速交付软件。在实际的开发运维中,我们常用Kubernets编排管理容器,Kubernets是自动化容器操作的开源平台,这些操作包括部署、调度和节点集群间扩展,可以将我们常用的docker容器技术看作Kubernetes内部使用的低级别组件。随着k8技术的应用与推进,容器场景的微服务运维已经在向可视化方式演进,可视化最大的内容是API流可视化。我们可以通过基于Linux内核特性的新技术—eBPF,提供容器网络的可视化,由于BPF可以动态地插入控制系统的程序,使得实现强大的安全可视化功能成为可能。 ## 2. 项目目标 Tarsier 项目旨在设计一个云原生场景下网络运维的可视化系统。传统可视化运维手段是采取 side-car 方式来实现,但是这种手段存在性能低、部署复杂、通用性低等问题。Tarsier 项目基于 eBPF 技术提取 Linux 内核中的数据,通过数据分析和处理,对容器网络 API 流以及相关性能指标进行可视化展示,实现操作系统级监控Kubernetes 容器网络。 具体目标如下: - 基于eBPF技术采集系统关键指标,编写bcc程序提取内核数据,包括但不限于网络,如TCP连接信息,网络TCP协议流量,网络UDP协议流量,CPU占用率,内存占用率等; - 采用 Goland 语言 Gin 框架实现系统后端,可与前端交互,下发提取指标,存储于数据库,展示于前端; - 所有信息可以通过前端进行可视化观察,网络API拓扑可以在网页进行观察,其它性能指标可以在Grafana的图板中进行观察; - 分布式实现,将Tarsier应用于分布式环境。 ## 3. 项目现状 ### 3.1 现有系统功能介绍 目前 Tarsier 已实现了目标中的前三点,即完成了go开发后端,在前端下发要提取的内核指标,通过eBPF程序提取内核数据,容器网络间的API流拓扑图展示在前端,其它性能数据在 Grafana 上以图板形式展示。分布式环境下运行还在实现中。 ### 3.2 现有系统运行要求 环境要求:bcc、goland、docker 内核要求:Linux内核4.15+(openEuler 20.03 LTS上已运行成功) ### 3.3 基础技术支撑 Golang:⽤于web后端实现; Python:⽤于node节点的agent实现; eBPF:项⽬致⼒于推⼴的技术,内核中的执⾏虚拟机,可以实现⾃定义功能; Bcc:⼀个eBPF前端,提升了eBPF的易⽤性; Influxdb:在此项⽬中充当数据库的⻆⾊,⽤于存放node节点的性能数据; Grafana:⼀个前端展示⼯具,可以很便利地展示数据; Docker:使用容器用于快速高效地部署环境。 ## 4. 设计方案 ### 4.1 总体设计 本方案的设计主要分为两个部分,一是在 K8S Node 上基于eBPF技术设计数据采集模块 Tarsier-agent,二是在 K8S Master 上设计数据收集、管理和展示模块Tarsierd。系统总体框架如下图所示: ![](static/imgs/arch1.png) ### 4.2 Tarsier-agent 设计 #### (1)模块功能 Tarsier-agent 模块部署于 Kubernetus 集群中的各个 Kubernetus Node上,模块基于 eBPF 技术采集各个 Kubernetus Node 内核中进程粒度的网络数据,包括TCP连接信息、TCP网络吞吐量、TCP网络延时、UDP连接信息、UDP网络吞吐量等,计算出该进程所属容器的二级制信息,并将所有信息发送到 Kubernetus Master。 #### (2)技术路线 Tarsier-agent 模块主要做两件事,一是采集操作系统级的内核网络数据,二是发送数据到 Kubernetus Master上的 Tarsier。 采集操作系统级网络数据依赖的是eBPF,eBPF 可以看作一种内核虚拟机,在用户态下就可以用 Go 语言自定义满足我们需求的 bpf 程序。当 bpf 程序运行时,内核通过 LLVM 将 bpf 程序编译得到 bpf 指令集的 elf 文件,从 elf 文件中解析出可以注入内核的部分,用 `bpf_load_program` 方法完成注入。注入程序 `bpf_load_program()` 加入了更复杂的 verifier 机制,在运行注入程序之前,先进行一系列的安全检查,最大限度的保证系统的安全。经过安全检查的 bpf 字节码使用内核JIT进行编译,生成本机汇编指令,附加到内核特定挂钩的程序。最终内核态与用户态通过高效的 map 机制进行通信。BPF程序运行原理如下图所示: ![1609416054124](static/imgs/eBPF.png) Kubernetus Node 上的 Tarsier-agent 模块使用 go 语言编写 socket 客户端程序,把采集到的操作系统级的内核网络数据和它所属容器的二进制信息,通过 HTTP 以 json 格式发送到 Tarsierd 模块上的服务器进行下一步处理。 ### 4.3 Tarsierd 设计 #### (1)模块功能 Tarsierd 模块接收来自各个 Kubernetus Node 的网络数据,包括网络数据所属的二进制文件信息,将其存储在 Influxdb 数据库中,结合 API Server 中容器的部署信息,可视化展示容器网络 API 流以及相关性能指标,实现操作系统级监控Kubernetes 容器网络。 #### (2)技术路线 Tarsierd 模块主要做两件事,第一是接收来自 Kubernetus Node 上的网络数据并进行数据存储,第二是结合 API Server 中容器的部署信息可视化展示容器网络 API 流以及相关性能指标。 数据库采用 InfluxDB ,该数据库是用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖,主要用于存储涉及大量的时间戳数据。Tarsierd 模块采用 Go 语言编写服务器端程序,接收来自 Kubernetus Node 上 json 格式的内核网络数据和它所属容器的二进制信息,并将其存储在 InfluxDB 数据库中。 可视化展示采用Grafana,该工具是用 go 语言编写的开源应用,是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。 Tarsierd 接收到来自 Tarsier-agent 的网络数据及所属容器的二级制信息后,结合 API Server 中容器的部署信息,将可视化数据接口暴露给 Grafana ,Grafana 将容器网络 API 流以及相关性能指标进行可视化展示。 ## 5. 软件架构 ![](static/imgs/arch2.png) ## 6. 目录说明 ``` . ├── bcctest 存放所有的测试代码,包括bcc、influxdb等 ├── tarsier.pid 存放tarsier启动之后的pid号 ├── config.yaml 项目配置文件 ├── controllers 存放CLD分层中的controller层代码 ├── dao 存放CLD分层中的dao层代码 ├── docs 存放项目相关文档 ├── logger 存放zap日志库初始化相关代码 ├── logic 存放CLD分层中的logic层代码 ├── main.go ├── makefile ├── middlewares 存放项目中使用到的中间件,例如JWT ├── misc 存放项目中使用到的logo ├── models 存放项目中使用到的数据结构,例如user、BpfScan等 ├── node_modules 存放项目中使用到的node-influx ├── pkg 存放项目中使用的第三方库,例如JWT、snowflake等 ├── plugins 存放bcc插件 ├── routes 存放初始化路由相关代码 ├── settings 存放viper初始化相关代码 ├── static 存放静态HTML文件、图片等 ├── tarsier-in 存放influxdb数据 ├── test 存放配置、文件等 └── vendor 存放项目依赖库 ``` ## 7. 使用教程 ### 7.1 基本环境 - golang:go1.12及以上 - docker:influxd、grafana - bcc环境 ### 7.2 安装bcc环境 ```shell sudo yum install bcc ``` ### 7.3 安装依赖docker镜像 ```shell #for grafana sudo docker pull grafana/grafana #for influxdb sudo docker pull influxdb:1.8 ``` ### 7.4 编译并安装 ```shell git clone git@gitee.com:openeuler2020/team-1902077371.git cd team-1902077371 make ``` ### 7.5 运行 ```shell # 项目的所有配置均位于config.yaml中,grafana的默认端口为3000端口,influxdb的默认端口为8086,修改配置信息的方式如下: vim config.yaml #run grafana sudo docker run -d \ -p 3000:3000 \ --name=grafana \ grafana/grafana #run influxdb sudo docker run -d \ -p 8083:8083 \ -p 8086:8086 \ --name influxdb influxdb #run tariser make sudo ./tariser ``` ### 7.6 配置Influxdb ``` # 查看influxdb容器ID sudo docker ps # 进入influxdb容器 docker exec -it {influxdb容器ID} bash influx # 输入数据库用户名和密码 auth username: admin password: 123456 create database test_JQ exit ``` ### 7.7 配置Grafana (1)关闭openEuler防火墙,此操作为临时关闭: ```bash sudo systemctl stop firewalld sudo service iptables stop ``` (2)通过浏览器访问3000端口。如果是本地查看,则访问localhost:3000,如果远程访问,则访问`remoteip:3000`,openEuler没有图形界面,建议使用IP地址+端口号方式访问Grafana,进行登录: ![](static/imgs/grafana1.png) (3)接下来添加Influxdb数据源: ![](static/imgs/grafana3.png) ![](static/imgs/grafana4.png) (4)进行如下图配置,输入URL,Access方式为Browser: ![](static/imgs/grafana5.png) (5)输入Database、用户名admin、密码123456,点击Save&Test,出现如下界面,代表数据库连接成功: ![](static/imgs/grafana6.png) (6)最后添加需要的图板进行显示即可: ![](static/imgs/grafana7.png) ### 7.8 观测步骤 (1)通过浏览器访问8080端口。如果是本地查看,则访问localhost:8080,如果远程访问,则访问`remoteip:8080`,openEuler没有图形界面,建议使用IP地址方式访问,显示如下界面: ![](static/imgs/index.png) (2)Net、Tcpflow、Udpflow等选项为可选指标,Collect-TIME 为数据采集时间(单位为分钟),选择完以后点击<<提交数据>>即可; (3)提交数据以后直接点击<<展示数据>>,无需等待收集时间结束; (4)在数据展示页面点击生成网络,即可观察到相关信息; ![](static/imgs/display.png) (5)Tcpflow和Udpflow可通过Grafana的图板形式观测,浏览器端口为3000。 ![](static/imgs/grafana.png) ## 8. 资料清单 1. 可运行的demo 2. 项目功能说明书(项目docs目录下) 3. 项目代码(本仓库所有代码) 4. 项目演示视频(项目docs目录下) 5. 技术报告(项目docs目录下) 6. 其他资料(学习Kubernetus和Go语言的书面总结) ## 9. 致谢 通过本次 “2020 openEuler 高校开发者大赛”,我们在团队协作,项目管理上学到了很多。同时,也因项目学习了新语言go和python,学到了Kubernetus、Docker等新技术,更加熟悉了Linux内核网络和eBPF技术等。 感谢 openEuler 提供比赛的机会,感谢陆志浩老师耐心的指导。