如何在 Kubernetes 中实现 HTTP 响应的缓存?

如何在 Kubernetes 中实现 HTTP 响应的缓存?

如何在 Kubernetes 中缓存来自我的服务的 HTTP 响应?

我的集群中有一个简单的 Web 服务,我想知道除了依赖客户端缓存之外,我还如何在不依赖客户端缓存的情况下缓存静态资产(静态 html、图像、字体等)。

我的设置非常简单:

 ┌─────────────────┐    ┌─────────────┐   ┌─────────────────┐
 │                 │    │             │   │                 │
 │  ingress-nginx  ├────►     svc     ├───►   deployment    │
 │                 │    │             │   │                 │
 └─────────────────┘    └─────────────┘   └─────────────────┘

我考虑过的选项:

  • 外部 CDN(例如 Cloudflare)
    • => 因数据保护合规规则而被排除
  • 云提供商的 CDN(例如 Cloudfront)
    • => 我们的云提供商没有这样的服务
  • ingress-nginx-controller 和 ingress 中的 proxy_cache
    • => 看起来...很乱?
  • ingress-nginx 和我的服务之间的专用缓存服务(例如 Varnish)
    • => 这是个好主意吗?
    • => 除了配置我自己的 Varnish 部署之外,还有更多的“云原生”选择吗?
  • Sidecar 中的缓存代理(例如 Varnish 或 nginx)
    • => 并不理想,因为缓存 pod 必须根据应用程序 pod 进行扩展
  • 应用程序中的缓存
    • => 我希望避免在申请中出现此问题

我很好奇:人们在他们的集群中是如何解决这个问题的?

答案1

如何在 Kubernetes 中缓存来自我的服务的 HTTP 响应?

您始终可以通过以下方式设置自定义 nginx 配置nginx.ingress.kubernetes.io/server-snippet注释。您可能希望添加多个proxy_cache相关配置来完成此操作。

如何才能缓存静态资产(静态 html、图像、字体等),而不依赖于客户端缓存。

分离您的应用程序和静态资产。

在 Kubernetes 中存储和运行您的应用程序,并将您的静态资产存储在支持公共文件访问的其他地方。

然后,您可以使用任何 CDN 将静态资产传递给客户端,而不会增加 Kubernetes 应用程序的负担。

答案2

我们有k8s-ingress 又名 Viking作为基于 Varnish 的入口控制器,它将入口控制器功能与任何Varnish缓存所提供的,其中缓存是其中一个功能。

维京人使用内置 VCL默认情况下,如果您的服务生成了正确的 Cache-Control 标头,缓存应该可以立即使用。如果没有,您可以使用自定义VCL实现细粒度的控制。

相关内容