Ingress-nginx配置下server-snippet 和 backend 的优先级

1,085 阅读2分钟

使用 Ingress Nginx 的 server-snippetbackend 配置,解决优先级冲突,从而优化请求处理流程。

Ingress Nginx 的 server-snippet

nginx.ingress.kubernetes.io/server-snippet 是一个强大的选项,允许在 Ingress 资源中直接插入 Nginx 配置片段,对请求的处理流程进行高度的定制化。然而,在使用 server-snippet 时需要考虑以下几点:

性能考虑:过多的 server-snippet 可能会对性能产生影响。每个请求都需要在这些配置片段中进行计算和判断,因此在编写 server-snippet 时应当谨慎,以避免性能问题。

指令顺序server-snippet 中的配置按照声明的顺序执行,后面的指令可能会覆盖前面的指令。在编写 server-snippet 时要确保配置的顺序是合理的,以免出现意料之外的结果。

Ingress Nginx 的 backend

backend 部分定义了请求被转发到后端服务的方式。与 server-snippet 不同,它通常更关注请求的路由和代理,而不涉及复杂的配置。

优先级问题backend 的配置将在 server-snippet 之后执行,因此其优先级较低。这意味着,backend 中的配置可能会覆盖 server-snippet 中的某些设置。因此,在编写 backend 配置时,要特别注意不要意外地覆盖了 server-snippet 中的自定义操作。

避免冲突server-snippet 中的配置可能影响请求的处理流程,包括重写、跳转等操作。确保server-snippet 配置与 backend 配置不会相互干扰,导致重复的重定向或者不符合预期的行为。

路径匹配:如果在 server-snippet 中使用了重定向操作,需要确保不会与 backend 的路径匹配造成冲突。可以使用正则表达式或其他条件来限制 server-snippet 的执行范围。

利用优先级对路径的不同处理

使用 server-snippetbackend 配置来解决路径有包含关系的不同路由处理

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      if ($request_uri ~ ^/home/chatgpt) {
         break;
      }

      if ($request_uri ~ ^/home) {
        rewrite ^ https://app.example.io$request_uri permanent;
      }
      
  name: ingress-example
spec:
  ingressClassName: nginx
  rules:
  - host: example.io
    http:
      paths:
      - backend:
          service:
            name: example-home
            port:
              number: 80
        path: /home/chatgpt
        pathType: Prefix

server-snippet 中使用条件语句来处理 /home/chatgpt 路径的请求。对于 /home/chatgpt的请求,则直接 break,终止 server-snippet 的执行,从而可以匹配后面的 backend 配置,并将请求直接转发到指定的服务。对于 /home 路径的请求,我们使用 rewrite 将请求重定向到 https://app.example.io 域名,实现路径的定向。