这是 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 的问题:

  1. 看 Pod 状态:

    kubectl get pods -n default
    # 确认 nacos-xxx 和 mysql-xxx 都是 Running 状态
    
  2. 看 Service 信息:

    kubectl get svc mysql-service -n default
    # 确认 ClusterIP 和 Port (比如 3306:3306)
    kubectl describe svc mysql-service -n default
    # 确认 Endpoints 有 IP,不为 <none>
    
  3. 进入 Nacos Pod 测试:

    kubectl exec -it nacos-0 -n default -- /bin/bash
    
  4. 在 Pod 内部测试连通性:

    # 测 DNS
    getent hosts mysql-service.default.svc.cluster.local
    
    # 测 TCP 端口
    echo > /dev/tcp/mysql-service.default.svc.cluster.local/3306 && echo "OK"
    
  5. 如果不通,看网络策略或日志:

    # 退出 Pod
    exit
    
    # 看 Nacos 日志报错详情
    kubectl logs -f nacos-0 -n default
    

掌握这套组合拳,90% 的 K8s 内部网络和连接问题都能快速定位!

更多推荐