4. 控制面策略体系:Pod安全策略(PSP)、网络策略(NetworkPolicy)、资源配额(ResourceQuota)、LimitRange

Kubernetes 控制面的策略体系是保障集群安全、网络隔离与资源公平性的核心机制。在 Prometheus 监控视角下,策略的命中率与误报率直接反映了控制面的执行效率与合规水位。本章深入剖析四大策略组件:Pod 安全策略(PSP)、网络策略(NetworkPolicy)、资源配额(ResourceQuota)与 LimitRange,并给出对应的监控指标设计。

监控前置提示: 策略命中率 = 策略生效次数 / 总请求次数;误报率 = 策略拒绝但实际合规的请求数 / 总拒绝次数。这两个指标是控制面健康度的核心 SLO。

4.1 策略体系总览与职责矩阵

四种策略在控制面中承担不同维度的准入与运行时约束。下表从作用域、生效时机、监控切入点三个维度进行对比:

策略类型 作用域 生效时机 核心监控指标
PodSecurityPolicy (PSP) 集群级 / 命名空间级 Pod 创建准入阶段 psp_denied_total、psp_allowed_total
NetworkPolicy 命名空间级 网络流量运行时 network_policy_rule_hit_total、network_policy_drop_total
ResourceQuota 命名空间级 资源创建 / 更新准入 quota_usage_ratio、quota_denied_total
LimitRange 命名空间级 Pod / Container 创建准入 limitrange_default_applied_total、limitrange_min_max_violation_total
关键发现: PSP 与 ResourceQuota 在准入阶段即拒绝请求,误报会导致用户创建失败;NetworkPolicy 的误报则表现为合法流量被静默丢弃,排查难度更高。

4.2 PodSecurityPolicy (PSP) — 安全准入守门员

PSP 是集群级别的安全策略资源,控制 Pod 能否使用特权容器、主机网络、主机路径等敏感能力。在 Kubernetes 1.21+ 中 PSP 已被弃用,但大量存量集群仍在使用,且其监控方法论可迁移至 Pod Security Admission (PSA)。

4.2.1 PSP 命中率与误报模型

  • 命中率计算: rate(psp_allowed_total[5m]) / (rate(psp_allowed_total[5m]) + rate(psp_denied_total[5m]))
  • 误报场景: 策略规则过于严格,例如禁止所有 hostNetwork 但忽略了 DaemonSet 网络插件的合法需求。
  • 监控告警: 当命中率低于 0.95 且误报率高于 0.05 时,触发策略审计工单。
# Prometheus 告警规则示例:PSP 拒绝率突增
- alert: PSPRejectionRateBurst
  expr: |
    rate(psp_denied_total[5m]) / rate(psp_allowed_total[5m]) > 0.1
  for: 2m
  labels:
    severity: warning
  annotations:
    summary: "PSP 拒绝率超过 10%,可能存在策略误报或攻击行为"

4.3 NetworkPolicy — 微分段流量控制

NetworkPolicy 通过标签选择器定义 Pod 间、Pod 与外部服务的通信规则。其监控难点在于:策略命中是隐式的(流量通过即命中),而误报则表现为流量黑洞。

4.3.1 网络策略命中率与误报检测

  • 命中率指标: 通过 eBPF / CNI 插件暴露的 network_policy_rule_hit_total 与 network_policy_drop_total。
  • 误报排查: 对比 kube_networkpolicy_annotations 中的预期白名单与实际丢包源 IP。
  • 典型误报: 未放行 kube-dns 的 53 端口导致服务发现中断。
避坑指南: NetworkPolicy 默认拒绝所有入站流量。如果未显式放行 kube-system 命名空间的监控组件(如 Prometheus Operator),将导致指标采集失败,形成监控盲区。
NetworkPolicy 流量决策与误报检测流程 Pod 出站/入站流量 NetworkPolicy 规则匹配 命中规则 → 放行 未命中规则 → 丢弃 误报检测:对比预期白名单 命中率 +1 误报率 = 合法流量被丢弃数 / 总丢弃数;需结合 kube-dns、监控组件等基础服务白名单校准

4.4 ResourceQuota — 资源公平性保障

ResourceQuota 限制命名空间级别的 CPU、内存、存储及对象数量(如 Pod、Service 数量)。其命中率反映资源分配的饱和度,误报则通常由配额配置与业务实际需求不匹配导致。

4.4.1 配额命中率与误报场景

  • 命中率指标: kube_resourcequota{type="hard"} - kube_resourcequota{type="used"} 趋近于 0 时表示配额即将耗尽。
  • 误报案例: 同时设置 requests.cpu 与 limits.cpu 配额,但业务容器未设置 limits 导致被拒绝。
  • 监控策略: 使用 predict_linear 预测配额耗尽时间,提前扩容或调整。
# 预测配额耗尽时间(以 CPU 为例)
predict_linear(kube_resourcequota{resource="requests.cpu", type="used"}[7d], 86400 * 3)

4.5 LimitRange — 默认资源约束与边界控制

LimitRange 为命名空间内的 Pod 或 Container 设置默认资源请求/限制,以及最小/最大值边界。它不直接拒绝请求,而是通过修改(mutate)或验证(validate)来保证合规。

4.5.1 LimitRange 命中率与误报模型

  • 命中率: rate(limitrange_default_applied_total[5m]) 表示默认值注入次数。
  • 误报场景: 设置了 min: 512Mi 内存,但业务 sidecar 容器只需要 128Mi,导致创建失败。
  • 监控指标: limitrange_min_max_violation_total 记录超出边界的拒绝次数。
最佳实践: LimitRange 与 ResourceQuota 配合使用时,务必保证 min ≤ default ≤ max,且所有配额值在命名空间维度对齐,避免策略冲突导致的误报。
ResourceQuota 与 LimitRange 联合准入决策 Pod 创建请求 LimitRange 校验 注入默认值 / 通过 ResourceQuota 校验 超出配额 → 拒绝 Pod 创建成功 误报高发点:LimitRange min > ResourceQuota 剩余容量,或 default 未设置导致配额计算偏差

4.6 策略误报根因分析与监控看板设计

在 Prometheus 监控体系中,策略误报的根因分析需要多维数据关联。推荐使用以下 Grafana 看板面板组合:

面板名称 数据源 分析目标
策略拒绝率趋势 psp_denied_total、quota_denied_total 识别拒绝率突增的时间窗口
误报分布热力图 kube_event{reason="FailedCreate"} 按命名空间、策略类型聚合误报
配额饱和度预测 kube_resourcequota + predict_linear 提前发现配额瓶颈
网络策略丢包源 IP 分析 network_policy_drop_total + 标签 定位误丢弃的合法流量来源
重要提醒: 策略误报的修复不应仅依赖监控告警,必须建立策略变更的 CI/CD 流水线,每次变更后自动执行合规性回归测试,确保命中率不下降、误报率不上升。