kubernetes - 本地 Kuber 集群上的 Ingress 与直接 Nginx 部署
问题描述
我正在本地服务器中设置一个 kubernetes 集群。现在为了设置外部流量,我可以在 Nodeport 后面运行 Nginx Ingress,或者我可以在暴露 NodePort 服务的情况下运行 Nginx Deployment(Pods)。
我知道的唯一区别是 Ingress,我会得到我无论如何都不需要的粘性会话。那么我应该更喜欢哪一个,为什么?
除此之外,我对 htmls 的 Nginx 缓存也有一个要求(带有清除逻辑)。所以我有 Nginx Deplpyment,然后我可以使用 PVC 和 PV。但是如果我使用 Nginx Ingress 会怎样。那将如何运作。
解决方案
当您公开Nginx 部署时,您实际上是使用Ingress创建了一个L4 负载均衡器,您正在创建一个L7 负载均衡器。
如果您想托管多个域,例如 example1.com、example2.com 等,那么拥有 L7 负载均衡器也很有意义,如果您希望请求最终到达某个特殊的地方,例如某些特殊服务或端点,您可以定义默认后端。
进入启用缓存的第二部分,您可以在入口控制器中执行以下操作:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mywebsite
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-buffering: "on" # Important!
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_cache static-cache;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503 http_504;
proxy_cache_bypass $http_x_purge;
add_header X-Cache-Status $upstream_cache_status;
假设您想为 1 条路径启用它而不是为其他路径启用它,就像您想为 /static/ 路径而不是 / 路径启用它,那么您可以拥有:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mysite
annotations:
ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 10m
spec:
tls:
- secretName: mysite-ssl
hosts:
- mysite.example.com
rules:
- host: mysite.example.com
http:
paths:
- path: /
backend:
serviceName: mysite
servicePort: http
---
# Leverage nginx-ingress cache for /static/
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mysite-static
annotations:
nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_cache static-cache;
proxy_cache_valid 404 10m;
proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503 http_504;
proxy_cache_bypass $http_x_purge;
add_header X-Cache-Status $upstream_cache_status;
spec:
rules:
- host: mysite.example.com
http:
paths:
- path: /static/
backend:
serviceName: mysite
servicePort: http
最终,设计决定权在你手中,老实说,使用入口控制器更好,因为它提供了更大的灵活性。我希望这可以为你解决这个问题。
推荐阅读
- php - 将 PDF 文件的内容发送到外部 API?
- mysql - Laravel 5.8:通过数据透视表连接 3 个表
- office-js - 如何以编程方式添加和获取 customXMLPart
- javascript - 在这种特殊情况下,$and 和 $all 有什么区别?
- swift - 在 Swift 中使用 WkWebView 获取 HTML
- python - 将json文件拆分成句子
- swift - 无法将 swift 泛型子类转换为泛型超类
- android - 以编程方式将自定义布局添加到 ConstraintLayout
- reactjs - TypeScript 错误:JSX 元素类型“树”没有任何构造或调用签名。我无法导入自己的组件
- swift - 在单元测试中运行异步代码的问题