NGINX 基于 Header 的入口路由

Joã*_*ira 4 nginx kubernetes nginx-ingress

auth-service我有一个 nginx-ingress在向后端服务发送请求之前调用自定义,使用这个简单的 ConfigMap 和 Ingress:

apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  global-auth-url: auth-service-url:8080/authenticate
  global-auth-method: GET
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  ...
spec:
  rules:
  - host: host1
    http:
      paths:
      - backend:
          serviceName: backend-service
          servicePort: 8080 
Run Code Online (Sandbox Code Playgroud)

现在我需要一些不同的东西。

如何通过不同的流发送所有具有相同“主机”标头的请求,一个具有 auth-service 并连接到,backend-service1另一个没有任何身份验证并连接到backend-service2

明确地说,并使用自定义标头“Example-header:test”

  1. 如果“Example-header”是“test”,请auth-service在发送到 之前通过 my 进行身份验证backend-service,就像现在所做的那样。
  2. 如果未定义“Example-header”,我想将请求发送到不同的后端服务,并且不在auth-service该过程中使用。

我尝试了几件事,即有 2 个 Ingress,一个 ,global-auth-url另一个 ,nginx.ingress.kubernetes.io/enable-global-auth: "false"但始终会调用 auth-service 。

我可以使用 NGINX 来完成此操作,还是必须使用 Istio 或大使?

小智 7

实现此行为的一种方法是滥用金丝雀功能

为您的backend-service,创建一个正常的 Ingress,例如

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-backend
spec:
  ingressClassName: nginx
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)

使用启用的金丝雀为您创建第二个 Ingressauth-service并设置标头名称和值,例如

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-auth
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: Example-header
    nginx.ingress.kubernetes.io/canary-by-header-value: test
spec:
  ingressClassName: nginx
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: auth-service
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)

现在,每个请求都Example-header: test路由到auth-service. 任何其他值,例如Example-header: some-value,都不会路由到auth-service而是转到您的backend-service.

  • 请注意,[文档](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary) 规定最多支持 1 个金丝雀,因此不能用于例如支持多个 API 版本。 (2认同)