Настройте контроллер Ingress для пересылки пользовательских заголовков http

Мы настраиваем кластер AKS в Azure, следуя этому руководству: https://docs.microsoft.com/en-us/azure/aks/ingress-own-tls

Мы работаем с 5 .Net Core API за входным контроллером, все работает нормально, запросы перенаправляются хорошо. Однако в нашем интерфейсе SPA мы отправляем настраиваемый заголовок http в наши API, и этот заголовок, кажется, никогда не попадает в API, когда мы проверяем вход в AKS и видим, что нужный заголовок http пуст. В разработке все работает нормально, мы также видим, что заголовок http заполнен в нашей тестовой среде в AKS, поэтому я предполагаю, что вход блокирует эти пользовательские заголовки.

Есть ли какая-либо конфигурация, необходимая для прохождения входа через пользовательские заголовки http?

РЕДАКТИРОВАТЬ:

{
  "kind": "Ingress",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "myappp-ingress",
    "namespace": "myapp",
    "selfLink": "/apis/extensions/v1beta1/namespaces/myapp/ingresses/myapp-ingress",
    "uid": "...",
    "resourceVersion": "6395683",
    "generation": 4,
    "creationTimestamp": "2018-11-23T13:07:47Z",
    "annotations": {
      "kubernetes.io/ingress.class": "nginx",
      "nginx.ingress.kubernetes.io/allow-headers": "My_Custom_Header", //this doesn't work
      "nginx.ingress.kubernetes.io/proxy-body-size": "8m",
      "nginx.ingress.kubernetes.io/rewrite-target": "/"
    }
  },
  "spec": {
    "tls": [
      {
        "hosts": [
          "myapp.com"
        ],
        "secretName": "..."
      }
    ],
    "rules": [
      {
        "host": "myapp.com",
        "http": {
          "paths": [
            {
              "path": "/api/tenantconfig",
              "backend": {
                "serviceName": "tenantconfig-api",
                "servicePort": 80
              }
            },
            {
              "path": "/api/identity",
              "backend": {
                "serviceName": "identity-api",
                "servicePort": 80
              }
            },
            {
              "path": "/api/media",
              "backend": {
                "serviceName": "media-api",
                "servicePort": 80
              }
            },
            {
              "path": "/api/myapp",
              "backend": {
                "serviceName": "myapp-api",
                "servicePort": 80
              }
            },
            {
              "path": "/app",
              "backend": {
                "serviceName": "client",
                "servicePort": 80
              }
            }
          ]
        }
      }
    ]
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {}
      ]
    }
  }
}

3 ответа

Решение

В итоге я использовал следующий фрагмент конфигурации:

nginx.ingress.kubernetes.io/configuration-snippet: |
  proxy_set_header My-Custom-Header $http_my_custom_header;

nginx делает все пользовательские заголовки http доступными как встроенную переменную через $http_ префикс см. http://nginx.org/en/docs/http/ngx_http_core_module.html

Если я хочу, чтобы мой входной контроллер передавал пользовательский заголовок в бэкэнд-сервис, я могу использовать эту аннотацию в своем входном правиле

nginx.ingress.kubernetes.io/configuration-snippet: |
  more_set_headers "Request-Id: $req_id";

По умолчанию входящий трафик не проходит через заголовки с подчеркиванием . Вы могли бы установить

      enable-underscores-in-headers: true

См. Https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#enable-underscores-in-headers.

Другие вопросы по тегам