如何使用Nginx Ingress-controller进行标头路由逻辑?

问题描述 投票:-1回答:1

我正在尝试使用nginx实现标头路由入口规则。为什么呢因为相同的路径应该基于headers转到不同的后端。这是我尝试过的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-mutli-back
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      set $dataflag 0;

      if ( $http_content_type ~ "multipart\/form-data.*" ){
      set $dataflag 1;
      }

      if ( $dataflag = 1 ){
      set $service_name "backend-data";
      }

spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: backend-default
          servicePort: 80
        path: /api

但是nginx的日志输出此错误:

unknown directive "set $service_name backend-data" in /tmp/nginx-cfg864446123:1237

对我来说似乎不合逻辑...如果我检查nginx生成的配置,则每条规则都会在开头处生成一个类似以下内容的位置:

[...]
       location ~* "^/api" {

            set $namespace      "my-namespace";
            set $ingress_name   "api-multi-back";
            set $service_name   "backend-default";
[...]

我在做什么错?不能用注释configuration-snippet重新定义service_name变量吗?还有其他方法吗?

编辑:我在Nginx上的错误是由于set $ service_namebackend-data之间缺少确切的空格。然后,nginx正确生成了配置,但仍未路由到另一个kubernetes服务。

nginx kubernetes routing http-headers nginx-ingress
1个回答
0
投票

您被YAML主义所咬伤:

[您的第二个if块的缩进与其他字符的缩进不同,因此YAML认为您正在annotations:下开始一个新的键

您有

metadata:
  name: api-mutli-back
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      set $dataflag 0;

      if ( $http_content_type ~ "multipart\/form-data.*" ){
      set $dataflag 1;
      }

     if ( $dataflag = 1 ){
     set $service_name "backend-data"
     }

但是您应该拥有:

metadata:
  name: api-mutli-back
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      set $dataflag 0;

      if ( $http_content_type ~ "multipart\/form-data.*" ){
      set $dataflag 1;
      }

      if ( $dataflag = 1 ){
      set $service_name "backend-data"
      }
© www.soinside.com 2019 - 2024. All rights reserved.