使用sysdig檢視容器裡的系統呼叫

人生的哲理發表於2024-05-31

目錄
  • 一.系統環境
  • 二.前言
  • 三.系統呼叫簡介
  • 四.Sysdig簡介
  • 五.使用sysdig檢視容器裡的系統呼叫
    • 5.1 以二進位制包的形式安裝sysdig
    • 5.2 使用sysdig檢視容器裡的系統呼叫
    • 5.3 以容器的方式執行sysdig
  • 六.總結:

一.系統環境

本文主要基於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的強大功能和靈活性使其成為現代微服務架構中的必備工具。

相關文章