主题
第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 选择
| 需求 | 推荐 |
|---|---|
| 需要真实客户端 IP | Local + Topology Spread Constraints + LB 健康检查 |
| 追求简单和高容错 | Cluster |
| 对延迟敏感,Pod 分布均匀 | Local |
| Pod 分布不均 | Cluster |
15.5 安全配置
- 限制 NodePort 暴露范围
通过 apiserver 参数控制 NodePort 范围:
bash
--service-node-port-range=30000-32767- 使用 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- TLS 终止
- Ingress 层做 TLS 终止。
- 内部 Service 之间可用 mTLS(如 Istio)。
15.6 监控与告警
| 指标 | 说明 |
|---|---|
| Service Endpoints 数量 | 是否为 0,是否 healthy |
| Pod readiness 状态 | 未就绪 Pod 是否被加入 Service |
| NodePort 连接数 | 各节点是否均衡 |
| 跨节点流量比例 | internalTrafficPolicy 是否生效 |
| 真实源 IP 丢失 | externalTrafficPolicy 配置是否正确 |
| DNS 解析延迟 | CoreDNS 是否健康 |
15.7 高可用设计
- 多副本 Deployment:保证后端有多个 Pod。
- Pod 拓扑分布约束:避免所有 Pod 都在同一节点或可用区。
- LB 健康检查:配合 Local 模式使用。
- Ingress Controller 多副本:避免单点故障。
15.8 本章小结
- 微服务间用 ClusterIP,外部访问用 Ingress 或 LoadBalancer。
- Local 模式保留源 IP,但需要保证 Pod 均匀分布。
- 安全配置包括 NodePort 范围、NetworkPolicy、TLS。
- 监控 Endpoints、Pod 就绪、流量分布等关键指标。
本章练习
- 为你的一个真实业务设计完整的 Service 方案(类型、端口、流量策略、监控)。
- 列出你当前集群中所有 NodePort Service,评估是否有不必要的暴露。
- 检查是否有应用写死 Pod IP,制定改造计划。