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

相关推荐
Initialize-le3 小时前
Nginx 504 超时、499 一堆?网关排查法
运维·nginx
Jmyd01234 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
哦虎!4 小时前
【JavaEE】网络初识
java
砚凝霜5 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
for_ever_love__5 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓6 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡6 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室6 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项6 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友