k8s中pod的hostport端口突然无法访问故障处理

故障背景:
租户告知生产环境的sftp突然无法访问了,登录环境查看sftp服务运行都是正常的,访问sftp的hostport端口确实不通。

故障处理过程
既然访问不通那就先给服务做个全面检查,看看哪里出了问题,看下sftp日志,也没有啥关键报错,接下来查看了下sftp服务的svc端口,发现通过svc地址和端口是能正常访问的,通过pod IP去访问也是可以,这就很奇怪了,唯独用主机ip加hostport端口就访问不通。
尝试手段一: 跟租户沟通,看看能否重启服务试试,发现重启完服务,还是老样子,通过hostport访问依然不通。
尝试手段二: 登录到对应的sftp主机,查看sftp服务对应的iptables规则是否有啥限制或者生产的容器服务规则转发有问题,发现iptables的规则没有做啥拦截,唯一的拦截是对icmp协议的,基本不是这个问题,然后查看到iptables规则中关于sftp hostport端口转发到目的服务地址有问题,以前的pod生产转发规则还存在,那就是以前的pod删除后,iptables规则没有及时跟新删除,如下图所示有许多2022的hostport端口转发到sftp容器的22端口:
在这里插入图片描述然后尝试重启Kube-proxy使其重新加载规则看看,重启完之后查看规则确实正常了,但是请求sftp的hostport端口仍然不通。
尝试手段三: 凡是再一再二,不再三,仔细分析下,通过业务主机和hostport访问,还会涉及走PREROUTING链,看下PREROUTING如下:

1)sudo iptables -t nat -nvL PREROUTING
2)sudo iptables -t nat -nvL CNI-HOSTPORT-DNAT

在这里插入图片描述

1)sudo iptables -t nat -nvL CNI-DN-5312d803d41f87c69f67f
查看对应2022端口号的nat规则
2)sudo iptables -t nat -nvL CNI-HOSTPORT-DNAT --line-numbers 查看对应规则的序号
3)sudo iptables -t nat -D CNI-HOSTPORT-DNAT 1 删除对应规则 ,注: 确定这条规则确实以前产生没用的。

具体操作步骤如下截图:
在这里插入图片描述
删完对应规则后,sftp的hostport访问正常。可能跟升级操作系统后防火墙出现问题导致pod销毁,规则无法回收。

### 回答1: k8s 中的 hostPort 是通过内部实现的虚拟网络来实现的。所以,使用 netstat 命令无法查看 hostPort 端口的状态。可以使用 kubectl 命令来查看 k8s 中的端口信息。例如,可以使用以下命令查看所有 pod端口信息: ``` kubectl get pods -o wide ``` 也可以使用以下命令查看指定 pod端口信息: ``` kubectl describe pod <pod-name> ``` 其中,<pod-name> 是 pod 的名称。 ### 回答2: k8s是一种容器编排工具,它允许我们在集群中部署和管理容器化的应用程序。在k8s中,可以使用hostPort来将容器的端口映射到主机的端口上。尽管在k8s中配置了hostPort,但使用netstat命令查找主机上的端口时,可能会发现无法找到相应的端口。下面是一些可能的原因: 1. netstat仅显示本地进程监听的端口:netstat命令只能显示正在运行的本地进程监听的端口k8s使用诸如docker等容器运行时来管理容器,而这些容器运行时会在主机上创建虚拟网络接口来实现容器与主机的通信。因此,容器端口并未直接与主机上的进程绑定,而是绑定到虚拟网络接口上。 2. k8s使用iptables进行端口转发:k8s使用iptables规则来实现容器和主机之间的通信,将容器端口转发到主机上。当我们使用netstat来查询主机上的端口时,仅能查看到iptables配置中的端口映射规则,而无法直接显示容器的端口。 3. 容器和主机网络隔离:为了实现容器之间的网络隔离,k8s使用了网络命名空间的概念,每个容器都运行在独立的网络命名空间中。这意味着netstat命令在默认情况下只能查看到当前命名空间中的端口,而无法跨命名空间查找其他网络命名空间中的端口。 综上所述,使用netstat命令可能无法直接查找到k8s中使用hostPort映射的端口。此时,可以通过kubectl命令或其他k8s相关的工具来查询容器和主机之间的端口映射关系。 ### 回答3: k8s中的hostPort是一种用于将容器的端口绑定到宿主机的端口的特性。当使用hostPort时,容器的端口将映射到宿主机的某个指定端口上,以便从宿主机网络中直接访问容器。 使用hostPort绑定后,通过netstat命令在宿主机上查看网络连接时,可能无法直接找到与容器相关的端口。这是因为hostPort绑定的端口实际上是通过Linux的内核机制进行端口转发实现的。 在hostPort绑定时,宿主机的iptables规则会自动配置端口转发,将流量从宿主机的指定端口转发到容器中。这种转发是通过iptables的NAT(Network Address Translation)功能实现的。具体而言,iptables将目标IP设为宿主机自身的IP,目标端口设为容器的IP和端口,这样在netstat的输出中是不会直接看到容器相关的端口。 因此,如果使用netstat命令查看网络连接,建议使用以下命令来查找与hostPort绑定的端口转发: ```shell sudo iptables -t nat -nL ``` 以上命令将列出iptables中的NAT规则,其中可以找到与hostPort绑定的端口转发规则。可以通过查找包含宿主机的IP和相应的端口,来找到与容器相关的端口转发规则。 需要注意的是,hostPort会带来一些安全风险,因为容器直接暴露在宿主机网络上,可能会被外部网络直接访问。因此,在使用hostPort时应慎重考虑并采取适当的安全措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值