一个k8s pod报错端口被占用的问题

8 篇文章 0 订阅

问题现象

一个node_exporterdaemonset中出现两个pod无法正常启动。信息如下。这里node_exporter pod中的一个container需要使用hostNetwork9100端口。

Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  43s (x31 over 34m)  default-scheduler  0/10 nodes are available: 1 node(s) didn't have free ports for the requested pod ports, 9 node(s) didn't match Pod's node affinity/selector.

此问题,眨眼一看,就确定是端口被占用了。

有可能是客户端临时占用了,过会儿释放就会好了。

然后过了好久,一直是Pending状态,于是到相关的服务器上查看。

  1. netstat命令没有找到被使用的端口;
  2. /proc/net/nf_conntrack中也没有找到相应的端口信息;
  3. iptables信息中没有找到9100端口的信息;
  4. tcpdump也看不到9100端口的正常通信;
    • 有请求流量,不过都返回了rst;

遇到怪事了。

解决

尝试在这台node上,直接运行--network hostnode_exporter是成功的,这说明是k8s层面认为端口被占用了,而不是端口真的被占用了。

突然想到之前为traefikports添加了一个9100的端口,而且这个traefikhostNetwork: true的。

验证之下果然如此。

结论:如果为pod配置了hostNetwork: true, 且其ports中有了某个port,那么即使这个port并未真正监听,别的pod也无法使用了。

在陌生环境中如何找到此类pod?

这是自己的集群,正好想到这个事了。

如果是在一个陌生的集群呢?这时如何找到呢?

这个可以到node上遍历container, 通过inspect命令找到相应的端口。

Labels下有annotation.io.kubernetes.container.ports,其中记录了ports的信息。

当然,关于1 node(s) didn't have free ports for the requested pod ports这个问题,并不一定就是这里的这种情况。还需要结合自己的环境实际来判断,最基本的就是无法使用期望的端口所造成的。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值