原文作者:Venktesh Shivam Patel
原文链接:NGINX Ingress Controller 中的 Cache Policy:VirtualServer 实战指南
转载来源:NGINX 中文社区

缓存是 Kubernetes 中减少后端负载并改善响应延迟最快的方法之一。
通过 NGINX Ingress Controller (NIC),您可以将缓存行为定义为一级 Policy(策略)资源,并将其附加到 VirtualServer 或 VirtualServerRoute。这使得缓存配置保持清晰、可复用,并能与您的其他流量策略一起进行版本控制。
在本指南中,我们将重点关注:
- Cache Policy在 NGINX Ingress Controller 中的工作机制。
- 如何将其挂载到 VirtualServer 中。
- 为什么 StatefulSet 对持久化缓存用例至关重要。
为什么要使用 Cache Policy Resource?
将缓存设置放在 Policy 资源中为平台团队提供了更清晰的关注点分离:
- 应用路由保留在 VirtualServer 中。
- 缓存行为存在于专用的、可复用的策略中。
- 无需在每个路由中嵌入原始代码片段,即可滚动发布配置更新。
这种模型也使审计变得更容易,因为缓存行为可以在一处查看。
Cache Policy 在 NGINX Ingress Controller 中的工作机制
从高层来看:
-
创建一个带有 spec.cache 代码块的 Policy。
-
从 VirtualServer.spec.policies(服务器范围)或路由级策略中引用该Policy。
-
NGINX Ingress Controller 生成相应的 NGINX 缓存指令,并在配置重新加载时应用。
Cache Policy 示例:
apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
name: cache-policy
spec:
cache:
cacheZoneName: "testcache" # Required
cacheZoneSize: "15m" # Required
allowedCodes: ["any"] # Optional ["any"] or [200, 301, ...], "any" cannot be combined with specific codes
allowedMethods: ["GET", "HEAD", "POST"] # Optional
overrideUpstreamCache: true # Optional, default is false - whether to respect upstream cache-control headers (Cache-Control Expires Set-Cookie Vary X-Accel-Expires)
引用上述 Cache Policy 的 VirtualServer 示例:
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: cafe
spec:
policies:
- name: cache-policy
host: cafe.example.com
tls:
secret: tls-secret
upstreams:
- name: tea
service: tea-svc
port: 80
- name: coffee
service: coffee-svc
port: 80
routes:
- path: /tea
action:
pass: tea
- path: /coffee
action:
pass: coffee
需要记住的重要行为:
- Cache Policy 是为 VirtualServer 和 VirtualServerRoute 流程而设计的。
- 如果针对相同的有效位置引用了多个 Cache Policy,则仅应用其中一个(先到先得原则)。
- 路由级策略会覆盖在 VirtualServer.spec 中定义的相同类型策略。
首先值得调优的关键字段
当您定义 spec.cache 时,请优先考虑这些字段:
- cacheZoneName 和 cacheZoneSize:内存区域的标识和容量。
- allowedMethods:哪些方法是可缓存的。
- allowedCodes 加上 time:缓存哪些状态码及缓存时长。
- cacheKey:用于缓存查询的请求标识。
- overrideUpstreamCache:是否应遵守上游缓存头。
然后根据需要仅调优高级行为:
- cacheUseStale、cacheBackgroundUpdate 和 cacheRevalidate 用于容错能力。
- conditions.noCache 和 conditions.bypass 用于选择性缓存。
- cachePurgeAllow(NGINX Plus)用于可控的缓存清除。
大规模缓存:为持久化缓存工作负载使用 StatefulSet
NGINX Ingress Controller 支持将控制器作为 StatefulSet 运行,这更适合需要磁盘缓存的使用场景 。每个副本通过 PersistentVolume 获得稳定的存储,从而改进了重启后的缓存预热能力。
对于基于 Helm 的部署,NGINX Ingress Controller 通过以下方式明确支持此模型:
- controller.kind: statefulset
- 在 controller.statefulset 下的 StatefulSet 专用 nginxCachePVC 配置。
您可以在 GitHub 上找到完整的运行示例,并在我们的文档中查看更多说明:
• Cache Policy 示例 (VirtualServer)
https://github.com/nginx/kubernetes-ingress/tree/main/examples/custom-resources/cache-policy
• Cache Policy 文档
https://docs.nginx.com/nginx-ingress-controller/configuration/policy-resource/#cache