使用sysdig查看容器里的系统调用

sysdig · 浏览次数 : 0

小编点评

**使用容器运行 sysdig** 1. **拉取 sysdig/sysdig 镜像。** ```bash docker pull sysdig/sysdig ``` 2. **创建一个容器,运行 sysdig。** ```bash docker run -i -dt --name sysdig --restart=always --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig62a295df7f57892cf5379e8acfebc9aa889a8fdd9148292d94c918b6d1641052 ``` 3. **查看容器状态。** ```bash docker ps | grep sysdig62a295df7f57 ``` 4. **创建一个别名,使用 sysdig 查看容器中的系统调用。** ```bash alias sysdig='docker exec -it sysdig sysdig' ``` 5. **使用 sysdig 查看容器里的系统调用。** ```bash sysdig -p \"*%evt.time,%proc.name,%evt.type\" container.id=a61ae9de68a918:53:19.713884315,container:a61ae9de68a9,container18:53:52.943490750,http-echo,epoll_wait18:53:52.943525821,http-echo,futex18:53:52.943550469,http-echo,futex18:53:52.943553208,http-echo,accept18:53:52.943568162,http-echo,accept18:53:52.943618359,http-echo,epoll_ctl......18:53:52.945825176,http-echo,futex18:53:52.945831674,http-echo,switch六.总结: ``` **注意:** * 确保您运行的容器具有正确的权限,可以访问宿主机的设备和文件。 * 请根据您的环境调整 sysdig 的参数,例如 `container.id` 和 `container18`。

正文

一.系统环境

本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 18.04。

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
Ubuntu 18.04.5 LTS Docker version 20.10.14 v1.22.2 x86_64

Kubernetes集群架构:k8scludes1作为master节点,k8scludes2,k8scludes3作为worker节点。

服务器 操作系统版本 CPU架构 进程 功能描述
k8scludes1/192.168.110.128 Ubuntu 18.04.5 LTS x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scludes2/192.168.110.129 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scludes3/192.168.110.130 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

在现代的微服务架构中,容器化技术已经成为了标准。然而,随着服务的复杂性增加,监控和调试也变得越来越困难。Sysdig是一种强大的系统和网络安全监控工具,它可以帮助我们深入理解容器内部的系统调用。本文将介绍如何使用Sysdig来查看容器内的系统调用。

使用sysdig查看容器里的系统调用的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Ubuntu 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/17632858.html。

三.系统调用简介

系统调用是操作系统提供的接口,应用程序可以通过它来请求操作系统的服务。例如,读写文件、创建进程等。通过分析系统调用,我们可以更好地理解应用程序的行为。

四.Sysdig简介

Sysdig是一个强大的系统和网络安全监控工具,它可以捕获和分析系统和网络活动。Sysdig可以提供实时的系统和网络视图,以及详细的事件信息。它支持多种平台,包括Linux、macOS和Windows。

默认情况下,sysdig 在一行中打印每个事件的信息,格式如下:

root@k8scludes3:~# sysdig
34378 12:02:36.269753803 2 echo (7896) > close fd=3(/usr/lib/locale/locale-archive)
34379 12:02:36.269754164 2 echo (7896) < close res=0
34380 12:02:36.269781699 2 echo (7896) > fstat fd=1(/dev/pts/3)

*%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args
  • evt.num 是增量事件编号
  • evt.time 是事件时间戳
  • evt.cpu 是捕获事件的 CPU 编号
  • proc.name 是生成事件的进程的名称
  • thread.tid 是产生事件的TID,对应单线程进程的PID
  • evt.dir 是事件方向,> 表示进入事件,< 表示退出事件
  • evt.type 是事件的名称,例如 ‘open’ 或 ‘read’
  • evt.args 是事件参数的列表。

可以使用sysdig -p修改输出格式:

sysdig   -p "*%evt.num %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args"

五.使用sysdig查看容器里的系统调用

