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 团队面临以下四重相互制约的挑战:
- 一致性 vs. 缓存:Secrets 更新后,kubelet 依赖 watch 事件刷新缓存。若缓存 TTL 过长,更新延迟不可接受;若 TTL 过短,命中率骤降。
- 内存配额 vs. 缓存容量:节点内存配额严格限制下,无法为所有 Namespace 的 Secrets 保留完整缓存副本,必须做优先级淘汰。
- QPS 配额 vs. 回源频率:API Server 的 ResourceQuota 限制了每秒请求数,缓存未命中导致的回源请求可能触发限流,进而影响正常业务。
- 大规模集群的 watch 风暴:数千个 Pod 同时 watch 同一 Secret 时,API Server 的 watch 连接数可能超过 etcd 的承载上限。
常见误区:简单增大 kubelet 的
--secrets-cache-ttl 参数(默认 1m)虽然能提升命中率,但会显著增加 Secrets 更新延迟,在证书轮换场景中可能导致 Pod 使用过期凭证。
1.4 系统架构:Secrets 访问路径与缓存位置
下图展示了 Kubernetes 集群中 Secrets 从创建到 Pod 挂载的完整访问路径,以及缓存可能介入的三个关键位置:
1.5 调优全景:从指标到策略的闭环
本课程将围绕以下闭环流程组织知识体系:
- 指标采集:通过 kubelet metrics、API Server 审计日志、Prometheus 监控获取缓存命中率、回源延迟、内存占用等基线数据。
- 瓶颈分析:区分“缓存容量不足”、“watch 连接泄漏”、“TTL 配置不当”三类典型问题。
- 策略设计:基于资源配额约束,选择 LRU 淘汰、TTL 动态调整、Namespace 优先级缓存等组合策略。
- 验证与回滚:通过混沌工程注入缓存失效场景,验证调优效果并保留回滚能力。
课程前置知识:建议读者熟悉 Kubernetes 核心资源(Pod、Secret、ResourceQuota)、kubelet 配置参数以及 Prometheus 基础查询语法。每章末尾提供可复用的 Grafana 看板 JSON 片段。