4. 网关资源模型设计:CPU/内存请求与限制、HPA配置、PodDisruptionBudget
云原生网关作为集群流量的入口,其资源模型的合理性直接决定网关的稳定性与弹性伸缩能力。本章围绕三个核心维度展开:静态资源配额(Requests & Limits)、动态弹性策略(HPA)以及可用性保障(PodDisruptionBudget)。三者共同构成网关资源模型的完整闭环。
4.1 资源请求与限制:静态配额设计原则
Kubernetes 中每个容器都可以声明 requests(调度保证)和 limits(资源上限)。对于网关这类延迟敏感型组件,推荐采用 Guaranteed QoS 模式,即 requests == limits,避免因 CPU 压缩或内存回收导致请求抖动。
| 资源类型 | 推荐配置(单副本) | 说明 |
|---|---|---|
| CPU requests | 500m – 1000m | 根据 TLS 卸载、路由规则复杂度调整 |
| CPU limits | 与 requests 一致 | 避免 CPU 节流导致延迟毛刺 |
| Memory requests | 512Mi – 1Gi | 包含连接池、缓存、TLS 会话 |
| Memory limits | 与 requests 一致 | 防止 OOM 时被 Kill,但需预留 headroom |
实践建议:生产环境至少预留 20% 的节点资源余量,用于应对突发流量和 DaemonSet 等系统组件开销。网关副本数建议从 2 起步,避免单点故障。
4.2 HPA 配置:基于自定义指标的弹性伸缩
水平 Pod 自动伸缩(HPA)是网关应对流量波动的核心手段。除了基础的 CPU/内存指标,网关场景更推荐使用 每秒请求数(RPS) 或 连接数 作为伸缩依据,这需要配合 Prometheus Adapter 或 KEDA 实现。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: gateway-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: cloud-gateway
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: gateway_requests_per_second
target:
type: AverageValue
averageValue: 5000
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
关键参数解读:
•
•
• 建议同时配置 CPU 和 RPS 双指标,CPU 作为兜底,RPS 作为业务驱动。
•
stabilizationWindowSeconds: 300:缩容冷却窗口,防止流量抖动导致频繁伸缩。•
scaleDown 策略限制每次最多缩容 10%,避免批量驱逐造成容量不足。• 建议同时配置 CPU 和 RPS 双指标,CPU 作为兜底,RPS 作为业务驱动。
4.3 PodDisruptionBudget:优雅中断与可用性保障
PodDisruptionBudget(PDB)用于约束自愿中断(如节点维护、集群升级)期间可同时不可用的 Pod 数量。对于网关,PDB 应设置为 至少保留 50% 的副本 或 最小可用数 = 1,确保集群升级时流量不中断。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: gateway-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: cloud-gateway
注意:PDB 仅保护自愿中断,不应对非自愿中断(如节点宕机、OOM)。当副本数小于等于
minAvailable 时,PDB 会阻止所有自愿驱逐操作,可能导致集群升级卡住。建议结合 maxUnavailable 使用,例如 maxUnavailable: 25%。
4.4 资源模型关系图
下图展示了网关资源模型中静态配额、HPA 与 PDB 之间的协作关系:
4.5 常见故障模式与排查思路
| 故障现象 | 可能原因 | 排查方向 |
|---|---|---|
| 网关频繁 OOMKill | Memory limits 设置过低,或存在内存泄漏 | 检查 container_memory_working_set_bytes 指标,对比 limits |
| HPA 无法扩容 | 指标未上报、metrics-server 未部署、自定义指标适配器异常 | kubectl describe hpa 查看事件,检查 kubectl get --raw /apis/custom.metrics.k8s.io/ |
| 节点维护时网关 Pod 被驱逐导致服务中断 | PDB 未配置或配置过松 | 检查 PDB 状态:kubectl get pdb gateway-pdb -o yaml |
| CPU 节流导致延迟升高 | CPU limits 小于 requests,或 limits 过低 | 查看 container_cpu_cfs_throttled_seconds_total 指标 |
故障排查黄金命令:
kubectl describe pod <gateway-pod> — 查看资源状态与事件kubectl top pod -l app=cloud-gateway — 实时资源使用kubectl describe hpa gateway-hpa — 伸缩事件与指标状态kubectl get pdb gateway-pdb -o wide — PDB 允许/禁止驱逐数
4.6 资源模型设计检查清单
- QoS 等级:网关容器是否设置为 Guaranteed(requests == limits)?
- CPU 预留:requests 是否覆盖了 TLS 握手、路由匹配等计算开销?
- 内存边界:limits 是否留有 20-30% 的 headroom 应对突发连接?
- HPA 双指标:是否同时配置了 CPU 和业务指标(RPS/连接数)?
- 缩容冷却:是否设置了 stabilizationWindowSeconds ≥ 300 秒?
- PDB 策略:minAvailable 是否 ≥ 1 或 maxUnavailable ≤ 25%?
- 副本下限:HPA minReplicas 是否 ≥ 2?