3. 策略命中率概念详解

策略命中率是衡量 RBAC 规则有效性的核心指标。它反映了在容器运行时控制面中,实际被策略匹配并生效的请求占比。理解命中率的计算公式、分子与分母的确定方法,是后续进行误报分析与策略优化的基础。

3.1 命中率的标准计算公式

在 Kubernetes RBAC 审计与策略治理场景中,策略命中率通常定义为:

策略命中率 = (匹配请求数 / 总请求数) × 100%

其中:

  • 匹配请求数(分子):被至少一条 RBAC 策略规则显式匹配(Allow 或 Deny)的 API 请求数量。
  • 总请求数(分母):在观测时间窗口内,Kubernetes API Server 接收到的所有可审计请求总数。
关键区分: 部分团队误将分母理解为“总策略数”,这是错误的。分母必须是“总请求数”,因为命中率衡量的是策略对实际流量的覆盖程度,而非策略本身的冗余度。

3.2 分母的确定方法:总请求数

分母的采集来源是 Kubernetes API Server 的审计日志(Audit Log)。每个请求在审计日志中对应一条记录,包含请求的 user、verb、resource、responseStatus 等字段。

请求来源 是否计入分母 说明
用户通过 kubectl 发起的请求 是 标准用户操作,必须计入
ServiceAccount 发起的请求 是 Pod 内部组件调用,核心流量
kube-controller-manager 内部请求 是 控制面自循环请求,影响策略覆盖
kube-scheduler 调度请求 是 调度器对 Node/Pod 的读写
kubelet 对 API Server 的请求 是 节点状态上报、Pod 同步
匿名请求(未经认证) 可选 根据治理策略决定是否纳入
健康检查 / 探针请求 建议排除 高频低价值流量,会稀释命中率
实践建议: 在计算命中率时,建议排除 /healthz、/livez、/readyz 等健康检查端点,以及 Webhook 的 admission 阶段内部请求,避免分母被无效流量膨胀。

3.3 分子的确定方法:匹配请求数

分子需要从审计日志中筛选出“被策略规则显式匹配”的请求。匹配判定逻辑如下:

  1. 提取策略规则集:从集群中获取所有 ClusterRole、Role、ClusterRoleBinding、RoleBinding 对象,解析出每条规则的 apiGroups、resources、verbs、resourceNames。
  2. 逐条审计日志匹配:对每条审计日志中的 user、verb、resource、namespace 字段,与策略规则进行比对。
  3. 判定条件:如果请求的 user 在某个 RoleBinding/ClusterRoleBinding 中,且请求的 verb + resource 组合被该绑定引用的 Role/ClusterRole 中的某条规则覆盖,则计为一次匹配。
# 伪代码:匹配判定逻辑
for each audit_log in audit_logs:
    matched = False
    for each binding in all_bindings:
        if audit_log.user in binding.subjects:
            role = get_role(binding.roleRef)
            for each rule in role.rules:
                if match_rule(rule, audit_log):
                    matched = True
                    break
    if matched:
        matched_count += 1
注意: 如果一条请求同时匹配多条策略规则(例如同时匹配 Allow 和 Deny 规则),在分子中只计为 1 次匹配。分子统计的是“请求是否被策略覆盖”,而非“匹配了多少条规则”。

3.4 命中率计算流程总览

下图展示了从原始审计日志到命中率输出的完整计算链路:

策略命中率计算流程 审计日志采集 请求过滤 策略规则加载 逐条匹配判定 统计分母(总请求数) 统计分子(匹配请求数) 计算命中率 = 分子 / 分母 输出命中率报表 说明:健康检查请求应在“请求过滤”阶段排除;分子统计的是“被策略覆盖的请求数”,而非“匹配的策略规则数”。

3.5 常见误区与校正

误区 错误理解 正确理解
分母理解错误 分母 = 集群中 RBAC 策略总数 分母 = 观测窗口内的 API 请求总数
分子重复计数 一条请求匹配 N 条规则,分子计 N 次 一条请求无论匹配多少规则,分子只计 1 次
忽略匿名请求 匿名请求全部不计入分母 根据治理策略决定,通常建议计入以反映真实流量
未排除探针流量 所有审计日志全量计入分母 排除 /healthz 等探针请求,避免分母虚高
忽略隐式 Deny 只有显式 Allow/Deny 规则才算匹配 Kubernetes 默认隐式 Deny 不计入匹配,仅显式规则算匹配

3.6 命中率的分层统计

在实际治理中,单一全局命中率往往掩盖细节问题。建议按以下维度进行分层统计:

  • 按命名空间分层:计算每个 Namespace 内的策略命中率,识别低覆盖率的 Namespace。
  • 按资源类型分层:分别计算 Pod、Service、ConfigMap、Secret 等资源的命中率。
  • 按操作类型分层:区分 get、list、create、update、delete 的命中率差异。
  • 按用户身份分层:对比 human user 与 ServiceAccount 的命中率,发现 ServiceAccount 策略覆盖不足的问题。
治理目标: 在容器运行时控制面蓝图中,建议将核心资源(Pod、Deployment、Secret)的命中率目标设定为 ≥ 95%,非核心资源(Event、Lease)可放宽至 ≥ 80%。低于此阈值的策略组应触发误报复核流程。