1. 课程导论:资源配额约束下 Secrets 缓存调优的背景、目标与挑战

1.1 背景:从“无状态”到“有状态”的认知转变

在云原生架构演进中,Kubernetes Secrets 的管理长期被视为“静态配置挂载”的简单问题。然而,随着微服务规模增长、Pod 密度提升以及资源配额(ResourceQuota / LimitRange)的严格落地,Secrets 的访问模式发生了根本性变化:

  • Pod 启动风暴:HPA 或 CronJob 批量创建 Pod 时,kubelet 并发请求 Secrets,导致 API Server 瞬时负载飙升。
  • 缓存竞争加剧:kubelet 内置的 Secrets 缓存(基于 TTL 和 watch)在内存配额受限时频繁失效,引发重复回源。
  • 资源配额硬约束:节点内存、API Server 请求速率(QPS)和 etcd 存储成为瓶颈,传统“全量缓存”策略不再可行。
核心矛盾:Secrets 的强一致性需求(更新后 Pod 需尽快感知)与资源配额下的缓存容量/命中率之间存在固有冲突。

1.2 目标:在配额红线内最大化缓存命中率

本课程围绕以下三个可量化目标展开:

维度 目标指标 说明
缓存命中率 ≥ 92% kubelet 侧 Secrets 本地缓存命中率,减少 API Server 回源
API Server 负载 ≤ 基线 1.3x Secrets 相关请求 QPS 控制在正常业务波动的 1.3 倍以内
内存配额占用 ≤ 节点内存 5% kubelet 缓存及 watch 连接占用的内存不超过节点总内存的 5%

1.3 挑战:四重约束下的调优困境

实际调优过程中,SRE 团队面临以下四重相互制约的挑战:

  1. 一致性 vs. 缓存:Secrets 更新后,kubelet 依赖 watch 事件刷新缓存。若缓存 TTL 过长,更新延迟不可接受;若 TTL 过短,命中率骤降。
  2. 内存配额 vs. 缓存容量:节点内存配额严格限制下,无法为所有 Namespace 的 Secrets 保留完整缓存副本,必须做优先级淘汰。
  3. QPS 配额 vs. 回源频率:API Server 的 ResourceQuota 限制了每秒请求数,缓存未命中导致的回源请求可能触发限流,进而影响正常业务。
  4. 大规模集群的 watch 风暴:数千个 Pod 同时 watch 同一 Secret 时,API Server 的 watch 连接数可能超过 etcd 的承载上限。
常见误区:简单增大 kubelet 的 --secrets-cache-ttl 参数(默认 1m)虽然能提升命中率,但会显著增加 Secrets 更新延迟,在证书轮换场景中可能导致 Pod 使用过期凭证。

1.4 系统架构:Secrets 访问路径与缓存位置

下图展示了 Kubernetes 集群中 Secrets 从创建到 Pod 挂载的完整访问路径,以及缓存可能介入的三个关键位置:

Secrets 访问路径与缓存位置 Secrets 访问路径与缓存位置 API Server etcd kubelet 本地缓存 (LRU) Pod (Volume Mount) Watch 连接池 读/写 watch / list 缓存命中 挂载 Secret 缓存未命中 回源请求 说明: 缓存位置①:kubelet 本地 LRU 缓存(内存受限);缓存位置②:Watch 连接池(连接数受限);缓存位置③:API Server 内置缓存(受 ResourceQuota 影响)。

1.5 调优全景:从指标到策略的闭环

本课程将围绕以下闭环流程组织知识体系:

  1. 指标采集:通过 kubelet metrics、API Server 审计日志、Prometheus 监控获取缓存命中率、回源延迟、内存占用等基线数据。
  2. 瓶颈分析:区分“缓存容量不足”、“watch 连接泄漏”、“TTL 配置不当”三类典型问题。
  3. 策略设计:基于资源配额约束,选择 LRU 淘汰、TTL 动态调整、Namespace 优先级缓存等组合策略。
  4. 验证与回滚:通过混沌工程注入缓存失效场景,验证调优效果并保留回滚能力。
课程前置知识:建议读者熟悉 Kubernetes 核心资源(Pod、Secret、ResourceQuota)、kubelet 配置参数以及 Prometheus 基础查询语法。每章末尾提供可复用的 Grafana 看板 JSON 片段。