我有一个 Kubernetes 集群,其部署的端口范围指定为环境变量。在集群顶部运行的应用程序将通过指定的端口范围接收连接,如果在有另一个传入连接时没有可用的端口,则应用程序将关闭所有当前连接(从用户视角)。
我没有开发这个应用程序并且无法控制它。我只是设置和管理集群以及集群所在的虚拟机,但我还负责找出一种方法来监控范围内端口的可用性,以便可以发送警报。
我尝试过的事情:
我编写了一个脚本(如下)来检查单个 VM 上指定端口范围的可用性。问题是我需要能够在集群向上和向下扩展时连续检查所有虚拟机的端口。
对于处理这样的动态环境,我能想到的唯一想法是在集群中拥有一个类似于我的脚本的端口监控应用程序,它将专门对运行其他应用程序的 VM 执行此监控。
但问题是在远程检查端口时,无论端口是否正在使用,状态都是关闭的。我已经尝试过nc -zv <VM_ip> <port>
,相当于在 nmap 中检查远程端口。端口范围通常在 1.6 万或 3 万之间。
但是,在本地检查端口时ss -pu state all
,不会显示未使用的端口。将出现正在使用的端口,并且它们的状态为“UNCONN”,我假设它是未连接的。
如前所述,此脚本能够检查指定范围内的端口是否正在本地计算机上使用。请注意,我计划将此脚本作为后台进程运行,这就是为什么它处于无限循环中的原因。
#!/bin/bash
PORT_START=16384
PORT_END=16394
PORT_RANGE=$((PORT_END - PORT_START))
while true; do
for (( i=0; i<=PORT_RANGE; i++ )); do
port=$((PORT_START + i))
if lsof -Pi :${port} > /dev/null ; then
echo "Port ${port} is being used" >> test.txt
fi
done
done