5.1 以二进制包的形式安装sysdig

在博客《在kubernetes里使用seccomp限制容器的系统调用》中,我们使用strace查看执行命令时有哪些系统调用,那如何查看pod或者容器里执行了哪些系统调用呢?我们可以使用sysdig工具。

创建目录存放文件。

root@k8scludes1:~# mkdir systemsafe   

root@k8scludes1:~# cd systemsafe/

下载DRAIOS-GPG-KEY.public。

root@k8scludes1:~/systemsafe# wget https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public

导入key。

root@k8scludes1:~/systemsafe# cat DRAIOS-GPG-KEY.public | sudo apt-key add -
OK

下载draios.list。

root@k8scludes1:~/systemsafe# curl -s -o /etc/apt/sources.list.d/draios.list https://s3.amazonaws.com/download.draios.com/stable/deb/draios.list

root@k8scludes1:~/systemsafe# ll -h /etc/apt/sources.list.d/draios.list
-rw-r--r-- 1 root root 59 May 16 20:50 /etc/apt/sources.list.d/draios.list

更新软件源。

root@k8scludes1:~/systemsafe# apt-get update
Hit:1 http://mirrors.aliyun.com/ubuntu bionic InRelease                                                         
Get:2 http://mirrors.aliyun.com/ubuntu bionic-security InRelease [88.7 kB]                                                                                               
Hit:3 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease                                     
Hit:4 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease                                                                                
Get:5 http://mirrors.aliyun.com/ubuntu bionic-updates InRelease [88.7 kB]                                                   
Get:6 https://download.sysdig.com/stable/deb stable-amd64/ InRelease [1,301 B]       
Get:7 http://mirrors.aliyun.com/ubuntu bionic-proposed InRelease [242 kB]                         
Get:8 http://mirrors.aliyun.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:9 http://mirrors.aliyun.com/ubuntu bionic-security/main Sources [272 kB]         
Get:10 http://mirrors.aliyun.com/ubuntu bionic-security/main i386 Packages [1,171 kB]
Get:11 https://download.sysdig.com/stable/deb stable-amd64/ Packages [11.1 kB]
Get:12 http://mirrors.aliyun.com/ubuntu bionic-security/main amd64 Packages [2,225 kB]
Get:13 http://mirrors.aliyun.com/ubuntu bionic-security/universe amd64 Packages [1,198 kB]
Get:14 http://mirrors.aliyun.com/ubuntu bionic-security/universe i386 Packages [1,018 kB]                                                                                                                        
Fetched 6,390 kB in 8s (781 kB/s)                                                                                                                                                                                
Reading package lists... Done

安装Linux 头。

root@k8scludes1:~/systemsafe# apt-get -y install linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
linux-headers-4.15.0-112-generic is already the newest version (4.15.0-112.113).
linux-headers-4.15.0-112-generic set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 213 not upgraded.

安装sysdig。

root@k8scludes1:~/systemsafe# apt-get -y install sysdig

现在sysdig就安装好了。

root@k8scludes1:~/systemsafe# which sysdig 
/usr/bin/sysdig

5.2 使用sysdig查看容器里的系统调用

创建nginx容器,并进行端口映射,-p 80:80表示物理机端口:容器端口。关于docker容器的详细操作,请查看博客《一文搞懂docker容器基础:docker镜像管理,docker容器管理》。

root@k8scludes1:~/systemsafe# docker run -dit --name=nginxweb --restart=always -p 80:80 nginx
a74aff1e39a2d9ff7cece775f6fec770d99801b61041bd108c427276e9ddf168

查看容器。

root@k8scludes1:~/systemsafe# docker ps | grep nginxweb
a74aff1e39a2   nginx                                               "/docker-entrypoint.…"   13 seconds ago   Up 10 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginxweb

