要查看 Kubernetes 中某个端口(如 30873)是否被使用,以及被谁使用,通常我们分两步进行:
一、判断这个端口是不是某个 Service 的 NodePort
你可以用下面这个命令全局搜索所有 service:
kubectl get svc --all-namespaces -o jsonpath="{range .items[*]}{.metadata.namespace}{'\t'}{.metadata.name}{'\t'}{.spec.ports[*].nodePort}{'\n'}{end}" | grep 30873
如果你看到输出类似:
default my-nginx 30873
就说明这是 default
命名空间下的 my-nginx
service 正在使用 NodePort 30873
。
二、查看 Node 节点上是否监听该端口
登录到某个 Node 节点,使用以下命令检查端口是否监听:
sudo netstat -tulnp | grep 30873
# 或者
sudo ss -tulnp | grep 30873
# 或者
sudo lsof -i :30873
输出示例:
tcp6 0 0 :::30873 :::* LISTEN 12345/kube-proxy
说明这个端口正在被监听,可能由 kube-proxy
代理监听(对应 Kubernetes Service)。
三、查看是哪类 Service 类型占用了该端口
kubectl describe svc <service-name> -n <namespace>
看 Type: NodePort
以及 NodePort: <port>
字段,确认该端口是否映射为 NodePort。
补充:释放端口后的排查
如果你 已经删除了某个 Service,但端口仍显示被监听:
- 检查 kube-proxy 是否有残留规则未清理(可重启 kube-proxy)
- 检查 iptables 是否有规则未释放
- 确认服务是否真的删除(
kubectl get svc --all-namespaces | grep 30873
) - 等待 kube-proxy 同步(一般几秒钟内)
需要我帮你写个脚本自动查找占用端口的 service 吗?比如:
PORT=30873
kubectl get svc --all-namespaces -o jsonpath="{range .items[*]}{.metadata.namespace}{'\t'}{.metadata.name}{'\t'}{.spec.ports[*].nodePort}{'\n'}{end}" | grep $PORT