使用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

使用Cloudflare Worker加速docker镜像

前言 开发者越来越难了,现在国内的docker镜像也都️了,没有镜像要使用docker太难了,代理又很慢 现在就只剩下自建镜像的办法了 GitHub上有开源项目可以快速搭建自己的镜像库,不过还是有点麻烦,还好Cloudflare暂时还活着‍ 本文记录一下使用 Cloudf

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

Pybind11和CMake构建python扩展模块环境搭建

使用pybind11的CMake模板来创建拓展环境搭建 从Github上下载cmake_example的模板,切换分支,并升级pybind11子模块到最新版本 拉取pybind11使用cmake构建工具的模板仓库 git clone --recursive https://github.com/mr

说说RabbitMQ延迟队列实现原理?

使用 RabbitMQ 和 RocketMQ 的人是幸运的,因为这两个 MQ 自身提供了延迟队列的实现,不像用 Kafka 的同学那么苦逼,还要自己实现延迟队列。当然,这都是题外话,今天咱们重点来聊聊 RabbitMQ 延迟队列的实现原理,以及 RabbitMQ 实现延迟队列的优缺点有哪些? 很多人

使用FModel提取游戏资产

目录前言FModel简介FModel安装FModel使用初次使用资产预览资产导出附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看和提取UE4-

使用GSAP制作动画视频

GSAP 3Blue1Brown给我留下了深刻印象。利用动画制作视频,内容简洁,演示清晰。前两天刚好碰到一件事,我就顺便学习了一下怎么用代码做动画。 以javascrip为例,有两个动画引擎,GSAP和Animajs。由于网速的原因,询问了GPT后,我选择了GSAP来制作我的第一个动画视频。 制作动

使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类就这么简单!

前言 今天大姚给大家分享一个.NET开源、免费、跨平台(支持Windows、Linux、macOS多个操作系统)的机器学习框架:ML.NET。并且本文将会带你快速使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类。 ML.NET框架介绍 ML.NET 允许开发人员在其 .NET 应用程序

使用libzip压缩文件和文件夹

简单说说自己遇到的坑: 分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目录。这时就需要用更高级别的库,也就是minizip或li