在执行sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=a74aff1e39a2的时候,浏览器访问http://192.168.110.128/ ,就显示了系统调用,应该把启动/停止/重启/访问nginx容器的系统调用总结出来,这样才好配置seccomp profile,以便使用seccomp限制容器的系统调用,详情请查看博客《在kubernetes里使用seccomp限制容器的系统调用》。

#evt.time 是事件时间戳,proc.name 是生成事件的进程的名称,evt.type 是事件的名称,例如 ‘open’ 或 ‘read’即系统调用
root@k8scludes1:~/systemsafe# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=a74aff1e39a2
23:51:12.309668357,nginx,epoll_wait
23:51:12.309715073,nginx,accept
23:51:12.309729527,nginx,accept
23:51:12.309755667,nginx,epoll_ctl
23:51:12.309760249,nginx,epoll_ctl
23:51:12.309762753,nginx,epoll_wait
......
23:51:12.326853019,nginx,close
23:51:12.326854453,nginx,close
23:51:12.326860121,nginx,setsockopt
23:51:12.326924377,nginx,setsockopt
23:51:12.326931469,nginx,epoll_wait
23:51:12.326938835,nginx,switch
23:52:12.368369580,nginx,epoll_wait
23:52:12.368385842,nginx,close
23:52:12.368388496,nginx,close
23:52:12.368516088,nginx,epoll_wait
23:52:12.368522695,nginx,switch
23:52:17.329270467,nginx,epoll_wait
23:52:17.329293917,nginx,close
23:52:17.329297553,nginx,close
23:52:17.329453581,nginx,epoll_wait
23:52:17.329461491,nginx,switch

删除容器。

root@k8scludes1:~/systemsafe# docker rm -f nginxweb
nginxweb

现在有一个pod,audit-pod运行在k8scludes3节点上,可以去k8scludes3节点查看pod audit-pod的容器ID。

root@k8scludes1:~/systemsafe# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP             NODE         NOMINATED NODE   READINESS GATES
audit-pod   1/1     Running   0          5h8m   10.244.1.110   k8scludes3   <none>           <none>

查询到audit-pod的容器ID,就可以使用sysdig查看容器里的系统调用了。

root@k8scludes1:~/systemsafe# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=a61ae9de68a9

5.3 以容器的方式运行sysdig

这次在k8scludes3节点上,使用容器的方式运行sysdig。

拉取sysdig/sysdig镜像。

root@k8scludes3:~# docker pull sysdig/sysdig

创建容器,以容器的方式运行sysdig,因为相关数据卷已经把宿主机的目录映射到容器目录,容器里执行sysdig,相当于在宿主机里执行sysdig。

#挂载数据卷:-v 本地目录:容器目录
#使用--privileged标志来运行容器时,容器内的进程将具有对主机系统的完全访问权限,包括访问设备、挂载文件系统等,表示特权
root@k8scludes3:~# docker run -i -dt --name sysdig --restart=always --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig
62a295df7f57892cf5379e8acfebc9aa889a8fdd9148292d94c918b6d1641052

查看容器。

root@k8scludes3:~# docker ps | grep sysdig
62a295df7f57   sysdig/sysdig                                       "/docker-entrypoint.…"   About a minute ago   Up About a minute             sysdig

创建一个别名,现在执行sysdig命令相当于在容器里执行sysdig。

root@k8scludes3:~# alias sysdig='docker exec -it sysdig sysdig'

现在有一个pod。

root@k8scludes3:~# docker ps | grep audit-pod
a61ae9de68a9   a6838e9a6ff6                                        "/http-echo '-text=j…"   5 hours ago      Up 5 hours                k8s_test-container_audit-pod_systemsafe_0e4d967b-14e6-47c3-9038-95385d316d96_0
154ef7c62e24   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 5 hours ago      Up 5 hours                k8s_POD_audit-pod_systemsafe_0e4d967b-14e6-47c3-9038-95385d316d96_0

使用sysdig查看容器里的系统调用,但是报错了,没有驱动。

