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