Как иметь заголовок маршрутизации c с nginx ингресс-контроллером? - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь получить правило входа для маршрутизации заголовка с помощью nginx. Почему ? Потому что тот же путь должен go до другой бэкэнд на основе заголовков . Вот что я пробовал:

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

, что мне кажется нелогичным c ... Если я проверю конфигурация, сгенерированная nginx, каждое правило генерирует местоположение с чем-то вроде этого в начале:

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

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

Что я делаю не так? Разве нельзя переопределить переменную имя_службы с аннотацией фрагмент конфигурации ? Есть ли другой способ?

Редактировать: Моя ошибка на стороне nginx была вызвана отсутствием точных пробелов между set $ service_name и backend-data . Затем nginx правильно сгенерировал конфигурацию, но все равно не перенаправил ее в другую службу kubernetes.

1 Ответ

1 голос
/ 19 января 2020

Вы укушены из-за YAML:

Отступ вашего 2-го 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"
      }
...