摘要:安裝好的命令在目錄下面,所以我們可以把這個路徑加到終端的配置文件中。這里面其實下載了兩個文件,其中一個是,另外一個是,稍后我們會看到這個的用途。我們拿第一個出來測試下抓包。為了方便敘述,我們把每一行輸出都標上了數字。
背景
在 Kubernetes 的實際使用中,我們經常需要配合業務調查問題,對于微服務來說,這個問題更多的是查看 API 的調用情況,這些API或者采用 RPC 協議或者是采用 HTTP 的協議。這兩種協議都是基于 TCP 的協議,所以一般我們會到容器中使用 tcpdump 工具來抓包,然后就地或者拿出來放到 wireshark 圖形化軟件里面分析。
這種情況下,需要我們的基礎鏡像提前把 tcpdump 等排查工具打包進去,否則線上安裝 debug 軟件,一者違反安全規則,另外如果需要支持的 Pod 過多,安裝 debug 工具本身就有不小的工作量。
krew在 Kubernetes 中,有一個插件命令叫做 krew,可以通過這個命令來安裝一個叫做 sniff 的插件工具來完成這個工作。下面我們先看看如何安裝這個 krew 插件。
krew 的項目地址在:https://github.com/kubernetes-sigs/krew 。如果有興趣可以自行瀏覽,我們這里介紹下在 Centos 等 Linux 下面如何安裝。
首先,需要確認系統安裝了 git 。
其次,復制下面的命令到終端軟件中,這段命令會去下載和安裝這個 krew 插件。
$( set -x; cd "$(mktemp -d)" && curl -fsSLO "https://storage.googleapis.com/krew/v0.2.1/krew.{tar.gz,yaml}" && tar zxvf krew.tar.gz && ./krew-"$(uname | tr "[:upper:]" "[:lower:]")_amd64" install --manifest=krew.yaml --archive=krew.tar.gz )
安裝好的 krew 命令在目錄 ~/.krew/bin 下面,所以我們可以把這個路徑加到終端的配置文件中。一般是 ~/.bashrc 或者是 ~/.zshrc。
例如,使用如下的命令將 krew 命令的所在路徑寫入到 $PATH 中。
$ echo "export PATH=$PATH:$HOME/.krew/bin" >> ~/.bashrc
需要注意的是,上面設置的這個路徑同時也是通過 krew 安裝的其他的插件命令所在的目錄,所以一次設置后面其他的命令都可以直接使用了。
安裝完 krew 之后,我們需要通過 kubectl krew update 命令來更新支持的插件命令列表,下載下來的 Plugin 配置文件都存放在 ~/.krew/index/plugins 下面。
$ kubectl krew update Updated the local copy of plugin index.sniff
我們可以使用命令 kubectl krew install sniff 來安裝這個插件命令,安裝好的命令位于 ~/.kube/store/sniff 下面。
$ kubectl krew install sniff Updated the local copy of plugin index. Installing plugin: sniff CAVEATS: | This plugin needs the following programs: | * wireshark (optional, used for live capture) / Installed plugin: sniff
我們可以看下 sniff 命令的所在目錄下的文件。
$ ls -ahl ~/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/ total 36M drwx------ 2 root root 4.0K Jun 11 17:58 . drwxr-xr-x 3 root root 4.0K Jun 11 17:58 .. -rwxr-xr-x 1 root root 33M Jun 11 17:58 kubectl-sniff -rwxr-xr-x 1 root root 2.6M Jun 11 17:58 static-tcpdump
這里面其實下載了兩個文件,其中一個是 sniff,另外一個是 tcpdump,稍后我們會看到這個 tcpdump 的用途。
Pod 抓包我們首先找個 Pod 來研究下 sniff 的具體抓包操作方法。
NAME READY STATUS RESTARTS AGE echo-go-bdf4bd7ff-v6hml 1/1 Running 0 8h echo-java-55c5dcbbc9-7dh5c 1/1 Running 1 30h
我們拿第一個 Pod 出來測試下抓包。
$ kubectl sniff echo-go-bdf4bd7ff-v6hml -n devops <1> INFO[0000] sniffing method: upload static tcpdump <2> INFO[0000] using tcpdump path at: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" <3> INFO[0000] no container specified, taking first container we found in pod. <4> INFO[0000] selected container: "echo-go" <5> INFO[0000] sniffing on pod: "echo-go-bdf4bd7ff-v6hml" [namespace: "devops", container: "echo-go", filter: "", interface: "any"] <6> INFO[0000] uploading static tcpdump binary from: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" to: "/tmp/static-tcpdump" <7> INFO[0000] uploading file: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" to "/tmp/static-tcpdump" on container: "echo-go" <8> INFO[0000] executing command: "[/bin/sh -c ls -alt /tmp/static-tcpdump]" on container: "echo-go", pod: "echo-go-bdf4bd7ff-v6hml", namespace: "devops" <9> INFO[0000] command: "[/bin/sh -c ls -alt /tmp/static-tcpdump]" executing successfully exitCode: "0", stdErr :"" <10> INFO[0000] file found: "-rwxr-xr-x 1 root root 2642872 Jan 1 1970 /tmp/static-tcpdump" <11> INFO[0000] file was already found on remote pod <12> INFO[0000] tcpdump uploaded successfully <13> INFO[0000] spawning wireshark! <14> INFO[0000] starting sniffer cleanup <15> INFO[0000] sniffer cleanup completed successfully <16> Error: exec: "wireshark": executable file not found in $PATH
為了方便敘述,我們把每一行輸出都標上了數字。這些數字不在實際輸出的結果中。 從第 <1> - <7> 行我們可以看出,sniff 命令把我們剛剛看到的 static-tcpdump 上傳到 Pod 中,我們可以到 Pod 里面在 /tmp 目錄下發現這個 static-tcpdump 文件。然后試圖啟動 wireshark 進程,但是由于我們服務器一般不安裝 wireshark 所以啟動失敗了。
這種情況下,我們可以使用一個新的選項 -o 來將抓包的內容輸出到文件中。
$ kubectl sniff echo-go-bdf4bd7ff-v6hml -n devops -o test.pcap kubectl sniff echo-go-bdf4bd7ff-v6hml -n devops -o pcap INFO[0000] sniffing method: upload static tcpdump INFO[0000] using tcpdump path at: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" INFO[0000] no container specified, taking first container we found in pod. INFO[0000] selected container: "echo-go" INFO[0000] sniffing on pod: "echo-go-bdf4bd7ff-v6hml" [namespace: "devops", container: "echo-go", filter: "", interface: "any"] INFO[0000] uploading static tcpdump binary from: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" to: "/tmp/static-tcpdump" INFO[0000] uploading file: "/root/.krew/store/sniff/71102253eded8900c8f7b0d0624c65b3c77ecd6bcd28fabc9a200daac502282a/static-tcpdump" to "/tmp/static-tcpdump" on container: "echo-go" INFO[0000] executing command: "[/bin/sh -c ls -alt /tmp/static-tcpdump]" on container: "echo-go", pod: "echo-go-bdf4bd7ff-v6hml", namespace: "devops" INFO[0000] command: "[/bin/sh -c ls -alt /tmp/static-tcpdump]" executing successfully exitCode: "0", stdErr :"" INFO[0000] file found: "-rwxr-xr-x 1 root root 2642872 Jan 1 1970 /tmp/static-tcpdump " INFO[0000] file was already found on remote pod INFO[0000] tcpdump uploaded successfully INFO[0000] output file option specified, storing output in: "pcap" INFO[0000] start sniffing on remote container INFO[0000] executing command: "[/tmp/static-tcpdump -i any -U -w - ]" on container: "echo-go", pod: "echo-go-bdf4bd7ff-v6hml", namespace: "devops"
這種情況下,我們看到容器中的 /tmp/static-tcpdump 命令已經啟動了,并把輸出導向到 stdout,然后我們在 sniff 命令中把它寫入到 test.pcap 文件中。
最后,我們就可以用本地的 wireshark 圖形化工具打開這個 test.pcap 文件進行分析了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32994.html
摘要:由于出于簡單可維護的目的,這個容器的基礎鏡像里面沒有帶上任何和網絡抓包相關的功能。這就為網絡抓包提供了基礎。抓包實踐我們現在用一個提供簡單服務的鏡像來進行測試。 背景 假設存在一個容器,提供的服務是 HTTP 或者 RPC 的服務。由于出于簡單可維護的目的,這個容器的基礎鏡像里面沒有帶上任何和網絡抓包相關的功能。那么如何能搞對這樣的容器進行抓包,以分析業務上面可能存在的問題呢? 共享網...
摘要:部分來自網絡,適用于學習,維護網絡安全,做合法公民一和不同,沒有面向連接的機制,其是一種不可靠的協議,沒有確認機制。 部分來自網絡,適用于學習,維護網絡安全,做合法公民 一、UDP 和TCP不同,UDP沒有面向連接的機制,其是一種不可靠的協議,沒有確認機制。也就是說只要其端口開放,有數據需要交互時直接進行數據交互,也不需要TCP的三次握手。這樣的話,基于UDP的攻擊比基于TCP的攻擊需...
摘要:請谷歌一波,會有遍地的解釋。網絡抓包實現使用實現網絡抓包非常容易。得益于谷歌的包這里我舉一個監聽網卡的主要代碼網卡名這段代碼就是監聽某個網卡,通過規則過濾點無用網絡包,規則語法與一樣。網絡抓包監控的優缺點優點應用無關性,監控工具通用性強。 微服務是什么? 此話題不是本文重點,如你還不知道。請谷歌一波,會有遍地的解釋。引用下圖說明下微服務可能呈現的形態:showImg(https://s...
閱讀 1815·2023-04-26 01:55
閱讀 1078·2021-09-30 09:47
閱讀 1673·2019-08-30 15:54
閱讀 740·2019-08-30 15:53
閱讀 692·2019-08-30 15:52
閱讀 1133·2019-08-30 15:44
閱讀 2409·2019-08-30 14:06
閱讀 1057·2019-08-29 16:39