出现这个问题,一般是由于路由不通导致的,需要进行抓包排查。

 

首先要解决的问题是,如何在 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 的内网域名,导致无法访问。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