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

相关推荐
lld9510271 小时前
(三)本地策略框架
java·服务器·数据库
SoftLipaRZC1 小时前
C语言文件:文件操作完全指南
android·java·c语言
零陵上将军_xdr1 小时前
API 签名防重放机制:基于 HMAC-SHA256 的设计与实现
java·学习·安全架构
办公自动化软件定制化开发python1 小时前
开源!Edge TTS 音频转换工具 v2.1:批量文本转语音,支持段落拆分与多发音人
前端·edge·音视频
ch.ju1 小时前
Java程序设计(第3版)第四章——set-get方法
java·开发语言
johnny2331 小时前
Nginx可视化管理工具:NPM、nginx config、Nginx UI、NginxWebUI、Nginx Pulse
nginx
lpd_lt1 小时前
如何让AI生成项目的单元测试,propmt技巧详解
java·人工智能·单元测试·ai编程
27669582921 小时前
jd 变速滑块逆向角度分析
前端·python·京东滑块·京东逆向·京东变速滑块·cfe滑块·wasm逆向
ct9781 小时前
Vue 项目性能优化
前端·vue.js·性能优化