首页 > 解决方案 > 本地 Kuber 集群上的 Ingress 与直接 Nginx 部署

问题描述

我正在本地服务器中设置一个 kubernetes 集群。现在为了设置外部流量,我可以在 Nodeport 后面运行 Nginx Ingress,或者我可以在暴露 NodePort 服务的情况下运行 Nginx Deployment(Pods)。

我知道的唯一区别是 Ingress,我会得到我无论如何都不需要的粘性会话。那么我应该更喜欢哪一个,为什么?

除此之外,我对 htmls 的 Nginx 缓存也有一个要求(带有清除逻辑)。所以我有 Nginx Deplpyment,然后我可以使用 PVC 和 PV。但是如果我使用 Nginx Ingress 会怎样。那将如何运作。

标签: kuberneteskubernetes-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

最终,设计决定权在你手中,老实说,使用入口控制器更好,因为它提供了更大的灵活性。我希望这可以为你解决这个问题。


推荐阅读