Skip to content

第15章 生产环境最佳实践

本章把前面所有知识整合起来,给出生产环境中使用 Kubernetes Service 的选型建议、监控方案和常见注意事项。


15.1 Service 类型选型决策树

text
是否需要外部访问?

   ├── 否 ──► ClusterIP

   └── 是

        ├── HTTP/HTTPS,多个服务共享入口?───► Ingress + ClusterIP

        ├── 非 HTTP 协议或需要独立四层入口?
        │      │
        │      ├── 云厂商集群 ──► LoadBalancer
        │      │
        │      └── 裸金属/自建 ──► MetalLB / Keepalived

        └── 临时测试 ──► NodePort(不推荐生产)

15.2 微服务间通信

  • 统一使用 ClusterIP。
  • 统一端口(如 8080),通过服务名区分。
  • 所有调用通过 Service DNS,不要写死 Pod IP。
  • 配置 readinessProbe,避免未就绪 Pod 接收流量。

15.3 外部入口

场景推荐方案
Web/API 服务Ingress + ClusterIP
TCP/UDP 服务LoadBalancer
裸金属集群MetalLB + Ingress
临时测试NodePort

15.4 externalTrafficPolicy 选择

需求推荐
需要真实客户端 IPLocal + Topology Spread Constraints + LB 健康检查
追求简单和高容错Cluster
对延迟敏感,Pod 分布均匀Local
Pod 分布不均Cluster

15.5 安全配置

  1. 限制 NodePort 暴露范围

通过 apiserver 参数控制 NodePort 范围:

bash
--service-node-port-range=30000-32767
  1. 使用 NetworkPolicy

限制哪些 Pod 可以访问 Service:

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-only-frontend
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
  1. TLS 终止
  • Ingress 层做 TLS 终止。
  • 内部 Service 之间可用 mTLS(如 Istio)。

15.6 监控与告警

指标说明
Service Endpoints 数量是否为 0,是否 healthy
Pod readiness 状态未就绪 Pod 是否被加入 Service
NodePort 连接数各节点是否均衡
跨节点流量比例internalTrafficPolicy 是否生效
真实源 IP 丢失externalTrafficPolicy 配置是否正确
DNS 解析延迟CoreDNS 是否健康

15.7 高可用设计

  1. 多副本 Deployment:保证后端有多个 Pod。
  2. Pod 拓扑分布约束:避免所有 Pod 都在同一节点或可用区。
  3. LB 健康检查:配合 Local 模式使用。
  4. Ingress Controller 多副本:避免单点故障。

15.8 本章小结

  • 微服务间用 ClusterIP,外部访问用 Ingress 或 LoadBalancer。
  • Local 模式保留源 IP,但需要保证 Pod 均匀分布。
  • 安全配置包括 NodePort 范围、NetworkPolicy、TLS。
  • 监控 Endpoints、Pod 就绪、流量分布等关键指标。

本章练习

  1. 为你的一个真实业务设计完整的 Service 方案(类型、端口、流量策略、监控)。
  2. 列出你当前集群中所有 NodePort Service,评估是否有不必要的暴露。
  3. 检查是否有应用写死 Pod IP,制定改造计划。