Docker KubernetesNotes

第 14 章:Service

zjc 于 2026-01-14 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Pod IP 是易变的,Service 提供稳定虚拟 IP、名称和负载均衡能力,是 Kubernetes 内部服务发现的核心。

14.1 Service 类型

类型 说明
ClusterIP 集群内虚拟 IP
NodePort 每节点开放端口
LoadBalancer 云负载均衡器
ExternalName DNS CNAME
Headless 不分配 ClusterIP

14.2 ClusterIP

apiVersion: v1
kind: Service
metadata:
  name: order-service
spec:
  type: ClusterIP
  selector:
    app: order
  ports:
    - name: http
      port: 80
      targetPort: 8080

集群内访问:

http://order-service.default.svc.cluster.local

14.3 Headless

spec:
  clusterIP: None

DNS 会返回后端 Pod IP 列表,常用于 StatefulSet、数据库主从和客户端负载均衡。

14.4 NodePort 与 LoadBalancer

NodePort:

spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30080

LoadBalancer 适合直接暴露 TCP/UDP 服务,云厂商负责创建外部负载均衡器。

14.5 Endpoints

kubectl get endpoints order-service

Service 通过 selector 找到 Pod,并把符合 readiness 的 Pod 加入 Endpoints。

常见问题:

现象 原因
Endpoints 为空 selector 错、readiness 失败
访问不通 网络策略、kube-proxy
流量不均 长连接、客户端缓存
502 应用未监听 targetPort

14.6 服务发现

CoreDNS 提供:

service-name.namespace.svc.cluster.local

跨命名空间必须使用完整域名。同命名空间可简化为服务名。

本章小结

Service 屏蔽 Pod IP 变化,实现稳定服务发现和四层负载均衡。ClusterIP 服务内部通信,Headless 服务有状态发现,LoadBalancer 暴露外部流量。

思考题

  1. Service 如何选择后端 Pod?
  2. Endpoints 为空如何排查?
  3. Headless Service 适合什么场景?
  4. targetPort 和 port 有什么区别?
  5. 跨命名空间如何访问服务?