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 秒。