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

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商