出現這個問題,一般是由於路由不通導致的,需要進行抓包排查。
首先要解決的問題是,如何在 ingress-controller 容器中安裝抓包工具。
1、由於 ingress-controller 的mandotory.yaml 中安全選項使用的是 33 用戶,安裝不了程序,因此咱們需要先修改spec.containers.securityContext下的配置
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
改成:
securityContext:
runAsUser: 0
2、 kubectl exec –it xxxx –n ingress-nginx /bin/bash 進入容器
3、 下載 tcpdump 並安裝
Ingress-controller的鏡像使用 Ubuntu ,因此使用 apt-get 更新安裝:
下載tcpdump及其依賴的libpcap
wget http://www.tcpdump.org/release/tcpdump-4.5.1.tar.gz
wget http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
因爲沒有編譯,所以需要安裝編譯環境:
Ingress-controller容器內基本上啥也沒有,直接使用 apt-get 命令會說找不到package
執行:apt-get update
之後依次執行:
apt-get install build-essential
apt-get install flex
apt-get install bison
考慮到要監聽指定網卡,你需要了解本機的網卡名稱,需要安裝 net-tools
apt-get install net-tools
4、解壓 libpcap-1.5.3.tar.gz 文件,在解壓後的文件中,依次執行 :
./config
make
make install
5、解壓 libpcap-1.5.3.tar.gz 文件,在解壓後的文件中,依次執行 :
./config
make
make install
6、完成後先看看網卡: ifconfig
咱們監聽 eth0 網卡即可
7、使用命令 tcpdump -i eth0 port 8080 -w /tmp/ingress.pcap 將抓包報文導出
8、訪問報錯的 ingress 連接,之後使用 kubectl cp 命令將 容器內部的 ingress.pcap 拿出來
9、使用 wireshark 工具分析包文件:(安裝鏈接:https://www.wireshark.org/download.html)
經分析,今天的報錯是因爲我們外網轉發內網時,存在代理,代理中的有個配置是錯誤的,它將外網的地址映射到了內網IP而不是 ingress 的內網域名,導致無法訪問。