本文介绍如何在容器计算服务 ACS(Container Compute Service)中,为工作负载注入集成了tcpdump等网络工具的临时容器,进行网络抓包并排查网络问题。
背景信息
tcpdump是一种常用的网络抓包工具,能够捕获通过网络接口传输的数据包并进行实时分析。运维人员可以利用tcpdump监控和记录网络流量,获取数据包的详细信息,如源地址、目标地址和传输协议等。这些信息对于识别网络问题、诊断延迟、丢包或连接异常等情况提供了重要线索,有助于快速定位并解决网络故障。
在ACS集群中,为工作负载注入临时容器进行网络抓包的操作流程如下:
操作步骤
以下示例通过部署一个示例应用,并手动向应用注入包含必要的工具软件(如tcpdump)的临时容器,演示如何在临时容器内抓取示例应用的网络数据包。
使用以下内容,创建acs-tcpdump.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: acs-tcpdump namespace: default spec: replicas: 1 selector: matchLabels: app: acs-tcpdump strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default app: acs-tcpdump spec: containers: - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent name: tcpdump resources: limits: cpu: 500m memory: 1Gi requests: cpu: 500m memory: 1Gi dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30
执行以下命令,部署应用。
kubectl apply -f acs-tcpdump.yaml
为示例应用注入临时容器。
kubectl debug -n default acs-tcpdump-7d959xxxxx-xxxxx --image=registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo:alpha.v1 -c acs-tcpdump --container=debug-container --profile=netadmin
重要验证过程中,如果参数profile的可选值
netadmin
所提供的权限无法满足您的需求,可以考虑将profile的值改为sysadmin
。使用sysadmin
参数需要为Pod开启特权,建议在生产环境中谨慎操作,并确保执行充分的审计与监控。ACS集群默认禁止启用特权,若需要开启特权模式,请提交工单。
上述临时容器使用的镜像中,包含以下工具:
工具名称
工具作用
是否依赖特权
Trace-CMD
追踪内核函数的命令工具。更多信息,请参见trace-cmd。
需要
perf
perf是Linux kernel自带的系统性能优化工具。更多信息,请参见perf。
需要
SysAK
SysAK(System Analysis Kit)是龙蜥社区提供的运维工具软件集,包含如问题诊断、事件监控/跟踪以及系统和服务等相关操作工具。
部分需要
Strace
Strace是一个可用于诊断和调试的Linux用户空间跟踪器。用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。更多信息,请参见strace。
需要
tcpdump
tcpdump是一个强大的网络抓包工具,用于捕获和分析网络流量。它可以在命令行中运行,并提供详细的网络数据包信息,帮助用户诊断网络问题、监控网络流量以及进行安全分析。
需要
IProute2
IProute2是一组用于网络配置和管理的命令行工具,旨在替代旧的net-tools工具集(如ifconfig、route、netstat等)。
需要
Nmap-ncat
Nmap-ncat是nmap项目中的一个工具,通常称为ncat。Ncat是一个功能强大的网络工具,可以用于读写数据到网络连接,类似于netcat(nc),但提供了更多的功能和改进。
需要
确认临时容器的注入状态。
kubectl describe pod acs-tcpdump-7d959xxxxx-xxxxx | grep Containers: -A 10
预期输出:
Containers: tcpdump: Container ID: containerd://71da93ea68ec02a2bcd468b7835ecd12d8180d4a05ac80d77ff4dcab61aea701 Image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 Image ID: registry.openanolis.cn/openanolis/nginx@sha256:bb8fe1e8d4353f29768340bdcbe2bfbc105081d550d259fc11d07d2abe53b5d1 Port: <none> Host Port: <none> State: Running Started: Thu, 13 Feb 2025 10:23:33 +0800 Ready: True Restart Count: 0 -- Ephemeral Containers: debug-container: Container ID: containerd://5a26877432ab93a6a056b48d34e6c888a4f98c0662627728cf8d8ee4486f3342 Image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo:alpha.v1 Image ID: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo@sha256:64ee96ff1b0e000dc5ca0711685e09fe3a08e62a9c9bb1f354682b82f35bddee Port: <none> Host Port: <none> State: Running Started: Thu, 13 Feb 2025 10:24:38 +0800 Ready: False Restart Count: 0
可以看到
debug-container
已经注入成功。验证抓取网络数据包。
进入临时容器。
kubectl exec -it acs-tcpdump-7d959xxxxx-xxxxx -c debug-container -- bash
通过tcpdump命令抓取本机所有的TCP协议到端口80的数据包。
tcpdump -i eth0 'tcp port 80'
预期输出:
dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 03:09:10.752193 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [S], seq 202950596, win 64240, options [mss 1460,sackOK,TS val 3648381756 ecr 0,nop,wscale 7], length 0 03:09:10.753944 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [S.], seq 270454912, ack 202950597, win 29200, options [mss 1440,nop,nop,sackOK,nop,wscale 9], length 0 03:09:10.753966 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 1, win 502, length 0 03:09:10.754020 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [P.], seq 1:614, ack 1, win 502, length 613: HTTP: POST /logstores/kernel-logs/shards/lb HTTP/1.1 03:09:10.755776 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [.], ack 614, win 60, length 0 03:09:10.755825 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [P.], seq 1:26, ack 614, win 60, length 25: HTTP: HTTP/1.1 100 Continue 03:09:10.755829 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 26, win 502, length 0 03:09:10.755867 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [P.], seq 614:1654, ack 26, win 502, length 1040: HTTP 03:09:10.758773 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [P.], seq 26:243, ack 1654, win 66, length 217: HTTP: HTTP/1.1 200 OK 03:09:10.758786 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 243, win 501, length 0 03:09:10.758854 IP acs-tcpdump-7d959bxxxxx-xxxxx.50624 > 100.xxx.xxx.112.http: Flags [F.], seq 318721902, ack 4047870907, win 501, length 0 03:09:10.763400 IP 100.xxx.xxx.112.http > acs-tcpdump-7d959bxxxxx-xxxxx.50624: Flags [F.], seq 1, ack 1, win 83, length 0 03:09:10.763413 IP acs-tcpdump-7d959bxxxxx-xxxxx.50624 > 100.xxx.xxx.112.http: Flags [.], ack 2, win 501, length 0 03:09:11.219397 IP acs-tcpdump-7d959bxxxxx-xxxxx.50638 > 100.xxx.xxx.112.http: Flags [P.], seq 2989834529:2989835691, ack 1755317949, win 501, length 1162: HTTP: POST /logstores/memory-metrics/shards/lb HTTP/1.1 03:09:11.219451 IP acs-tcpdump-7d959bxxxxx-xxxxx.50644 > 100.xxx.xxx.112.http: Flags [P.], seq 1733121609:1733122681, ack 40604405, win 501, length 1072: HTTP: POST /logstores/disk-metrics/shards/lb HTTP/1.1
临时容器中内置了OSSUtil工具,您可以通过tcpdump的参数
-w packets.pcap
生成数据包,再使用OSSUtil工具将抓取的数据包上传到OSS,方便下载到本地进行分析。说明示例提供的临时容器内置了
3600
秒的倒计时。在抓包调试完成后,您可以等待临时容器自行退出,或手动删除被抓包的Pod,直接清理调试容器。请确保在业务低峰期进行操作,避免对实际业务造成影响。
相关内容
以下为构建本文临时容器的Dockerfile,您可以根据此内容并结合实际需求进行构建。
FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest
# 更新系统软件
RUN dnf update --security -y && dnf upgrade --security -y && dnf clean all && rm -rf /var/cache/dnf/ && rm -rf /core.*
# 安装必要的网络等一些工具包
RUN yum install net-tools iputils tcpdump wget iproute bind-utils nmap-ncat procps-ng -y && yum update -y
# 安装必要的内核分析的trace工具包
RUN yum install perf sysak strace trace-cmd -y && yum clean all && rm -rf /var/cache/yum/
# 为了方便调试k8s相关的内容,放一些工具
# osscmd
COPY tools/ossutil64 /home/app/tools/ossutil
# 设置工作目录
WORKDIR /home/app
ENTRYPOINT ["/bin/bash","-c","sleep 3600"]