Как я могу правильно настроить пользовательские заголовки с помощью nginx ingress?

У меня такая конфигурация:

демонсет:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
spec:
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:1.4.2-alpine
        imagePullPolicy: Always
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: https
          containerPort: 443
          hostPort: 443
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret 

основной конфиг:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx-ingress
data:
  proxy-set-headers: "nginx-ingress/custom-headers"
  proxy-connect-timeout: "11s"
  proxy-read-timeout: "12s"
  client-max-body-size: "5m"
  gzip-level: "7"
  use-gzip: "true"
  use-geoip2: "true"

настраиваемые заголовки:

apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-headers
  namespace: nginx-ingress
data:
  X-Forwarded-Host-Test: "US"
  X-Using-Nginx-Controller: "true"
  X-Country-Name: "UK" 

Я сталкиваюсь со следующими ситуациями:

  • Если я изменю один из «proxy-connect-timeout», «proxy-read-timeout» или «client-max-body-size», я увижу изменения, появляющиеся в сгенерированных конфигурациях в модулях контроллера.
  • Если я изменю один из «gzip-level» (даже попробовал «use-gzip») или «use-geoip2», я не увижу никаких изменений в сгенерированных конфигах (например: «gzip on;» всегда закомментирован и нет другого упоминание zip, уровень gzip нигде не фигурирует)
  • Пользовательские заголовки из "ingress-nginx / custom-headers" вообще не добавляются (планировалось использовать их для передачи значений из geoip2)

В противном случае все в порядке, журналы контроллера показывают, что мой единственный бэкэнд (приложение expressJs, которое сбрасывает заголовки) правильно является сервером, я получаю ожидаемые ответы и так далее.

Я скопировал все, что мог, из примеров на github, внеся минимум изменений, но без результатов (в том числе при просмотре примеров для пользовательских заголовков).

Будем очень признательны за любые идеи или указатели.

Спасибо!


person Andrei Dascalu    schedule 07.01.2019    source источник


Ответы (4)


Похоже, вы используете kubernetes-ingress из самого NGINX вместо ingress-nginx, который является контроллером входа nginx сообщества.

Если вы видите поддерживаемые ключи ConfigMap для kubernetes-ingress, ни один из вариантов gzip не поддерживается. Если вы видите Параметры ConfigMap для ingress-nginx вы увидите все ключи gzip, которые можно настроить.

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

Обновлять:

Вы также можете сделать это с помощью configuration- фрагмент аннотации:

nginx.ingress.kubernetes.io/configuration-snippet: |
   more_set_headers "X-Forwarded-Host-Test: US";
   more_set_headers "X-Using-Nginx-Controller: true";
   more_set_headers "X-Country-Name: UK";
   more_set_headers "Header: Value";
   ...
person Rico    schedule 08.01.2019
comment
Благодарность! Пришлось много копаться в документации, но это решило мою проблему! - person Andrei Dascalu; 08.01.2019
comment
Здравствуйте, есть ли способ прочитать значение для настраиваемого заголовка через секрет. У меня есть вариант использования, когда мне нужно проверить статический токен api с помощью настраиваемого заголовка. Спасибо - person Tanul; 08.10.2020
comment
Привет, обновление: kubernetes nginx принимает заголовки gzip, как в kubernetes.github.io/ingress-nginx/user-guide/ - person Fernanda Martins; 09.03.2021

Используйте аннотации правил входа.

Example:
 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "server: hide";
      more_set_headers "X-Content-Type-Options: nosniff";
      more_set_headers "X-Frame-Options: DENY";
      more_set_headers "X-Xss-Protection: 1";
  name: myingress
  namespace: default
spec:
  tls:
  - hosts:

Я использовал сервер nginx 1.15.9

person Petr Šejn    schedule 08.04.2019
comment
ваш пример предназначен для заголовков ответов, мой вопрос касался заголовков запросов для бэкэндов. - person Andrei Dascalu; 08.04.2019
comment
Мы потратили на это четыре дня. Спасибо! - person ScottSummers; 26.07.2019
comment
@AndreiDascalu, как вам удалось поместить эти заголовки в запросы, а не в ответы? - person Łukasz; 20.01.2020
comment
@ Łukasz основная конфигурация входа имеет свойство: заголовки-прокси. Значением для него является пространство имен / configmap-name. где целевая конфигурационная карта - это карта заголовков, которые будут устанавливаться при запросах, идущих от входа к серверной службе. - person Andrei Dascalu; 22.01.2020
comment
@AndreiDascalu Вы можете использовать это для заголовка запроса, изменив его на more_set_input_headers, см. Здесь github. ru / openresty / - person Jonas Kello; 03.01.2021

Для потомков: nginx community controller => quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0

nginx kubernetes controller => nginx / nginx-ingress: edge (как показано в документации)

настраиваемые заголовки configmap для сообщества => набор-прокси-заголовков: "nginx-ingress / custom-headers"

карта конфигурации настраиваемых заголовков для kubernetes => add-headers: "nginx-ingress / custom-headers"

person Andrei Dascalu    schedule 08.01.2019

При использовании Helm для установки kubernetes / ingress-nginx. Настройте свой собственный заголовок, например. My-Custom-Header как

controller:
  addHeaders:
    X-My-Custom-Header: Allow

Это добавит настраиваемые заголовки перед отправкой трафика ответа клиенту в соответствии с: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers Вы можете получить к нему доступ в журналах:

controller:
   log-format-upstream: '{"x-my-custom-header" : "$http_x-my-custom-header"}'
person Ondřej Trojan    schedule 21.12.2020