k8s集群网络排查测试方案
·
这是 Kubernetes 日常运维和调试中最基础也最重要的操作。以下是查看资源信息和进入容器内部的常用命令速查表。
1️⃣ 如何查看 Service (svc) 信息?
Service 是 K8s 中服务发现和负载均衡的核心,查看它主要是为了确认 ClusterIP、端口映射 和 关联的 Endpoints。
A. 列出所有 Service
# 查看当前命名空间下的所有 svc
kubectl get svc
# 查看所有命名空间下的 svc
kubectl get svc -A
# 查看指定命名空间 (如 default)
kubectl get svc -n default
B. 查看 Service 的详细信息 (关键!)
# 查看某个 svc 的详情,包括 IP、端口、选择器(Selector)
kubectl describe svc <service-name> -n <namespace>
重点关注输出中的:
Endpoints: 如果这里是<none>,说明没有后端 Pod 匹配 Selector,服务不可用。Port: 确认TargetPort是否指向了容器内正确的端口。Selector: 确认它标签是否匹配你的 Pod。
C. 查看 Service 背后的真实 Pod IP (Endpoints)
# 查看 svc 关联的具体 Pod IP 列表
kubectl get endpoints <service-name> -n <namespace>
如果这里为空,说明 Service 找不到任何健康的 Pod。
D. 以 YAML/JSON格式查看 (用于排查配置错误)
kubectl get svc <service-name> -n <namespace> -o yaml
2️⃣ 如何进入 Pod 内部?
使用 kubectl exec 命令。这相当于 Docker 的 docker exec -it。
A. 标准进入命令
# 语法: kubectl exec -it <pod-name> -n <namespace> -- <shell命令>
# 大多数 Linux 镜像 (CentOS, Ubuntu, Java应用) 使用 bash
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# 极简镜像 (Alpine, Nginx, Redis) 通常只有 sh
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh
B. 如果不知道用 bash 还是 sh?
先试 bash,如果报错 executable file not found,再试 sh。
或者直接使用以下通用写法(自动尝试):
kubectl exec -it <pod-name> -n <namespace> -- sh
注:大部分现代镜像都兼容 sh,它是 POSIX 标准 shell。
C. 进入多容器 Pod (Sidecar 场景)
如果一个 Pod 里有多个容器(例如 Istio Sidecar 或 Init Container),必须指定容器名:
kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/bash
-c: 指定容器名称。- 可以通过
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].name}'查看容器名。
D. 不进入交互模式,直接执行单条命令
# 在远程 Pod 里执行 ls 命令并返回结果
kubectl exec <pod-name> -n <namespace> -- ls /app
# 在远程 Pod 里执行我们之前说的网络测试
kubectl exec <pod-name> -n <namespace> -- bash -c 'echo > /dev/tcp/mysql-service/3306 && echo OK'
3️⃣ 其他高频查看命令 (配套使用)
在调试网络时,你通常还需要看 Pod 的状态和日志。
A. 查看 Pod 状态
# 查看 Pod 是否 Running,重启次数 (RESTARTS) 很重要
kubectl get pods -n <namespace>
# 查看 Pod 的详细信息 (事件、状态、IP)
kubectl describe pod <pod-name> -n <namespace>
重点关注 describe 输出底部的 Events:
Scheduled: 调度成功。Pulled/Created/Started: 启动成功。Unhealthy: 健康检查失败。Back-off restarting failed container: 容器崩溃重启。
B. 查看 Pod 日志 (排查应用层错误)
# 查看实时日志 (类似 tail -f)
kubectl logs -f <pod-name> -n <namespace>
# 查看上一个崩溃容器的日志 (如果容器重启了)
kubectl logs <pod-name> -n <namespace> --previous
# 如果有多容器,指定容器
kubectl logs <pod-name> -c <container-name> -n <namespace>
C. 查看 Pod 的 IP 和节点信息
# 快速获取 Pod 的 IP 和所在节点
kubectl get pods -o wide -n <namespace>
IP: Pod 的内部 IP。NODE: Pod 运行在哪台物理/虚拟机上。
🚀 综合调试工作流示例
假设你要调试 Nacos 连不上 MySQL 的问题:
-
看 Pod 状态:
kubectl get pods -n default # 确认 nacos-xxx 和 mysql-xxx 都是 Running 状态 -
看 Service 信息:
kubectl get svc mysql-service -n default # 确认 ClusterIP 和 Port (比如 3306:3306) kubectl describe svc mysql-service -n default # 确认 Endpoints 有 IP,不为 <none> -
进入 Nacos Pod 测试:
kubectl exec -it nacos-0 -n default -- /bin/bash -
在 Pod 内部测试连通性:
# 测 DNS getent hosts mysql-service.default.svc.cluster.local # 测 TCP 端口 echo > /dev/tcp/mysql-service.default.svc.cluster.local/3306 && echo "OK" -
如果不通,看网络策略或日志:
# 退出 Pod exit # 看 Nacos 日志报错详情 kubectl logs -f nacos-0 -n default
掌握这套组合拳,90% 的 K8s 内部网络和连接问题都能快速定位!
更多推荐

所有评论(0)