From 5d5935b977cf3ea83cf650ed6561af744429a437 Mon Sep 17 00:00:00 2001 From: shoggothforever <1337231450@qq.com> Date: Fri, 20 Dec 2024 23:47:50 +0800 Subject: [PATCH] update readme --- README.md | 222 +++++++++++++++++++++++++++--------------------------- 1 file changed, 113 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index 2c9eae6..3130207 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,48 @@ # beefine: Visualizing Docker Internals with eBPF ## 2024年全国大å¦ç”Ÿè®¡ç®—机系统能力大赛-æ“作系统赛(åŽä¸œåŒºåŸŸèµ›ï¼‰-OS应用开å‘èµ› ### æ¯”èµ›ç›¸å…³ä¿¡æ¯ -妿 ¡ï¼šæå·žç”µå科技大å¦\ -队ä¼ç¼–å·ï¼šT202410336994295 \ -队å:霓虹Ultra队 -æˆå‘˜ï¼šè”¡é¾™ç¥¥ï¼ˆé˜Ÿé•¿ï¼‰ã€è°æ–‡è½©ï¼ˆé˜Ÿå‘˜ï¼‰ã€æŽç¿æ¶µï¼ˆé˜Ÿå‘˜ï¼‰ -指导è€å¸ˆï¼šåˆ˜çœŸã€å‘¨æ— +妿 ¡:æå·žç”µå科技大å¦\ +队ä¼ç¼–å·:T202410336994295 \ +队å:霓虹Ultra队 +æˆå‘˜:蔡龙祥(队长)ã€è°æ–‡è½©ï¼ˆé˜Ÿå‘˜ï¼‰ã€æŽç¿æ¶µï¼ˆé˜Ÿå‘˜ï¼‰ +指导è€å¸ˆ:刘真ã€å‘¨æ— ## 项目简介 -**Beefine** 是一个基于 **Fyne** å’Œ **Cilium eBPF** 框架开å‘的工具,旨在通过图形化交互界é¢ï¼ˆGUI)实时观测 Docker 容器的创建过程,深入ç†è§£è™šæ‹ŸåŒ–æŠ€æœ¯çš„æ ¸å¿ƒç†å¿µå’Œå®žçŽ°åŽŸç†ã€‚æœ¬é¡¹ç›®åŒæ—¶æ”¯æŒåŠ è½½å’Œç®¡ç† eBPF 程åºï¼Œå¸®åŠ©ç”¨æˆ·è¿½è¸ªæ“作系统在 Docker æ“作ä¸çš„行为,åŽç»å°†æ‰©å±•到 Kubernetes 集群的 Pod 监控。 +**Beefine** 是一个基于 **Fyne** å’Œ **Cilium eBPF** 框架开å‘的工具,旨在通过图形化交互界é¢ï¼ˆGUI)实时观测 Docker 容器的创建过程,深入ç†è§£è™šæ‹ŸåŒ–æŠ€æœ¯çš„æ ¸å¿ƒç†å¿µå’Œå®žçŽ°åŽŸç†ã€‚æœ¬é¡¹ç›®åŒæ—¶æ”¯æŒåŠ è½½å’Œç®¡ç† eBPF 程åº,帮助用户追踪æ“作系统在 Docker æ“作ä¸çš„行为,åŽç»å°†æ‰©å±•到 Kubernetes 集群的 Pod 监控。 --- ## 创建åˆè¡· -å®¹å™¨åŒ–æŠ€æœ¯å·²ç»æˆä¸ºçŽ°ä»£è½¯ä»¶å¼€å‘å’Œéƒ¨ç½²çš„æ ¸å¿ƒå·¥å…·ï¼Œè€Œ Docker 是其ä¸çš„代表。然而,在使用容器时,很多开å‘è€…å¹¶ä¸æ¸…楚容器创建的具体过程,例如æ“作系统如何处ç†é•œåƒè§£åŽ‹ã€æ–‡ä»¶ç³»ç»ŸæŒ‚载和网络隔离ç‰åº•层细节。 -而docker-swarmå’Œkubernetesç‰ç‰å®¹å™¨ç¼–排系统更是让现在应用系统ä¸çš„å®¹å™¨æ•°é‡æ¿€å¢žï¼Œè€Œç†è§£å…¶ä¸çš„æœ€å°å•å…ƒpodæ›´åŠ éœ€è¦ç†è§£podä¸çš„容器通信方å¼\ -为了帮助开å‘者更直观地ç†è§£è¿™äº›ç»†èŠ‚ï¼Œ**Beefine** 通过 eBPF 技术æ•获和分æžå®¹å™¨çš„系统调用行为,并借助 Fyne æä¾›å›¾å½¢åŒ–的实时åé¦ˆï¼Œæœ€ç»ˆå®žçŽ°ä»¥ä¸‹ç›®æ ‡ï¼š - -1. **简化å¦ä¹ 过程**: - - 通过实时观测容器创建过程,帮助开å‘者更好地ç†è§£å®¹å™¨é•œåƒï¼Œè™šæ‹ŸåŒ–技术。 -2. **æé«˜å¯è§†åŒ–交互体验**: - - æä¾›ç›´è§‚的图形界é¢ï¼Œå±•示关键的系统行为和资æºå˜åŒ–。 - - é…置了动æ€åŠ è½½bpf程åºçš„å…¥å£ï¼Œè®©ä½¿ç”¨è€…快速实践bpf -3. **å¼€å‘工具化**: - - 为å¦ä¹ 者和工程师æä¾›ä¸€ä¸ªå¯ä»¥éšæ—¶å®žéªŒå’ŒéªŒè¯çš„工具,å‡å°‘æ“作系统实验的门槛。 +å®¹å™¨åŒ–æŠ€æœ¯å·²ç»æˆä¸ºçŽ°ä»£è½¯ä»¶å¼€å‘å’Œéƒ¨ç½²çš„æ ¸å¿ƒå·¥å…·,而 Docker 是其ä¸çš„代表。然而,在使用容器时,很多开å‘è€…å¹¶ä¸æ¸…楚容器创建的具体过程,例如æ“作系统如何处ç†é•œåƒè§£åŽ‹ã€æ–‡ä»¶ç³»ç»ŸæŒ‚载和网络隔离ç‰åº•层细节。 +而docker-swarmå’Œkubernetesç‰ç‰å®¹å™¨ç¼–排系统更是让现在应用系统ä¸çš„å®¹å™¨æ•°é‡æ¿€å¢ž,而ç†è§£å…¶ä¸çš„æœ€å°å•å…ƒpodæ›´åŠ éœ€è¦ç†è§£podä¸çš„容器通信方å¼\ +为了帮助开å‘者更直观地ç†è§£è¿™äº›ç»†èŠ‚,**Beefine** 通过 eBPF 技术æ•获和分æžå®¹å™¨çš„系统调用行为,并借助 Fyne æä¾›å›¾å½¢åŒ–的实时å馈,æœ€ç»ˆå®žçŽ°ä»¥ä¸‹ç›®æ ‡: + +1. **简化å¦ä¹ 过程**: + - 通过实时观测容器创建过程,帮助开å‘者更好地ç†è§£å®¹å™¨é•œåƒ,虚拟化技术。 +2. **æé«˜å¯è§†åŒ–交互体验**: + - æä¾›ç›´è§‚的图形界é¢,展示关键的系统行为和资æºå˜åŒ–。 + - é…置了动æ€åŠ è½½bpf程åºçš„å…¥å£,让使用者快速实践bpf +3. **å¼€å‘工具化**: + - 为å¦ä¹ 者和工程师æä¾›ä¸€ä¸ªå¯ä»¥éšæ—¶å®žéªŒå’ŒéªŒè¯çš„工具,å‡å°‘æ“作系统实验的门槛。 --- ## 项目用途 -该项目目å‰ä¸“注于**实时观测**场景 : -1. **Docker容器创建观测**: - - å®žæ—¶åŠ è½½ eBPF 程åºï¼Œæ•获 Docker 使用镜åƒåˆ›å»ºå®¹å™¨æ—¶çš„æ“ä½œç³»ç»Ÿè¡Œä¸ºã€‚ +该项目目å‰ä¸“注于**实时观测**场景 : +1. **Docker容器创建观测**: + - å®žæ—¶åŠ è½½ eBPF 程åº,æ•获 Docker 使用镜åƒåˆ›å»ºå®¹å™¨æ—¶çš„æ“ä½œç³»ç»Ÿè¡Œä¸ºã€‚ - åŒ…æ‹¬é•œåƒæ‹‰å–ã€æ–‡ä»¶ç³»ç»Ÿè®¾ç½®ã€å‘½å空间管ç†ã€ç½‘络é…ç½®ç‰ã€‚ - - 为å¦ä¹ 者和开å‘者æä¾›å®žéªŒçŽ¯å¢ƒï¼Œç”¨äºŽç†è§£å®¹å™¨çš„实现原ç†ï¼Œå¦‚Namespaceã€Cgroup å’Œ UnionFS。 + - 为å¦ä¹ 者和开å‘者æä¾›å®žéªŒçŽ¯å¢ƒ,用于ç†è§£å®¹å™¨çš„实现原ç†,如Namespaceã€Cgroup å’Œ UnionFS。 2. **Docker容器è¿è¡Œæ—¶** - 实时的容器所处namespaceå’Œcgroupä¿¡æ¯å±•示以åŠè®¾ç½® - 动æ€åŠ è½½xdp程åºç®¡ç†åˆ†æžå®¹å™¨ç½‘络ä¸çš„æ•°æ®åŒ… - 动æ€è§‚测容器ä¸çš„è¿›ç¨‹ä¿¡æ¯ -3. **åŠ¨æ€ eBPF 程åºç®¡ç†**: - - æä¾›ç›´è§‚界é¢åŠ è½½å’Œç®¡ç† eBPF 程åºï¼ŒåЍæ€åˆ†æžç³»ç»Ÿè¡Œä¸ºã€‚ -4. **图形化分æž**: - - 使用 Fyne æä¾›ç›´è§‚ã€æ˜“用的 GUI,通过 GUI 展示分æžç»“果,帮助用户直观ç†è§£å®¹å™¨çš„底层è¿è¡Œæœºåˆ¶ã€‚ -5. **æœªæ¥æ‰©å±•**: - - 为 Kubernetes 集群æä¾›ç›‘控支æŒï¼Œè§‚测 Pod 的创建ã€è°ƒåº¦å’Œè¿è¡Œã€‚ +3. **åŠ¨æ€ eBPF 程åºç®¡ç†**: + - æä¾›ç›´è§‚界é¢åŠ è½½å’Œç®¡ç† eBPF 程åº,动æ€åˆ†æžç³»ç»Ÿè¡Œä¸ºã€‚ +4. **图形化分æž**: + - 使用 Fyne æä¾›ç›´è§‚ã€æ˜“用的 GUI,通过 GUI 展示分æžç»“æžœ,帮助用户直观ç†è§£å®¹å™¨çš„底层è¿è¡Œæœºåˆ¶ã€‚ +5. **æœªæ¥æ‰©å±•**: + - 为 Kubernetes 集群æä¾›ç›‘控支æŒ,观测 Pod 的创建ã€è°ƒåº¦å’Œè¿è¡Œã€‚ --- @@ -50,50 +50,54 @@ ### 已实现功能 -1. **Docker 创建过程观测**: - - 使用 eBPF 追踪æ“作系统调用,æ•获 Docker 使用镜åƒåˆ›å»ºå®¹å™¨çš„全过程。 -2. **图形化界é¢**: - - 使用 Fyne å¼€å‘å¯äº¤äº’çš„ GUI,包括日志查看ã€åЍæ€ç¨‹åºåŠ è½½ç‰åŠŸèƒ½ã€‚ -3. **实时 eBPF 程åºåŠ è½½**: - - 支æŒç”¨æˆ·åŠ è½½è‡ªå®šä¹‰ eBPF 程åºï¼ŒåЍæ€åˆ†æžç‰¹å®šè¡Œä¸ºã€‚ +1. **Docker 创建过程观测**: + - 使用 eBPF 追踪æ“作系统调用,æ•获 Docker 使用镜åƒåˆ›å»ºå®¹å™¨çš„全过程。 +2. **图形化界é¢**: + - 使用 Fyne å¼€å‘å¯äº¤äº’çš„ GUI,包括日志查看ã€åЍæ€ç¨‹åºåŠ è½½ç‰åŠŸèƒ½ã€‚ +3. **实时 eBPF 程åºåŠ è½½**: + - 支æŒç”¨æˆ·åŠ è½½è‡ªå®šä¹‰ eBPF 程åº,动æ€åˆ†æžç‰¹å®šè¡Œä¸ºã€‚ ### å¾…å¼€å‘功能 -1. **Kubernetes 集群观测**: +1. **Kubernetes 集群观测**: - 设计用于追踪 Kubernetes Pod 调度与è¿è¡Œçš„功能模å—。 -2. **镜åƒä¸Žå®¹å™¨çš„æ€§èƒ½åˆ†æž**: - - æä¾›æ›´å¤šç»Ÿè®¡åŠŸèƒ½ï¼Œåˆ†æžèµ„æºä½¿ç”¨æƒ…况(CPUã€å†…å˜ã€I/O ç‰ï¼‰ã€‚ -3. **åŽ†å²æ•°æ®ç®¡ç†**: - - 支æŒä¿å˜å’Œå›žæ”¾è§‚测结果,便于åŽç»åˆ†æžã€‚ -4. **优化 GUI**: - - å¢žåŠ æ›´å¤šäº¤äº’åŠŸèƒ½ï¼Œä¾‹å¦‚é«˜çº§è¿‡æ»¤ã€å®žæ—¶å›¾è¡¨æ›´æ–°ã€‚ +2. **镜åƒä¸Žå®¹å™¨çš„æ€§èƒ½åˆ†æž**: + - æä¾›æ›´å¤šç»Ÿè®¡åŠŸèƒ½,分æžèµ„æºä½¿ç”¨æƒ…况(CPUã€å†…å˜ã€I/O ç‰ï¼‰ã€‚ +3. **åŽ†å²æ•°æ®ç®¡ç†**: + - 支æŒä¿å˜å’Œå›žæ”¾è§‚测结果,便于åŽç»åˆ†æžã€‚ +4. **优化 GUI**: + - å¢žåŠ æ›´å¤šäº¤äº’åŠŸèƒ½,例如高级过滤ã€å®žæ—¶å›¾è¡¨æ›´æ–°ã€‚ ### 当å‰å¼€å‘进度 -1. **功能模å—**: - - - [X] å›¾å½¢ç•Œé¢æå»ºï¼ˆåŸºäºŽ Fyne) - - [X] 支æŒåЍæ€åŠ è½½ eBPF ç¨‹åº - - [X] 基础的 Docker è¡Œä¸ºè§‚æµ‹åŠŸèƒ½ï¼ˆé•œåƒæ‹‰å–ã€å®¹å™¨åˆ›å»ºï¼‰ - - [ ] æ•°æ®å¯è§†åŒ–(实时图表展示系统调用频率) - - [ ] 丰富的日志和分æžå·¥å…· -2. **观测é‡ç‚¹**: - - - Docker 使用镜åƒåˆ›å»ºå®¹å™¨çš„全过程: - - [X] é•œåƒæ–‡ä»¶çš„æ‹‰å–与解压。 - - [X] 文件系统的挂载(OverlayFS)。 - - [X] 容器隔离环境的设置(Namespace å’Œ Cgroup)。 +1. **功能模å—**: + - [X] 易于使用且å¯äº¤äº’çš„bpf载入界é¢,基于golangçš„UI库fyne客制化了通用组件,实现了很好的å¤ç”¨æ€§ + - [X] æä¾›æ¨¡æ¿åŒ–的框架å¼bpf编程体验,便于使用者轻æ¾ç¼–写自己的bpf程åº,å‡è½»æå»ºç³»ç»ŸçŽ¯å¢ƒçš„è´Ÿæ‹…,支æŒåЍæ€åŠ è½½ eBPF 程åº,结åˆå®¢åˆ¶åŒ–的组件å¯ä»¥å¿«é€Ÿçœ‹åˆ°è¿è¡Œç»“æžœ + - [X] èšåˆåŸºç¡€çš„docker cliåŠŸèƒ½ï¼ˆé•œåƒæ‹‰å–ã€å®¹å™¨åˆ›å»ºã€çжæ€å±•示),并且æä¾›åŸºç¡€çš„ Docker 对象观测功能(å¯é€‰åŠ è½½bpf程åºå®žæ—¶åˆ†æžå®¹å™¨åˆ›å»ºä¸Žè¿è¡Œä¸çš„ç³»ç»Ÿè°ƒç”¨ã€æ–‡ä»¶ç³»ç»Ÿæ“作ã€ç½‘ç»œä¼ è¾“ã€éš”离控制的信æ¯ï¼‰ + - [ ] 结åˆprometheus以åŠechartsç‰ç»„ä»¶å®žçŽ°æ›´åŠ å®Œå–„çš„docker container内部负载观测视图 + - [ ] 使观测程åºä¸å±€é™äºŽæ“作系统,实现å³ä½¿ä¸åŽŸç”Ÿæ”¯æŒbpf技术的æ“作系统也å¯ä»¥é€šè¿‡è¿œç¨‹è¿žæŽ¥çš„æ–¹å¼è§‚测远程æœåС噍ä¸çš„容器情况 + - [ ] 自动化压测测试案例设计 +2. **Docker观测é‡ç‚¹**: +- Docker 使用镜åƒåˆ›å»ºå®¹å™¨çš„全过程: + - [X] é•œåƒæ–‡ä»¶çš„æ‹‰å–与解压 + - [X] 读å–è§£æžé•œåƒæ–‡ä»¶ç»“构打包æˆruntime bundle(VFS) + - [X] 基于xdpæå–从网络ä¸èŽ·å–镜åƒä¿¡æ¯çš„æ•°æ®åŒ… + - [X] 文件系统的挂载(mount) + - [X] 容器隔离环境的设置(Namespace å’Œ Cgroup) - Docker 容器è¿è¡Œä¸çš„æ€§èƒ½è§‚测 - [X] éš”ç¦»æ–‡ä»¶ä¿¡æ¯ - [X] 挂载ç£ç›˜ä¿¡æ¯ - - [X] ç½‘ç»œä¿¡æ¯ - - [X] è¿›ç¨‹ä¿¡æ¯ + - [X] 隔离在相åŒå‘½å空间下的进程,ç½‘ç»œä¿¡æ¯ - [X] cpuä¿¡æ¯ - [X] memoryä¿¡æ¯ -- åŽç»è®¡åˆ’扩展到更多场景,包括: - - [ ] 容器è¿è¡Œæ—¶çš„æ€§èƒ½åˆ†æžã€‚ - - [ ] Kubernetes 集群ä¸çš„容器行为观测。 + - [ ] 补充æå–其它命å空间下信æ¯çš„功能 + - [ ] 对容器的namespaceå’Œcgroupç‰ç‰éš”ç¦»æœºåˆ¶çš„äº¤äº’å¼æ”¹é€ + +3 åŽç»è®¡åˆ’扩展到更多场景,包括 +- [ ] 对docker底层containerd,runc,docker-shimæ·»åŠ æ›´ç»†è‡´çš„è§‚æµ‹åŠŸèƒ½ +- [ ] Kubernetes 集群ä¸çš„pod行为观测 + --- ## 文件结构 @@ -121,26 +125,26 @@ ## 模å—说明 ### Load eBPF æ¨¡å—  -æä¾›äº†å‡ 个基础的bpf程åºï¼Œå¯ä»¥ä¾›ä½¿ç”¨è€…载入,了解ebpf程åºçš„è¿è¡Œæ•ˆæžœ -包括功能: -- 展示系统ä¸å¯ç”¨çš„bpf帮助函数,为åˆå¦è€…æä¾›å¼€å‘上的帮助 -- é€‰æ‹©ç½‘å¡æŽ¥å£ï¼Œå®žæ—¶èŽ·å–ç»è¿‡ç½‘å¡çš„æ•°æ®è®¡æ•°ï¼Œå¹¶å±•ç¤ºéƒ¨åˆ†æŠ¥æ–‡ä¿¡æ¯ +æä¾›äº†å‡ 个基础的bpf程åº,å¯ä»¥ä¾›ä½¿ç”¨è€…载入,了解ebpf程åºçš„è¿è¡Œæ•ˆæžœ +包括功能: +- 展示系统ä¸å¯ç”¨çš„bpf帮助函数,为åˆå¦è€…æä¾›å¼€å‘上的帮助 +- é€‰æ‹©ç½‘å¡æŽ¥å£,实时获å–ç»è¿‡ç½‘å¡çš„æ•°æ®è®¡æ•°,å¹¶å±•ç¤ºéƒ¨åˆ†æŠ¥æ–‡ä¿¡æ¯  -- 载入ebpf程åºç›‘测系统ä¸çš„exec系统调用,在入å£å’Œå‡ºå£å¤„都设置了钩å函数,实时展示系统ä¸è¿è¡Œå’Œé€€å‡ºçš„ç¨‹åº +- 载入ebpf程åºç›‘测系统ä¸çš„exec系统调用,在入å£å’Œå‡ºå£å¤„都设置了钩å函数,实时展示系统ä¸è¿è¡Œå’Œé€€å‡ºçš„ç¨‹åº  -**实现难点åŠåˆ›æ–°ç‚¹**:需è¦ç†è§£bpf程åºçš„载入过程,熟悉linuxå†…æ ¸ä¸æ”¯æŒçš„bpfé’©å函数,在é™åˆ¶äº†å¯ä»¥èŽ·å–çš„å‡½æ•°å‚æ•°ä¿¡æ¯çš„æ¡ä»¶ä¸‹ç¼–å†™èƒ½å¤Ÿé€šè¿‡bpf verifierçš„bpfc程åºï¼Œç„¶åŽç»“åˆgolangçš„bpf辅助库实现了一键载入bpf程åºï¼Œå¹¶ä¸”通过bpf mapã€perfã€ringbufferç‰æ•°æ®ç»“æž„å®žçŽ°å†…æ ¸æ€å’Œç”¨æˆ·æ€çš„æ•°æ®äº¤äº’,å†ç»“åˆgolang çš„UI库æå»ºäº†å¯äº¤äº’的桌é¢ç«¯ç¨‹åºï¼ŒæŠŠåº•层的细节对用户éšè—,åªå±•示用户需è¦çš„æ•°æ®ã€‚支æŒä½¿ç”¨è„šæœ¬ä¸€é”®åˆ›å»ºbpfç¨‹åºæ¨¡æ¿ï¼Œæ–¹ä¾¿æ•™å¦ä½¿ç”¨ +**实现难点åŠåˆ›æ–°ç‚¹**:需è¦ç†è§£bpf程åºçš„载入过程,熟悉linuxå†…æ ¸ä¸æ”¯æŒçš„bpfé’©å函数,在é™åˆ¶äº†å¯ä»¥èŽ·å–çš„å‡½æ•°å‚æ•°ä¿¡æ¯çš„æ¡ä»¶ä¸‹ç¼–å†™èƒ½å¤Ÿé€šè¿‡bpf verifierçš„bpfc程åº,ç„¶åŽç»“åˆgolangçš„bpf辅助库实现了一键载入bpf程åº,并且通过bpf mapã€perfã€ringbufferç‰æ•°æ®ç»“æž„å®žçŽ°å†…æ ¸æ€å’Œç”¨æˆ·æ€çš„æ•°æ®äº¤äº’,å†ç»“åˆgolang çš„UI库æå»ºäº†å¯äº¤äº’的桌é¢ç«¯ç¨‹åº,把底层的细节对用户éšè—,åªå±•示用户需è¦çš„æ•°æ®ã€‚支æŒä½¿ç”¨è„šæœ¬ä¸€é”®åˆ›å»ºbpfç¨‹åºæ¨¡æ¿,方便教å¦ä½¿ç”¨ ### Docker DashBoard -展示系统ä¸çš„docker daemon实时的使用情况,æä¾›åŠŸèƒ½ä¾¿äºŽä½¿ç”¨è€…äº†è§£dockerè¿è¡Œçš„æ•´ä½“情况 -**实现é‡ç‚¹**:获å–系统ä¸çš„å®¹å™¨å’Œé•œåƒæ•°é‡ï¼Œä»¥åŠç»Ÿè®¡æ‰€æœ‰è¿è¡Œä¸çš„容器对系统cpuå’Œmemory资æºçš„使用情况 +展示系统ä¸çš„docker daemon实时的使用情况,æä¾›åŠŸèƒ½ä¾¿äºŽä½¿ç”¨è€…äº†è§£dockerè¿è¡Œçš„æ•´ä½“情况 +**实现é‡ç‚¹**:获å–系统ä¸çš„å®¹å™¨å’Œé•œåƒæ•°é‡,以åŠç»Ÿè®¡æ‰€æœ‰è¿è¡Œä¸çš„容器对系统cpuå’Œmemory资æºçš„使用情况  ### Docker-image monitoræ¨¡å—  -该模å—èšç„¦äºŽè§‚测docker基于image创建容器的全过程,èšåˆäº†docker 对image的管ç†èƒ½åŠ›ï¼Œå¯ä»¥è¾“å…¥image name 拉å–image,拉å–选择系统ä¸å˜åœ¨çš„镜åƒï¼Œå³ä¾§çš„看æ¿ä¼šå±•示当å‰é•œåƒåˆ›å»ºçš„过程日志 \ -**实现é‡ç‚¹**: - 通过日志还原dockerè§£æžimage创建容器的过程,需è¦å®Œå…¨æŽŒæ¡dockerè§£æžé•œåƒçš„过程,了解docker底层的实现原ç†ï¼Œé•œåƒè§£æžçš„è¿‡ç¨‹ï¼šé•œåƒæ ¼å¼éµå®ˆOCI镜åƒè§„范定义,包å«é•œåƒç´¢å¼•ï¼Œé•œåƒæ¸…å•,镜åƒå±‚以åŠé•œåƒé…置。镜åƒç´¢å¼•用以区分镜åƒçš„ä¸åŒæž¶æž„å¹³å°ï¼Œé•œåƒæ¸…å•ä¸åŒ…å«äº†é•œåƒå…·ä½“内容的哈希摘è¦ï¼Œæä¾›äº†èŽ·å–镜åƒçš„坻倿–¹å¼ï¼Œæå–镜åƒå±‚ä¿¡æ¯çš„æ–¹æ³•ï¼Œå› æ¤ä¸»è¦æ¶‰åŠçš„系统调用就是openat,read,writeç‰fs接å£ï¼Œdocker的容器文件系统采用的是unionfs,容器最åˆåªæœ‰ä¸€å±‚rootfs,解æžé•œåƒå±‚文件ä¸çš„æ¯ä¸€å±‚éƒ½ä¼šå¾€rootfs上覆盖新的一层,而镜åƒé…置则主è¦åŒ…å«äº†é•œåƒä¸çš„环境å˜é‡ï¼Œæ‰§è¡Œå‚数,å˜å‚¨å·ç‰ä¿¡æ¯ï¼Œdocker会通过镜åƒé…ç½®ä¸çš„内容得到对应的OCI runtime bundleå¯åЍ容噍\ -**创新点**:实现对VFS,挂载,网络和隔离apiçš„bpf观测程åºäº¤äº’å¼åœ°è½½å…¥ç–略,å¯ä»¥å…许使用者按需获å–镜åƒåŠ è½½æ•°æ® -涉åŠåˆ°çš„bpf hook以åŠç›¸å…³ç¨‹åºï¼ˆè¯¦è§æ–‡æ¡£ï¼‰ï¼š +该模å—èšç„¦äºŽè§‚测docker基于image创建容器的全过程,èšåˆäº†docker 对image的管ç†èƒ½åŠ›,å¯ä»¥è¾“å…¥image name 拉å–image,拉å–选择系统ä¸å˜åœ¨çš„镜åƒ,å³ä¾§çš„看æ¿ä¼šå±•示当å‰é•œåƒåˆ›å»ºçš„过程日志 \ +**实现é‡ç‚¹**: + 通过日志还原dockerè§£æžimage创建容器的过程,需è¦å®Œå…¨æŽŒæ¡dockerè§£æžé•œåƒçš„过程,了解docker底层的实现原ç†,镜åƒè§£æžçš„过程:é•œåƒæ ¼å¼éµå®ˆOCI镜åƒè§„范定义,包å«é•œåƒç´¢å¼•,é•œåƒæ¸…å•,镜åƒå±‚以åŠé•œåƒé…置。镜åƒç´¢å¼•用以区分镜åƒçš„ä¸åŒæž¶æž„å¹³å°,é•œåƒæ¸…å•ä¸åŒ…å«äº†é•œåƒå…·ä½“内容的哈希摘è¦,æä¾›äº†èŽ·å–镜åƒçš„坻倿–¹å¼,æå–镜åƒå±‚ä¿¡æ¯çš„æ–¹æ³•,å› æ¤ä¸»è¦æ¶‰åŠçš„系统调用就是openat,read,writeç‰fs接å£,docker的容器文件系统采用的是unionfs,容器最åˆåªæœ‰ä¸€å±‚rootfs,è§£æžé•œåƒå±‚文件ä¸çš„æ¯ä¸€å±‚éƒ½ä¼šå¾€rootfs上覆盖新的一层,而镜åƒé…置则主è¦åŒ…å«äº†é•œåƒä¸çš„环境å˜é‡,æ‰§è¡Œå‚æ•°,å˜å‚¨å·ç‰ä¿¡æ¯,docker会通过镜åƒé…ç½®ä¸çš„内容得到对应的OCI runtime bundleå¯åЍ容噍\ +**创新点**:实现对VFS,挂载,网络和隔离apiçš„bpf观测程åºäº¤äº’å¼åœ°è½½å…¥ç–ç•¥,å¯ä»¥å…许使用者按需获å–镜åƒåŠ è½½æ•°æ® +涉åŠåˆ°çš„bpf hook以åŠç›¸å…³ç¨‹åºï¼ˆè¯¦è§æ–‡æ¡£ï¼‰: - tracepoint/syscalls/sys_enter_mount - tracepoint/syscalls/sys_enter_openat - tracepoint/syscalls/sys_enter_read @@ -150,47 +154,47 @@ - bpftrace脚本(scripts目录下) ### Docker-container monitoræ¨¡å—  -该模å—èšç„¦äºŽè¿è¡Œä¸çš„容器的实时数æ®åˆ†æžï¼ŒOCIè¿è¡Œæ—¶è§„范规定了容器的è¿è¡Œçжæ€ï¼Œè¯¥æ¨¡å—主è¦è§‚测的是出于stoppedå’Œrunning状æ€çš„容器,对于running状æ€çš„容器å¯ä»¥è§‚测到更多有关的数æ®ï¼Œå®¹å™¨æœ¬èº«çš„隔离使用了namespaceå’Œcgroupç‰ç‰linux 容器技术,docker 则是通过容器è¿è¡Œæ—¶æ¥ç®¡ç†å®¹å™¨ -**实现é‡ç‚¹**:分æžå®¹å™¨çš„namespace以åŠcgroupä¿¡æ¯ï¼Œåˆ†æžå¤„在隔离ä¸çš„容器的进程,网络ç‰ç»†èŠ‚ -**创新点**:实时获å–åŒä¸€namespaceä¸çš„peerä¿¡æ¯ï¼Œä»¥pid namespace为例,实现了实时获å–容噍䏿–°å¢žè¿è¡Œè¿›ç¨‹ä¿¡æ¯çš„展示,å‡å°‘容器外信æ¯çš„干扰,其他的namespace空间也类似 +该模å—èšç„¦äºŽè¿è¡Œä¸çš„容器的实时数æ®åˆ†æž,OCIè¿è¡Œæ—¶è§„范规定了容器的è¿è¡Œçжæ€,该模å—主è¦è§‚测的是出于stoppedå’Œrunning状æ€çš„容器,对于running状æ€çš„容器å¯ä»¥è§‚测到更多有关的数æ®,容器本身的隔离使用了namespaceå’Œcgroupç‰ç‰linux 容器技术,docker 则是通过容器è¿è¡Œæ—¶æ¥ç®¡ç†å®¹å™¨ +**实现é‡ç‚¹**:分æžå®¹å™¨çš„namespace以åŠcgroupä¿¡æ¯,分æžå¤„在隔离ä¸çš„容器的进程,网络ç‰ç»†èŠ‚ +**创新点**:实时获å–åŒä¸€namespaceä¸çš„peerä¿¡æ¯,以pid namespace为例,实现了实时获å–容噍䏿–°å¢žè¿è¡Œè¿›ç¨‹ä¿¡æ¯çš„展示,å‡å°‘容器外信æ¯çš„干扰,å…¶ä»–çš„namespace空间也类似 ## 快速开始文档 ### 0.ç³»ç»Ÿè¦æ±‚ -- **æ“作系统**:Ubuntu 20.04 或更高版本 -- **æž¶æž„**:AMD64 -- **ä¾èµ–工具**: - - **Go**:版本 >= 1.18 - - **Docker**ï¼šéœ€è¦ Docker Daemon è¿è¡Œ +- **æ“作系统**:Ubuntu 20.04 或更高版本 +- **æž¶æž„**:AMD64 +- **ä¾èµ–工具**: + - **Go**:版本 >= 1.18 + - **Docker**:éœ€è¦ Docker Daemon è¿è¡Œ - **X11 å¼€å‘库** - **bpftool,bpftrace工具" - - **æƒé™**:eBPF 程åºéœ€è¦ç®¡ç†å‘˜æƒé™è¿è¡Œ + - **æƒé™**:eBPF 程åºéœ€è¦ç®¡ç†å‘˜æƒé™è¿è¡Œ --- ### 1. 编译æºç -以下是编译æºç 的方法,适用于开å‘者或需è¦è‡ªå®šä¹‰åŠŸèƒ½çš„ç”¨æˆ·ã€‚ +以下是编译æºç 的方法,适用于开å‘者或需è¦è‡ªå®šä¹‰åŠŸèƒ½çš„ç”¨æˆ·ã€‚ #### 安装ä¾èµ– -在编译æºç å‰ï¼Œè¯·ç¡®ä¿ç³»ç»Ÿå·²å®‰è£…以下ä¾èµ–: +在编译æºç å‰,请确ä¿ç³»ç»Ÿå·²å®‰è£…以下ä¾èµ–: -1. **安装 Go** 如果未安装 Go,å¯ä»¥é€šè¿‡ä»¥ä¸‹å‘½ä»¤å®‰è£…: +1. **安装 Go** 如果未安装 Go,å¯ä»¥é€šè¿‡ä»¥ä¸‹å‘½ä»¤å®‰è£…: ```bash sudo apt update sudo apt install -y golang gcc ``` -2. æ£€æŸ¥å®‰è£…æ˜¯å¦æˆåŠŸï¼šç¡®ä¿ç‰ˆæœ¬ >= 1.18 +2. æ£€æŸ¥å®‰è£…æ˜¯å¦æˆåŠŸ:ç¡®ä¿ç‰ˆæœ¬ >= 1.18 ```bash go version ``` -**安装 Docker** 如果未安装 Docker,å¯ä»¥å‚考以下命令安装: +**安装 Docker** 如果未安装 Docker,å¯ä»¥å‚考以下命令安装: ```bash sudo apt update sudo apt install -y docker.io && sudo usermod -aG docker ${USER} && sudo systemctl enable --now docker ``` -**ç¡®ä¿ç®¡ç†å‘˜æƒé™** eBPF 程åºéœ€è¦ç®¡ç†å‘˜æƒé™ï¼Œç¡®ä¿å½“å‰ç”¨æˆ·åœ¨ `sudo` 或 `root` 下è¿è¡Œã€‚ +**ç¡®ä¿ç®¡ç†å‘˜æƒé™** eBPF 程åºéœ€è¦ç®¡ç†å‘˜æƒé™,ç¡®ä¿å½“å‰ç”¨æˆ·åœ¨ `sudo` 或 `root` 下è¿è¡Œã€‚ 3. 安装X11å¼€å‘库以åŠfyneä¾èµ–库 ```bash sudo apt install libx11-dev libx11-xcb-dev libgl1-mesa-dev xorg-dev build-essential pkg-config @@ -206,20 +210,20 @@ cd beefine go mod tidy // 安装必è¦çš„golang ä¾èµ–库 ``` ### ç¼–è¯‘ç¨‹åº -å¯é€‰é¡¹ï¼šåœ¨æºç bpfç›®å½•ä¸‹æ·»åŠ è‡ªå®šä¹‰çš„bpfç¨‹åº -对于æ¯ä¸ªbpf程åºï¼Œå®šä¹‰ä¸€ä¸ªbpfxxx.go文件作为用户æ€å¤„ç†ç¨‹åºï¼Œä¸€ä¸ªbpfxxx.cæ–‡ä»¶ä½œä¸ºå†…æ ¸æ€ç¨‹åºï¼Œç»“åˆbpf2go与libbpf实现自定义bpf程åº\ +å¯é€‰é¡¹:在æºç bpfç›®å½•ä¸‹æ·»åŠ è‡ªå®šä¹‰çš„bpfç¨‹åº +对于æ¯ä¸ªbpf程åº,定义一个bpfxxx.go文件作为用户æ€å¤„ç†ç¨‹åº,一个bpfxxx.cæ–‡ä»¶ä½œä¸ºå†…æ ¸æ€ç¨‹åº,结åˆbpf2go与libbpf实现自定义bpf程åº\ ```make gen PKG=$(yourBpfProgramName)```\ -å‚考项目makefile直接编译æºç : +å‚考项目makefile直接编译æºç : ```ç¼–è¯‘å¯æ‰§è¡Œæ–‡ä»¶ make build ``` -如果没有改动bpf程åºï¼Œå¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‘½ä»¤ï¼š +如果没有改动bpf程åº,å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‘½ä»¤: ```bash # 获å–vmlinux.h (btf文件) sudo make update sudo make build ``` ### è¿è¡Œç¨‹åº -编译æˆåŠŸåŽï¼Œæ‰§è¡Œä»¥ä¸‹å‘½ä»¤è¿è¡Œï¼š +编译æˆåŠŸåŽ,执行以下命令è¿è¡Œ: `sudo ./beefine` 程åºå°†å¯åŠ¨å›¾å½¢åŒ–ç•Œé¢ã€‚ ### æ‰“åŒ…ç¨‹åº @@ -233,13 +237,13 @@ make package windows # GOOS=windows GOARCH=amd64 --- ## 2. è¿è¡ŒäºŒè¿›åˆ¶åº”用 -以下是直接è¿è¡Œå·²ç¼–译二进制文件的方法,适用于ä¸éœ€è¦ä¿®æ”¹æºç 的用户。 +以下是直接è¿è¡Œå·²ç¼–译二进制文件的方法,适用于ä¸éœ€è¦ä¿®æ”¹æºç 的用户。 ### 下载二进制文件 从项目的 [Release 页é¢](https://github.com/shoggothforever/beefine/releases) 下载对应版本的二进制文件。 -以 Ubuntu 20.04 为例: +以 Ubuntu 20.04 为例: ``` bash wget https://github.com/shoggothforever/beefine/releases/download/v1.0.0/beefine-linux-amd64 -O beefine @@ -247,15 +251,15 @@ chmod +x beefine ``` ### 安装ä¾èµ– -ç¡®ä¿ä»¥ä¸‹ä¾èµ–已安装: +ç¡®ä¿ä»¥ä¸‹ä¾èµ–已安装: -1. **Docker**: 安装命令å‚考上述 **编译æºç ** 部分。 +1. **Docker**: 安装命令å‚考上述 **编译æºç ** 部分。 2. **X11图形库** 安装命令å‚考上述 **编译æºç ** 部分。 -2. **æƒé™è®¾ç½®**: ç¡®ä¿å½“å‰ç”¨æˆ·æ‹¥æœ‰è¿è¡Œ eBPF 程åºçš„æƒé™ã€‚ +2. **æƒé™è®¾ç½®**: ç¡®ä¿å½“å‰ç”¨æˆ·æ‹¥æœ‰è¿è¡Œ eBPF 程åºçš„æƒé™ã€‚ ### è¿è¡Œç¨‹åº -è¿è¡Œä»¥ä¸‹å‘½ä»¤å¯åŠ¨ç¨‹åºï¼š +è¿è¡Œä»¥ä¸‹å‘½ä»¤å¯åŠ¨ç¨‹åº: `sudo ./beefine` @@ -264,17 +268,17 @@ chmod +x beefine ## 使用方法 ### 1. åŠ è½½ eBPF ç¨‹åº -在 GUI ä¸é€‰æ‹© `Load eBPF` 功能,选择其ä¸çš„一个bpf程åºç‚¹å‡»åŽä¼šè‡ªåŠ¨åŠ è½½è¿è¡Œï¼Œç„¶åŽä¼šå°†è§‚测到的数æ®è¿”å›žåˆ°ç•Œé¢ +在 GUI ä¸é€‰æ‹© `Load eBPF` 功能,选择其ä¸çš„一个bpf程åºç‚¹å‡»åŽä¼šè‡ªåŠ¨åŠ è½½è¿è¡Œ,ç„¶åŽä¼šå°†è§‚测到的数æ®è¿”å›žåˆ°ç•Œé¢  ### 2. 观测 Docker ä½¿ç”¨èµ„æºæƒ…况 -在 GUI ä¸é€‰æ‹© `Docker`,查看当å‰ç³»ç»Ÿä¸çš„docker资æºä½¿ç”¨æƒ…况 +在 GUI ä¸é€‰æ‹© `Docker`,查看当å‰ç³»ç»Ÿä¸çš„docker资æºä½¿ç”¨æƒ…况  ### 3. 观测Docker 创建容器过程ä¸è¡Œä¸º a. 拉å–docker image\ b. 从系统ä¸é€‰æ‹©å·²æœ‰çš„docker image\ c. 勾选bpf观测选项\ d. 输入容器è¿è¡Œé…ç½®å‚æ•°\ - e. è¿è¡Œå®¹å™¨ï¼Œåœ¨å³ä¾§bpfæ—¥å¿—é¢æ¿æŸ¥çœ‹å…·ä½“çš„dockeræ“ä½œä¿¡æ¯ + e. è¿è¡Œå®¹å™¨,在å³ä¾§bpfæ—¥å¿—é¢æ¿æŸ¥çœ‹å…·ä½“çš„dockeræ“ä½œä¿¡æ¯  ### 4. 观测docker containerçš„å®žæ—¶æ•°æ® a. 选择系统ä¸å˜åœ¨çš„ docker container\ @@ -283,19 +287,19 @@ chmod +x beefine - isolation:查看containerçš„namespaceå’Œcgroupçš„ä¿¡æ¯ - diskInfo:查看container的挂载å·ä¿¡æ¯ - netInfo:查看container的网络信æ¯ä»¥åŠåŠ è½½bpfç¨‹åºæ£€æµ‹æ‰€å¤„网络空间ä¸çš„è¿žæŽ¥ä¿¡æ¯ - - process:查看process的进程组信æ¯ï¼Œå¹¶ä¸”实时观测当å‰å®¹å™¨git所处pid namespacesä¸‹çš„å…¶å®ƒè¿›ç¨‹çš„ä¿¡æ¯ + - process:查看process的进程组信æ¯,并且实时观测当å‰å®¹å™¨git所处pid namespacesä¸‹çš„å…¶å®ƒè¿›ç¨‹çš„ä¿¡æ¯  --- ## 未æ¥è®¡åˆ’ -1. **Kubernetes 支æŒ**: +1. **Kubernetes 支æŒ**: - å¢žåŠ å¯¹ Kubernetes é›†ç¾¤ä¸ Pod 创建过程的监控功能。 -2. **实时性能监控**: - - 使用 eBPF 追踪资æºä½¿ç”¨ï¼ˆCPUã€å†…å˜ã€ç½‘络æµé‡ç‰ï¼‰ï¼Œåˆ†æžå®¹å™¨æ€§èƒ½ã€‚ -3. **æ•°æ®å¯è§†åŒ–**: - - å¢žåŠ æ›´å¤šå®žæ—¶å›¾è¡¨å’Œåˆ†æžæŠ¥å‘Šï¼Œæå‡ç”¨æˆ·ä½“验。 -4. **è·¨å¹³å°æ”¯æŒ**: - - æä¾›æ›´å¤šå¹³å°çš„æ”¯æŒï¼Œå…¼å®¹ Windows å’Œ macOS(bpf程åºè§‚测的æ“作系统ä¾ç„¶æ˜¯linux,但是支æŒé€‰æ‹©è¿œç«¯çš„主机或者云æœåŠ¡å™¨ï¼‰ã€‚ +2. **实时性能监控**: + - 使用 eBPF 追踪资æºä½¿ç”¨ï¼ˆCPUã€å†…å˜ã€ç½‘络æµé‡ç‰ï¼‰,分æžå®¹å™¨æ€§èƒ½ã€‚ +3. **æ•°æ®å¯è§†åŒ–**: + - å¢žåŠ æ›´å¤šå®žæ—¶å›¾è¡¨å’Œåˆ†æžæŠ¥å‘Š,æå‡ç”¨æˆ·ä½“验。 +4. **è·¨å¹³å°æ”¯æŒ**: + - æä¾›æ›´å¤šå¹³å°çš„æ”¯æŒ,兼容 Windows å’Œ macOS(bpf程åºè§‚测的æ“作系统ä¾ç„¶æ˜¯linux,但是支æŒé€‰æ‹©è¿œç«¯çš„主机或者云æœåŠ¡å™¨ï¼‰ã€‚ --- ## å‚考项目 @@ -311,4 +315,4 @@ chmod +x beefine [ebpfå¯è§†åŒ–项目å‚考](https://github.com/linuxkerneltravel/lmp/tree/develop/eBPF_Visualization)\ [bpftrace 脚本å‚考](https://github.com/bpftrace/bpftrace/tree/master/tools) ## å¼€æºåè®® -本项目采用 [MIT License](https://opensource.org/licenses/MIT) å¼€æºå议,详情请å‚è§ LICENSE 文件。 +本项目采用 [MIT License](https://opensource.org/licenses/MIT) å¼€æºåè®®,详情请å‚è§ LICENSE 文件。 -- GitLab