kubernetes pod內抓包,telnet檢查網路連線的幾種方式
阿新 • • 發佈:2020-06-06
# 背景
在日常kubernetes的運維中,經常遇到pod的網路問題,如pod間網路不通,或者埠不通,更復雜的,需要在容器裡面抓包分析才能定位。而kubertnets的場景,pod使用的映象一般都是儘量精簡,很多都是基於alpine基礎映象製作的,因而pod內沒有ping,telnet,nc,curl命令,更別說tcpdump這種複雜的工具了。除了在容器或者映象內直接安裝這些工具這種最原始的法子,我們探討下其他法子。
# 實現
## kubectl debug外掛方式
專案地址 [kubect debug]([https://github.com/aylei/kubectl-debug](https://mp.weixin.qq.com/s/OeJFOWrewIlRoaJZXsfrgw)),[https://github.com/aylei/kubectl-debug](https://mp.weixin.qq.com/s/OeJFOWrewIlRoaJZXsfrgw)
`kubectl-debug` 是一個簡單的 kubectl 外掛,能夠幫助你便捷地進行 Kubernetes 上的 Pod 排障診斷。背後做的事情很簡單: 在執行中的 Pod 上額外起一個新容器,並將新容器加入到目標容器的 `pid`, `network`, `user` 以及 `ipc` namespace 中,這時我們就可以在新容器中直接用 `netstat`, `tcpdump` 這些熟悉的工具來解決問題了, 而舊容器可以保持最小化,不需要預裝任何額外的排障工具。操作流程可以參見官方專案地址文件。
一條 kubectl debug命令背後是這樣的
![image-20200605194618522](https://360linux.oss-cn-hangzhou.aliyuncs.com/img/image-20200605194618522.png)
步驟分別是:
1. 外掛查詢 ApiServer:demo-pod 是否存在,所在節點是什麼
2. ApiServer 返回 demo-pod 所在所在節點
3. 外掛請求在目標節點上建立 Debug Agent Pod
4. Kubelet 建立 Debug Agent Pod
5. 外掛發現 Debug Agent 已經 Ready,發起 debug 請求(長連線)
6. Debug Agent 收到 debug 請求,建立 Debug 容器並加入目標容器的各個 Namespace 中,建立完成後,與 Debug 容器的 tty 建立連線
接下來,客戶端就可以開始通過 5,6 這兩個連線開始 debug 操作。操作結束後,Debug Agent 清理 Debug 容器,外掛清理 Debug Agent,一次 Debug 完成。
![](https://360linux.oss-cn-hangzhou.aliyuncs.com/img/640.gif)
## 直接進入容器net ns方式
有2種進入pod 所在net ns的方式,前提都是需要登入到pod所在宿主機,且需要找出pod對應的容器ID或者名字。
### ip netns方式
- 獲取pod對應容器的ID或者name
```bash
pid="$(docker inspect -f '{{.State