如何優雅的在 Kubernetes Pod 內進行網路抓包
使用 Kubernetes 時,經常會遇到一些棘手的網路問題需要對 Pod 內的流量進行抓包分析。然而所使用的映象一般不會帶有 tcpdump ,過去常用的做法簡單直接暴力:登入到節點所在節點,使用 root 賬號進入容器,然後安裝 tcpdump。抓到的包有時還需要拉回本地,使用 Wireshark 進行分析。而且整個過程非常繁瑣,跨越幾個環境。
幾種方法各有優缺點,且都不建議在生產環境使用。假如必須使用,個人傾向於 kubectl debug 臨時容器的方案,但這個方案也有不足。
- 使用額外容器:這種方案為了 Pod 新增一個額外的容器,使用了靜態編譯的 tcpdump 進行抓取,藉助了多容器共享網路空間的特性,適合 distroless 容器。缺點是需要修改原來的 Pod,調式容器重啟會引起 Pod 重啟。
- kubectl plugin ksniff:一個 kubectl 外掛。支援特權和非特權容器,可以將捕獲內容重定向到 wireshark 或者 tshark。非特權容器的實現會稍微複雜。
- kubectl debug 臨時容器:該方案對於 distroless 容器有很好的支援,臨時容器退出後也不會導致 Pod 重啟。缺點是 1.23 的版本臨時容器才進入 beta 階段;而且筆者在將捕獲的資料重定向到本地的 Wireshark 時會報資料格式不支援的錯誤。
使用 k3d 建立 k3s 叢集,這裡版本選擇 1.23:
$ k3d cluster create test --image rancher/k3s:v1.23.4-k3s1
抓包的物件使用 Pipy[1] 執行的一個 echo 服務(返回請求的 body 內容):
$ kubectl run echo --image addozhang/echo-server --image-pull-policy IfNotPresent
為了方便訪問,建立一個 NodePort Service:
$ kubectl expose pod echo --name echo --port 8080 --type NodePort
在之前的文章我們介紹除錯 distroless 容器的幾種方法時曾用過修改 Pod 新增額外容器的方式,新的容器使用映象 addozhang/static-dump 映象。這個映象中加入了靜態編譯的 tcpdump。
修改後的 Pod:
apiVersion: v1 kind: Pod metadata: labels: run: echo name: echo spec: containers: - image: addozhang/echo-server imagePullPolicy: IfNotPresent name: echo resources: {} - image: addozhang/static-dump imagePullPolicy: IfNotPresent name: sniff command: ['sleep', '1d'] dnsPolicy: ClusterFirst restartPolicy: Always status: {}
重新部署後,就可以使用下面 將抓取網路包並重定向到本地的 Wireshark:
$ kubectl exec -i echo -c sniff -- /static-tcpdump -i eth0 -U -w - | wireshark -k -i -
debug-container
kubectl plugin ksniff
ksniff[2] 是一個 kubectl 外掛,利用 tcpdump 和 Wireshark 對 Pod 中的網路包實現遠端抓取。使用這種方法既可以藉助 Wireshark 的強大功能,又能降低對 Pod 的影響。
ksniff 的實現是上傳一個靜態編譯的tcpdump 到 Pod 中,然後將 tcpdump 的輸出重定向到本地的 Wireshark 進行除錯。
核心可以理解成 tcpdump -w - | wireshark -k -i -,與前面使用 debug 容器的方案類似。
透過 krew[3] 安裝:
$ kubectl krew install sniff
或者下載釋出包,手動安裝:
$ unzip ksniff.zip $ make install
使用說明參考 ksniff 官方說明[4],這裡我們只需要執行如下命令,預設就會重定向到 Wireshark,不需要顯示地指定:
$ kubectl sniff echo -n default -f "port 8080"
ksniff
除了使用 Wireshark,可以使用其命令列模式的 tshark:
$ kubectl sniff echo -n default -f "port 8080" -o - | tshark -r -
對於無特權的容器,就無法使用上面的方法了,會收到如下的錯誤提示:
INFO[0000] command: '[/tmp/static-tcpdump -i any -U -w - port 8080]' executing successfully exitCode: '1', stdErr :'static-tcpdump: any: You don't have permission to capture on that device (socket: Operation not permitted)
不過,Ksniff 對此類容器也提供了支援。透過新增 -p 引數,ksniff 會建立一個新的可以訪問節點上 Docker Daemon 的 pod,然後將容器附加到目標容器的網路名稱空間,並執行報文捕獲。
注意,筆者使用的是 k3s 的環境,執行命令時需要透過引數指定 Docker Daemon 的 socket 地址 --socket /run/k3s/containerd/containerd.sock
$ kubectl sniff echo -n default -f "port 8080" --socket /run/k3s/containerd/containerd.sock -p | wireshark -k -i -
ksniff-priviledged
接下來也是之前介紹過的 kubectl debug ,也就是為 Pod 新增臨時容器[5]。
同樣我們可以透過這種方法對 Pod 的網路進行抓包,臨時容器我們使用 addozhang/static-dump 映象。
$ kubectl debug -i echo --image addozhang/static-dump --target echo -- /static-tcpdump -i eth0
原本臨時容器應該是其中最接近完美的方案:不需上傳任何檔案目標容器、無需修改 Pod、無需重啟、無需特權、支援 distroless 容器。然而,當嘗試重定向到 Wireshark 或者 tshark 的時候,會遇到 Data written to the pipe is neither in a supported pcap format nor in pcapng format. 問題。
最後經過一番折騰,也未能解決該問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2895977/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kubernetes pod內抓包,telnet檢查網路連線的幾種方式
- 詳解Kubernetes Pod優雅退出
- EMQX 在 Kubernetes 中如何進行優雅升級MQ
- Android利用Fiddler進行網路資料抓包Android
- 如何優雅的在Golang中進行錯誤處理Golang
- 在 Android 上利用 tcpdump 進行抓包AndroidTCP
- Wireshark網路抓包
- 如何優雅的對UITableView進行解耦UIView解耦
- 網路流量抓包庫 gopacketGo
- Kubernetes的Pod進階(十一)
- 在 kubernetes 環境下如何優雅擴縮容 Pulsar
- 透過 VS Code 優雅地編輯 Pod 內的程式碼(非 NodePort)
- SpringBoot如何優雅的進行引數校驗Spring Boot
- Wireshark資料抓包分析(網路協議篇)第1章網路協議抓包概述協議
- 最新使用Charles進行HTTPS抓包的方法HTTP
- 如何對手機http進行抓包?Fiddler工具超好用HTTP
- 從Workload中優雅隔離Pod
- 使用describe命令進行Kubernetes pod錯誤排查
- Markdown 利用HTML進行優雅排版HTML
- 使用tcpdump+wireshark抓包分析網路資料包TCP
- SpringBoot介面 - 如何優雅的對引數進行校驗?Spring Boot
- 如何優雅的使用執行緒池執行緒
- 如何優雅的在flask中記錄logFlask
- 在 JavaScript 中優雅的提取迴圈內的資料JavaScript
- 如何在 Linux 下使用 TC 優雅的實現網路限流Linux
- 如何使用 RxJS 更優雅地進行定時請求JS
- 乾貨 |如何優雅的在手機上進行Python程式設計Python程式設計
- 在React專案中,如何優雅的優化長列表React優化
- 如何優雅的停止一個執行緒?執行緒
- 幾種常見網路抓包方式介紹
- Debookee 8.1.2 網路資料抓包及分析工具
- 在 N1 盒子進行 Openwrt 的內網穿透內網穿透
- 在Java中如何優雅地判空Java
- 如何優雅的在flutter中使用loggerFlutter
- 如何優雅的在 koa 中處理錯誤
- 在2018年如何優雅的開發一個typescript語言的npm包?TypeScriptNPM
- SolarNetwork-優雅的Swift網路封裝Swift封裝
- Retrofit+Rxjava網路層的優雅封裝RxJava封裝