NGINX Ingress Controller 中的 Cache Policy:VirtualServer 实战指南

原文作者: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 中的工作机制

从高层来看:

  1. 创建一个带有 spec.cache 代码块的 Policy。

  2. 从 VirtualServer.spec.policies(服务器范围)或路由级策略中引用该Policy。

  3. 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

相关推荐
Csvn14 小时前
WASM
前端
天河归来15 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL15 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
修己xj15 小时前
我用 AI 给自己写了一个 Markdown 编辑器,然后把它开源了
前端
FRing0316 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
幸运小猿16 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
砚底藏山河16 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊17 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子18 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
moshuying18 小时前
网购能买Token了!
前端