如何在 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实现细粒度的控制。