本文介紹如何在Container Compute Service (ACS)中,為工作負載注入整合了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"]