在Kubernetes集群的日常运维与故障排查中,K8s kubectl get services查看服务是工程师洞察集群网络拓扑、验证服务暴露状态以及诊断连通性问题的第一道也是最重要的指令。Service作为K8s中定义Pod逻辑集合和访问策略的抽象,是微服务间通信和外部请求流入的枢纽。仅仅知道执行这条命令是远远不够的,深刻理解其输出每一列背后的含义、掌握过滤与格式化技巧、并能将简单的列表信息与复杂的网络故障关联分析,才是从K8s使用者迈向精通者的关键。作为鳄鱼Java的资深内容编辑,我将结合多年集群管理经验,为你深度剖析这条基础命令所蕴含的运维智慧。
一、为什么说“get services”是集群健康的门户?

在Kubernetes的体系中,Pod是 ephemeral( ephemeral)的——它们可能被重建、调度或销毁。直接通过Pod IP进行通信是不可靠的。Service 正是为此而生:它为一系列功能相同的Pod提供一个稳定的虚拟IP(ClusterIP)和DNS名称,并负责将请求负载均衡到后端的健康Pod。
因此,执行 K8s kubectl get services查看服务,你实际上是在检查集群内外部所有**网络访问入口和内部通信端点**的状态。这回答了几个核心运维问题:我部署的应用服务是否正常暴露?它们被分配了什么IP和端口?哪些服务允许从集群外部访问?在鳄鱼Java的线上故障处理流程中,任何与“服务不可达”相关的告警,第一步永远是登录相应集群,执行 kubectl get svc,以快速获得服务层面的全局视图。这是定位问题属于应用层(Pod自身)、服务层(Service配置)还是入口层(Ingress)的首要判断依据。
二、输出列深度解析:从NAME到EXTERNAL-IP的奥秘
默认执行 kubectl get services 会返回包含以下几列的关键表格,每一列都是一个信息金矿:
| 列名 | 含义与深度解读 | 常见问题线索 |
|---|---|---|
| NAME | Service资源的名称,也是其在命名空间内的DNS记录主体(如 my-svc.my-namespace.svc.cluster.local)。 | 命名不规范可能导致混淆。 |
| TYPE | 这是理解服务访问方式的关键。 分为:ClusterIP(默认,仅集群内访问)、NodePort(通过节点IP和静态端口暴露)、LoadBalancer(通过云供应商的负载均衡器暴露)、ExternalName(返回CNAME记录)。 | 若期望公网访问但TYPE为ClusterIP,则配置有误。 |
| CLUSTER-IP | Service在集群内部的虚拟IP,在Service生命周期内保持稳定(除非删除重建)。集群内Pod通过此IP或Service名访问。 | 如果为 <none>,可能是Headless Service(无头服务,用于StatefulSet)。 |
| EXTERNAL-IP | 当TYPE为LoadBalancer时,云提供商分配的公共IP或主机名。对于NodePort,此列通常为 <none>。 | 若长时间处于 <pending> 状态,可能是云负载均衡器配额不足或配置错误。 |
| PORT(S) | 格式为 80:31724/TCP。冒号前是Service端口(集群内访问端口),冒号后是NodePort(当TYPE为NodePort/LoadBalancer时)。协议可以是TCP、UDP或SCTP。 | 端口映射关系错误是常见配置故障点。 |
| AGE | Service自创建后运行的时间。快速变化的AGE可能意味着服务在被频繁重建,提示上游部署或配置可能有问题。 | - |
一次成功的 K8s kubectl get services查看服务 操作,要求你的眼睛能迅速从这六列中捕捉到异常信号。
三、超越默认视图:强大的输出格式化与过滤技巧
面对生产环境中数十上百个Service,默认输出可能信息过载。kubectl 提供了强大的输出控制能力。
1. 宽模式显示(-o wide)
kubectl get svc -o wide 会增加两列:SELECTOR(标签选择器)和 TARGET PORT(Pod内容器端口)。SELECTOR是连接Service与Pod的桥梁,它指明了Service将流量路由到哪些Pod(匹配这些标签的Pod)。如果SELECTOR为空,则说明该Service可能是手动通过Endpoints或EndpointSlice关联后端,或者尚未正确配置。
2. 自定义列输出(-o custom-columns)
这是进阶排查的利器。例如,只想查看服务名、集群IP和端口:
kubectl get svc -o custom-columns=NAME:.metadata.name,CLUSTER-IP:.spec.clusterIP,PORT:.spec.ports[0].port
3. 按标签过滤(-l)
微服务架构中,服务常被打上如 app=order-service, tier=backend 等标签。可以精准查询:
kubectl get svc -l app=gateway
这在鳄鱼Java的微服务集群中,用于快速查看某一业务线或某一层级的所有服务状态。
4. 跨命名空间查询(-A 或 --all-namespaces)
kubectl get svc -A 会列出集群所有命名空间的服务,输出会增加一列 NAMESPACE。这对于管理员进行全局巡检不可或缺。
四、结合场景的故障排查实战
让我们模拟一个鳄鱼Java社区用户遇到的典型问题:“从外部无法访问部署的Spring Boot应用。”
排查步骤:
1. 第一步:执行基础查看
kubectl get svc
假设发现目标服务 myapp-svc 的 TYPE 是 ClusterIP。那么问题立刻明朗:ClusterIP服务默认只能在集群内访问。解决方案是修改为NodePort或LoadBalancer,或为其创建Ingress资源。
2. 第二步:如果是NodePort/LoadBalancer但仍不可访问
检查 EXTERNAL-IP 列。如果为 <pending>,需检查云服务商负载均衡器状态或节点网络配置。
检查 PORT(S) 列,确认NodePort(如 31724)是否在节点安全组/防火墙中允许访问。
3. 第三步:深入检查Selector与Pod关联
kubectl get svc myapp-svc -o wide
记录下 SELECTOR(如 app=myapp)。接着检查是否有Pod匹配此标签:
kubectl get pods -l app=myapp
如果Pod列表为空或Pod状态非Running,那么Service没有健康的后端,流量自然无法到达。此时问题重心就从Service转移到了Pod的部署和健康上。
通过这个流程,我们可以看到,K8s kubectl get services查看服务 不仅是查看,更是**启动系统性排查的导航仪**。
五、理解Service类型:何时选用哪一种?
在查看服务列表时,不同的TYPE代表了不同的架构决策。
- ClusterIP: **微服务间内部通信的标准选择。** 这是最常见类型,确保服务只在集群内部网络可见,安全且高效。鳄鱼Java的微服务间API调用全部基于ClusterIP Service进行。
- NodePort: 用于裸金属或虚拟机环境,当没有云负载均衡器时,提供从集群外访问的简单方式。缺点是需手动管理端口冲突和外部负载均衡(如使用外部HAProxy)。
- LoadBalancer: **云环境暴露服务的标准方式。** 与云厂商集成,自动创建外部负载均衡器并将流量导向Service。成本较高,但管理简便。
- ExternalName: 用于将Service映射到集群外部的服务(如一个老旧的数据库RDS端点),本质上是提供一个DNS别名,无代理或流量转发。
一个成熟的K8s集群,其Service列表应是这几种类型的合理组合,反映了清晰的内外访问边界。
六、进阶:与Endpoints、Ingress关联分析与监控集成
真正的高手,会将 get services 的信息与其他资源关联分析。
1. 查看Endpoints
Service的流量实际转发目标由Endpoints资源定义。命令 kubectl get endpoints <service-name> 可以列出该Service当前关联的所有Pod IP和端口。这是一个非常直接的验证Service是否真的有后端Pod可用的方法。如果Endpoints列表为空,即使Service配置正确,流量也无处可去。
2. 关联Ingress
对于通过HTTP/HTTPS暴露的服务,通常会使用Ingress。你可以通过查看Ingress资源来理解外部流量如何路由到具体的Service:
kubectl get ingress
其输出会显示规则(HOSTS)和后端(BACKENDS),BACKENDS通常指向一个ClusterIP Service。
3. 集成到监控仪表板
在生产环境中,我们不应依赖于手动执行命令。应将服务发现与状态监控集成到如Prometheus+Grafana的监控栈中。通过Prometheus的Kubernetes服务发现,可以自动采集所有Service作为监控目标,并在Grafana面板上可视化展示服务的健康状态、网络延迟等指标。在鳄鱼Java的生产监控大屏上,就有一个专门展示所有Service及其端点健康状态的视图。
总结与思考
精通 K8s kubectl get services查看服务,远不止于记住一条命令。它意味着你建立了以“服务”为中心来观测和推理Kubernetes集群网络行为的能力。从解读输出表格的每一个字段,到运用格式化工具高效过滤,再到将服务状态与Pods、Endpoints、Ingress联动分析,这条基础命令串联起了K8s网络模型的核心知识点。
现在,请审视你的日常运维:你是否还只满足于看到服务列表“都在运行”?当下一次出现网络连通性问题时,你是否能像条件反射一样,通过kubectl get svc -o wide并结合Selector去检查后端Pod,进而形成一条清晰的排查路径?服务的稳定是微服务架构的基石,而清晰的服务视图是守护这块基石的灯塔。从今天起,尝试为你管理的服务建立更细致的标签体系,并练习使用自定义列输出你最关心的信息。如果你在复杂的服务网格(如Istio)环境下的服务观测中遇到挑战,欢迎来到鳄鱼Java社区,我们一起探讨在云原生深水区中的运维之道。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





