kubectl top 查询pod连接数
在 Kubernetes 中,kubectl top 命令默认仅支持查看 Pod 或节点的 CPU/内存资源使用情况,并不直接提供 TCP 连接数的统计功能。若要获取 Pod 的 TCP 连接数,需结合其他工具和方法。以下是具体实现方案:
1. 直接进入容器查看 TCP 连接数
(1) 使用 kubectl exec 执行命令
 
若容器内已安装 netstat 或 ss 工具:
kubectl exec <pod-name> -n <namespace> -c <container-name> -- \netstat -ant | grep 'ESTABLISHED' | wc -l# 或使用更高效的 ss 命令
kubectl exec <pod-name> -n <namespace> -c <container-name> -- \ss -ant state established | wc -l 
(2) 示例输出
5  # 当前容器有 5 个已建立的 TCP 连接 
2. 从宿主机查看 Pod 的 TCP 连接数
每个 Pod 的容器共享宿主机的网络命名空间(默认情况下),或使用独立命名空间(如 CNI 插件配置)。可通过以下步骤操作:
(1) 找到 Pod 的容器 ID
kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d'/' -f3
# 输出示例:c0e54c1a1a1a 
(2) 进入宿主机的网络命名空间
# 找到容器的进程 PID
PID=$(docker inspect -f '{{.State.Pid}}' <container-id>)# 使用 nsenter 进入网络命名空间
nsenter -t $PID -n ss -ant state established | wc -l 
3. 使用 Sidecar 容器监控 TCP 连接
在 Pod 中添加一个 Sidecar 容器,定期采集 TCP 连接数并暴露指标:
(1) 示例 Sidecar 容器配置
apiVersion: v1
kind: Pod
metadata:name: app-with-tcp-monitor
spec:containers:- name: main-appimage: nginx:latest- name: tcp-monitorimage: alpine:latestcommand: ["sh", "-c"]args:- while true; donetstat -ant | grep ESTABLISHED | wc -l > /var/run/tcp_connections;sleep 10;donevolumeMounts:- name: tcp-statsmountPath: /var/runvolumes:- name: tcp-statsemptyDir: {} 
(2) 从 Sidecar 读取数据
kubectl exec app-with-tcp-monitor -c tcp-monitor -n <namespace> -- cat /var/run/tcp_connections 
4. 通过监控系统采集 TCP 连接数
集成 Prometheus + Grafana 实现自动化监控:
(1) 使用 kube-state-metrics 或自定义 Exporter
 
-  
部署 kube-ss 等工具,暴露 TCP 连接指标。
 -  
或编写自定义 Exporter,通过
ss/netstat采集数据。 
(2) 查询 Prometheus
sum by (pod) (node_netstat_Tcp_CurrEstab{pod="<pod-name>"}
) 
5. 快速脚本统计命名空间内所有 Pod 的 TCP 连接数
#!/bin/bash
NAMESPACE="default"# 遍历所有 Pod
kubectl get pods -n $NAMESPACE -o name | while read POD; doPOD_NAME=${POD#pod/}echo "Pod: $POD_NAME"# 遍历每个容器kubectl get pod $POD_NAME -n $NAMESPACE -o jsonpath='{.spec.containers[*].name}' | tr ' ' '\n' | while read CONTAINER; doCOUNT=$(kubectl exec $POD_NAME -n $NAMESPACE -c $CONTAINER -- \sh -c "ss -ant state established 2>/dev/null | wc -l" 2>/dev/null)echo "  Container $CONTAINER: $COUNT TCP 连接"done
done 
输出示例:
Pod: web-app-5dfd6f846d-xj7hwContainer main-app: 12 TCP 连接Container istio-proxy: 8 TCP 连接 
总结
| 方法 | 适用场景 | 优点 | 缺点 | 
|---|---|---|---|
kubectl exec | 快速临时检查 | 无需额外配置 | 需容器内有 netstat/ss 工具 | 
| 宿主机检查 | 深度排查网络问题 | 不依赖容器工具 | 需登录宿主机,操作复杂 | 
| Sidecar 监控 | 长期监控需求 | 数据持久化 | 增加资源开销 | 
| Prometheus | 生产环境自动化监控 | 集成告警和可视化 | 需部署和维护监控系统 | 
注意事项
1)容器工具缺失
 若容器内无 netstat/ss,可挂载宿主机二进制文件(需兼容容器架构):
volumeMounts:
- name: host-binmountPath: /usr/bin/netstatreadOnly: true
volumes:
- name: host-binhostPath:path: /usr/bin/netstat 
2)安全权限
 宿主机命令可能需要 root 权限,确保 ServiceAccount 有足够权限。
3)性能影响
 高频采集可能影响容器性能,建议间隔不低于 30 秒。
