问题现象
一个node_exporter
的daemonset
中出现两个pod
无法正常启动。信息如下。这里node_exporter pod
中的一个container
需要使用hostNetwork
的9100
端口。
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
状态,于是到相关的服务器上查看。
netstat
命令没有找到被使用的端口;/proc/net/nf_conntrack
中也没有找到相应的端口信息;iptables
信息中没有找到9100端口的信息;tcpdump
也看不到9100
端口的正常通信;- 有请求流量,不过都返回了
rst
;
- 有请求流量,不过都返回了
遇到怪事了。
解决
尝试在这台node上,直接运行--network host
的node_exporter
是成功的,这说明是k8s层面认为端口被占用了,而不是端口真的被占用了。
突然想到之前为traefik
在ports
添加了一个9100
的端口,而且这个traefik
是hostNetwork: 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
这个问题,并不一定就是这里的这种情况。还需要结合自己的环境实际来判断,最基本的就是无法使用期望的端口所造成的。