root@k8scludes3:~# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=a61ae9de68a9
Unable to load the driver
error opening device /host/dev/scap0. Make sure you have root credentials and that the scap module is loaded.

下载DRAIOS-GPG-KEY.public,导入key。

root@k8scludes3:~# curl -s https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public | sudo apt-key add -
OK

下载draios.list。

root@k8scludes3:~# curl -s -o /etc/apt/sources.list.d/draios.list https://s3.amazonaws.com/download.draios.com/stable/deb/draios.list

root@k8scludes3:~# ll -h /etc/apt/sources.list.d/draios.list
-rw-r--r-- 1 root root 59 May 16 20:50 /etc/apt/sources.list.d/draios.list

更新软件源。

root@k8scludes3:~# apt-get update

安装Linux 头。

root@k8scludes3:~# apt-get -y install linux-headers-$(uname -r)

使用sysdig查看容器里的系统调用。

root@k8scludes3:~# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=a61ae9de68a9
18:53:19.713884315,container:a61ae9de68a9,container
18:53:52.943490750,http-echo,epoll_wait
18:53:52.943525821,http-echo,futex
18:53:52.943550469,http-echo,futex
18:53:52.943553208,http-echo,accept
18:53:52.943568162,http-echo,accept
18:53:52.943618359,http-echo,epoll_ctl
......
18:53:52.945825176,http-echo,futex
18:53:52.945831674,http-echo,switch

六.总结:

通过使用Sysdig,我们可以深入理解容器内部的系统调用,从而更好地监控和调试我们的应用程序。Sysdig的强大功能和灵活性使其成为现代微服务架构中的必备工具。

与使用sysdig查看容器里的系统调用相似的内容:

使用sysdig查看容器里的系统调用

使用sysdig查看容器里的系统调用,sysdig -p "*%evt.num %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args",sysdig -p "*%evt.time,%proc.name,%evt.type" ...

[转帖]使用 sysdig 进行监控和调试 linux 机器

https://cizixs.com/2017/04/27/sysdig-for-linux-system-monitor-and-analysis/ sysdig 简介 sysdig 官网 上对自己的介绍是: Open Source Universal System Visibility With

使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本。 我这里选择的是 .net framework 版本。红框里面是 实现EF Code First 需要的包。 对应的版本:

使用explain优化慢查询的业务场景分析

问:你最害怕的事情是什么? 答:搓澡 问:为什么? 答:因为有些人一旦错过,就不在了 Explain 这个词在不同的上下文中有不同的含义。在数据库查询优化的上下文中,"EXPLAIN" 是一个常用的 SQL 命令,用于显示 SQL 查询的执行计划。执行计划是数据库如何执行查询的一个详细描述,包括它将

使用Github Action来辅助项目管理

Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作,包括CI/CD,并在完全定制的工作流中组合操作。 持续集成需要做

使用 GPU 进行 Lightmap 烘焙 - 简单 demo

作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很着迷。一方面,这个方案历久弥新,虽然很古老,但是一直在实际项目中都有使用;另一方面,它能够产生非常高

使用 Spring 实现控制反转和依赖注入

使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传

使用Kubesec检查YAML文件安全

使用Kubesec检查YAML文件安全,YAML文件是Kubernetes配置的主要载体,因此,检查YAML文件的安全性对于确保Kubernetes集群的安全至关重要,Kubesec简介,使用Kubesec检查YAML文件安全,kubesec scan podyamlsafe.yaml

使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数

大语言模型的发展日新月异,记得在去年这个时候,函数调用还是gpt-4的专属。到今年本地运行的大模型无论是推理能力还是文本的输出质量都已经非常接近gpt-4了。而在去年gpt-4尚未发布函数调用时,智能体框架的开发者们依赖构建精巧的提示词实现了gpt-3.5的函数调用。目前在本机运行的大模型,基于这一

使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!

NVIDIA ® TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了计算开销...