
Kubernetes 故障排查工具Sysdig
简介
sysdig是一个系统监控、分析和排障的工具。
很多时候,系统级监控和故障排除仍然涉及使用 SSH 登录机器,并使用大量界面不一致的过时工具。许多这些经典的 Linux 工具在容器化环境中完全崩溃。Sysdig 将您的 Linux 工具包整合到一个单一、一致、易于使用的界面中。sysdig 独特的架构允许对容器进行深入检查,开箱即用,无需以任何方式检测容器本身。
Sysdig 通过安装到 Linux 内核并捕获系统调用和其他操作系统事件,在操作系统级别检测您的物理机和虚拟机。Sysdig 还可以为系统活动创建跟踪文件,类似于使用 tcpdump 和 Wireshark 等工具对网络执行的操作。这样,可以在以后分析问题,而不会丢失重要信息。丰富的系统状态存储在跟踪文件中,因此可以将捕获的活动放入完整的上下文中。
把 sysdig 想象成 strace + tcpdump + htop + iftop + lsof + …awesome sauce。
安装
自动安装
要一步自动安装 sysdig,只需运行以下命令。这是推荐的安装方法。
警告:安装脚本只会在验证所有要求后从 Draios APT/YUM 存储库安装 sysdig 包。
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash
在 Docker 容器内安装
docker pull sysdig/sysdig
docker run -i -t --name sysdig --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
这样也可以
sudo docker run --rm -i -t --privileged --net=host \
-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 /src:/src \
-v /lib/modules:/host/lib/modules:ro \
-v /usr:/host/usr:ro \
-v /etc:/host/etc:ro \
docker.io/sysdig/sysdig
以非 root 用户身份使用 sysdig
Sysdig 必须以 root 身份运行,因为:
1.它需要扫描整个/proc
文件系统
2.它需要访问/dev/sysdig*
设备
3.它需要自动加载sysdig-probe
内核模块以防它尚未加载
但是,有一个解决方案允许非 root 用户使用sudo.
首先创建一个您想要授予运行 sysdig 的权限的组。
groupadd sysdig
将能够运行 sysdig 的用户添加到该组。
usermod -aG sysdig alice
usermod -aG sysdig bob
用于visudo
编辑sudo-config
。添加该行%sysdig ALL= /path/to/sysdig
并保存。该路径最有可能/usr/local/bin/sysdig
,但您可以通过运行来确定which sysdig
。
现在允许 sysdig 组的每个成员使用该sudo命令,但仅限于 sysdig 二进制文件。
更多安装方式请参考:
https://github.com/draios/sysdig/wiki/How-to-Install-Sysdig-for-Linux
https://github.com/draios/sysdig/wiki/How-to-Install-Sysdig-for-Windows-and-OSX
Sysdig 示例
查看网络带宽使用率最高的进程
sysdig -c topprocs_net
显示与主机 172.17.0.38 交互的网络数据
作为二进制
sysdig -s2000 -X -c echo_fds fd.cip=172.17.0.38
作为ASCII
sysdig -s2000 -A -c echo_fds fd.cip=172.17.0.38
查看本地服务器端口
查看与服务器端口,已经建立的连接(结果第一列是端口,第二列是连接数):
sysdig -c fdcount_by fd.sport "evt.type=accept"
每个端口使用的字节数:
sysdig -c fdbytes_by fd.sport
查看排名靠前的客户端 IP
与服务器已建立的连接的客户端
sysdig -c fdcount_by fd.cip "evt.type=accept"
总字节数
sysdig -c fdbytes_by fd.cip
列出所有不是 apache 服务的传入连接。
sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
容器
查看机器上运行的容器列表及其资源使用情况
sudo csysdig -vcontainers
查看带有容器上下文的进程列表
sudo csysdig -pc
查看 kube-controller 容器内运行的进程的 CPU 使用率
sysdig -pc -c topprocs_cpu container.name=k8s_kube-controller-manager_kube-controller-manager-controlplane_kube-system_f9b9c6969be80756638e9cf4927b5881_0
查看 etcd 容器内运行的进程的网络带宽使用情况
sudo sysdig -pc -c topprocs_net container.name=k8s_POD_etcd-controlplane_kube-system_2c805481b508b8c1f982fe7249ea6c02_0
查看 nginx 容器内使用最多网络带宽的进程
sudo sysdig -pc -c topprocs_net container.name=nginx
查看 nginx 容器内 I/O 字节数排名靠前的文件
sudo sysdig -pc -c topfiles_bytes container.name=nginx
查看 wordpress1 容器内的网络连接
sudo sysdig -pc -c topconns container.name=wordpress1
显示在 wordpress1 容器内执行的所有交互式命令
sudo sysdig -pc -c spy_users container.name=wordpress1
应用
查看机器发出的所有 GET HTTP 请求
sudo sysdig -s 2000 -A -c echo_fds fd.port=80 and evt.buffer contains GET
查看机器所做的所有 SQL 选择查询
sudo sysdig -s 2000 -A -c echo_fds evt.buffer contains SELECT
实时查看通过 apache 对外部 MySQL 服务器进行的查询
sysdig -s 2000 -A -c echo_fds fd.sip=192.168.30.5 and proc.name=apache2 and evt.buffer contains SELECT
磁盘 I/O
查看磁盘带宽使用率最高的进程
sysdig -c topprocs_file
列出使用大量文件的进程
sysdig -c fdcount_by proc.name "fd.type=file"
查看读+写字节数排名靠前的文件
sysdig -c topfiles_bytes
打印 apache 一直在读取或写入的顶级文件
sysdig -c topfiles_bytes proc.name=httpd
基本 opensnoop:snoop 文件在发生时打开
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
根据 R+W 磁盘活动查看顶级目录
sysdig -c fdbytes_by fd.directory "fd.type=file"
查看 /tmp 目录中关于 R+W 磁盘活动的顶级文件
sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"
观察所有名为“passwd”的文件的 I/O 活动
sysdig -A -c echo_fds "fd.filename=passwd"
按 FD 类型显示 I/O 活动
sysdig -c fdbytes_by fd.type
进程和 CPU 使用率
查看 CPU 使用率最高的进程
sysdig -c topprocs_cpu
观察一个进程的标准输出
sysdig -s4096 -A -c stdout proc.name=cat
性能和错误
查看花费最多时间的文件
sysdig -c topfiles_time
查看 apache 花费最多时间的文件
sysdig -c topfiles_time proc.name=httpd
查看 I/O 错误最多的进程
sysdig -c topprocs_errors
在 I/O 错误方面查看排名靠前的文件
sysdig -c topfiles_errors
查看所有失败的磁盘 I/O 调用
sysdig fd.type=file and evt.failed=true
查看 httpd 打开的所有失败文件
sysdig "proc.name=httpd and evt.type=open and evt.failed=true"
查看花费最多时间的系统调用
sysdig -c topscalls_time
查看返回错误最多的系统调用
sysdig -c topscalls "evt.failed=true"
snoop failed 文件在发生时打开
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open and evt.failed=true
打印延迟大于 1ms 的文件 I/O 调用
sysdig -c fileslower 1
安全
显示用户“root”访问的目录
sysdig -p"%evt.arg.path" "evt.type=chdir and user.name=root"
观察 ssh 活动
sysdig -A -c echo_fds fd.name=/dev/ptmx and proc.name=sshd
显示在 /etc 中打开的每个文件
sysdig evt.type=open and fd.name contains /etc
显示所有已启动“tar”命令的登录 shell 的 ID
sysdig -r file.scap -c list_login_shells tar
显示给定 ID 的登录 shell 执行的所有命令
sysdig -r trace.scap.gz -c spy_users proc.loginshellid=5459
sysdig 在取证分析中的应用:
钓鱼黑客:Linux 服务器攻击分析
钓鱼黑客:Linux 服务器攻击分析
追踪
创建跟踪以测量网站延迟
echo ">::website-latency::" > /dev/null
curl -s http://sysdig.org > /dev/null
echo "<::website-latency::" > /dev/null
测量由登录尝试定义的范围,由线程标识:
echo ">:t:login:username=loris:" > /dev/null
echo "<:t:login::" > /dev/null
常见问题
使用运行时检测工具检测redis这个pod下的单个容器中反常的和频繁发生异常的进程。
至少分析容器30s,使用过滤器检测最新的异常进程,将事件文件存储在/opt/2/report
中,其中包含检测到的事件,每行一个事件按照以下格式保存:
[timestamp],[uid],[processName]
保持工具的原始时间戳格式不变。
确保将事件文件存储在群集的工作节点上。
# 找到redis中的容器
docker ps | grep redis
# 检测与写入
sysdig -M 30 -p "*%evt.time,%user.uid,%proc.name" container.id=[redisid] > /opt/2/report
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

