摘要:安裝好的命令在目錄下面,所以我們可以把這個(gè)路徑加到終端的配置文件中。這里面其實(shí)下載了兩個(gè)文件,其中一個(gè)是,另外一個(gè)是,稍后我們會(huì)看到這個(gè)的用途。我們拿第一個(gè)出來測試下抓包。為了方便敘述,我們把每一行輸出都標(biāo)上了數(shù)字。
背景
在 Kubernetes 的實(shí)際使用中,我們經(jīng)常需要配合業(yè)務(wù)調(diào)查問題,對于微服務(wù)來說,這個(gè)問題更多的是查看 API 的調(diào)用情況,這些API或者采用 RPC 協(xié)議或者是采用 HTTP 的協(xié)議。這兩種協(xié)議都是基于 TCP 的協(xié)議,所以一般我們會(huì)到容器中使用 tcpdump 工具來抓包,然后就地或者拿出來放到 wireshark 圖形化軟件里面分析。
這種情況下,需要我們的基礎(chǔ)鏡像提前把 tcpdump 等排查工具打包進(jìn)去,否則線上安裝 debug 軟件,一者違反安全規(guī)則,另外如果需要支持的 Pod 過多,安裝 debug 工具本身就有不小的工作量。
krew在 Kubernetes 中,有一個(gè)插件命令叫做 krew,可以通過這個(gè)命令來安裝一個(gè)叫做 sniff 的插件工具來完成這個(gè)工作。下面我們先看看如何安裝這個(gè) krew 插件。
krew 的項(xiàng)目地址在:https://github.com/kubernetes-sigs/krew 。如果有興趣可以自行瀏覽,我們這里介紹下在 Centos 等 Linux 下面如何安裝。
首先,需要確認(rèn)系統(tǒng)安裝了 git 。
其次,復(fù)制下面的命令到終端軟件中,這段命令會(huì)去下載和安裝這個(gè) 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 下面,所以我們可以把這個(gè)路徑加到終端的配置文件中。一般是 ~/.bashrc 或者是 ~/.zshrc。
例如,使用如下的命令將 krew 命令的所在路徑寫入到 $PATH 中。
$ echo "export PATH=$PATH:$HOME/.krew/bin" >> ~/.bashrc
需要注意的是,上面設(shè)置的這個(gè)路徑同時(shí)也是通過 krew 安裝的其他的插件命令所在的目錄,所以一次設(shè)置后面其他的命令都可以直接使用了。
安裝完 krew 之后,我們需要通過 kubectl krew update 命令來更新支持的插件命令列表,下載下來的 Plugin 配置文件都存放在 ~/.krew/index/plugins 下面。
$ kubectl krew update Updated the local copy of plugin index.sniff
我們可以使用命令 kubectl krew install sniff 來安裝這個(gè)插件命令,安裝好的命令位于 ~/.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
這里面其實(shí)下載了兩個(gè)文件,其中一個(gè)是 sniff,另外一個(gè)是 tcpdump,稍后我們會(huì)看到這個(gè) tcpdump 的用途。
Pod 抓包我們首先找個(gè) 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
我們拿第一個(gè) 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
為了方便敘述,我們把每一行輸出都標(biāo)上了數(shù)字。這些數(shù)字不在實(shí)際輸出的結(jié)果中。 從第 <1> - <7> 行我們可以看出,sniff 命令把我們剛剛看到的 static-tcpdump 上傳到 Pod 中,我們可以到 Pod 里面在 /tmp 目錄下發(fā)現(xiàn)這個(gè) static-tcpdump 文件。然后試圖啟動(dòng) wireshark 進(jìn)程,但是由于我們服務(wù)器一般不安裝 wireshark 所以啟動(dòng)失敗了。
這種情況下,我們可以使用一個(gè)新的選項(xiàng) -o 來將抓包的內(nèi)容輸出到文件中。
$ 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 命令已經(jīng)啟動(dòng)了,并把輸出導(dǎo)向到 stdout,然后我們在 sniff 命令中把它寫入到 test.pcap 文件中。
最后,我們就可以用本地的 wireshark 圖形化工具打開這個(gè) test.pcap 文件進(jìn)行分析了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32994.html
摘要:由于出于簡單可維護(hù)的目的,這個(gè)容器的基礎(chǔ)鏡像里面沒有帶上任何和網(wǎng)絡(luò)抓包相關(guān)的功能。這就為網(wǎng)絡(luò)抓包提供了基礎(chǔ)。抓包實(shí)踐我們現(xiàn)在用一個(gè)提供簡單服務(wù)的鏡像來進(jìn)行測試。 背景 假設(shè)存在一個(gè)容器,提供的服務(wù)是 HTTP 或者 RPC 的服務(wù)。由于出于簡單可維護(hù)的目的,這個(gè)容器的基礎(chǔ)鏡像里面沒有帶上任何和網(wǎng)絡(luò)抓包相關(guān)的功能。那么如何能搞對這樣的容器進(jìn)行抓包,以分析業(yè)務(wù)上面可能存在的問題呢? 共享網(wǎng)...
摘要:部分來自網(wǎng)絡(luò),適用于學(xué)習(xí),維護(hù)網(wǎng)絡(luò)安全,做合法公民一和不同,沒有面向連接的機(jī)制,其是一種不可靠的協(xié)議,沒有確認(rèn)機(jī)制。 部分來自網(wǎng)絡(luò),適用于學(xué)習(xí),維護(hù)網(wǎng)絡(luò)安全,做合法公民 一、UDP 和TCP不同,UDP沒有面向連接的機(jī)制,其是一種不可靠的協(xié)議,沒有確認(rèn)機(jī)制。也就是說只要其端口開放,有數(shù)據(jù)需要交互時(shí)直接進(jìn)行數(shù)據(jù)交互,也不需要TCP的三次握手。這樣的話,基于UDP的攻擊比基于TCP的攻擊需...
摘要:請谷歌一波,會(huì)有遍地的解釋。網(wǎng)絡(luò)抓包實(shí)現(xiàn)使用實(shí)現(xiàn)網(wǎng)絡(luò)抓包非常容易。得益于谷歌的包這里我舉一個(gè)監(jiān)聽網(wǎng)卡的主要代碼網(wǎng)卡名這段代碼就是監(jiān)聽某個(gè)網(wǎng)卡,通過規(guī)則過濾點(diǎn)無用網(wǎng)絡(luò)包,規(guī)則語法與一樣。網(wǎng)絡(luò)抓包監(jiān)控的優(yōu)缺點(diǎn)優(yōu)點(diǎn)應(yīng)用無關(guān)性,監(jiān)控工具通用性強(qiáng)。 微服務(wù)是什么? 此話題不是本文重點(diǎn),如你還不知道。請谷歌一波,會(huì)有遍地的解釋。引用下圖說明下微服務(wù)可能呈現(xiàn)的形態(tài):showImg(https://s...
閱讀 1830·2023-04-26 01:55
閱讀 1090·2021-09-30 09:47
閱讀 1685·2019-08-30 15:54
閱讀 750·2019-08-30 15:53
閱讀 705·2019-08-30 15:52
閱讀 1145·2019-08-30 15:44
閱讀 2421·2019-08-30 14:06
閱讀 1070·2019-08-29 16:39