Как добавить X-Original-Forwarded-For в качестве заголовка запроса в входном контроллере NGINX?

Я использую входной контроллер F5 NGINX.

Примечание. Я не использую редакцию сообщества Kubernetes (Ingress-nginx).

Я добился разделения трафика с помощью виртуального сервера для входного контроллера NGINX. Однако в производстве некоторые клиенты используют белый список IP-адресов, и для передачи запроса мы используем заголовок X-Original-Forwarded-For

Я хочу установить заголовок запроса X-Original-Forwarded-For в контроллере входа NGINX.

https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource/#configmap-and-virtualservervirtualserverroute-resources

Согласно приведенной выше настройке ссылки на входном уровне, это также влияет на виртуальный сервер.

Я использую helm и env.yaml для устранения входного контроллера istallnginx, нам до сих пор не повезло

env.yaml

# Traffic split Nginx Ingress 
controller:
  replicaCount: 2
  config:
    log-format-upstream: '$http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id'
  service:
    loadBalancerIP: "xxx.xxxx.xxxx"
    externalTrafficPolicy: "Local"
    annotations:
      service.beta.kubernetes.io/azure-load-balancer-resource-group: "xxxxxxx"
      nginx.org/location-snippets: |
         more_set_input_headers "X-Original-Forwarded-For: jatin";

команда управления для установки

helm upgrade --install nginx-ingress nginx-stable/nginx-ingress \
  --version 1.0.2 -n nginx-ingress --create-namespace \
  --set controller.ingressClass.create=true \
  --set controller.ingressClass.name=nginx-ingress \
  --set controller.ingressClass.setAsDefaultIngress=false \
  -f ./nginx-ingress/env/env.yaml

Даже попробовал добавить ресурс виртуального сервера, как показано здесь

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  namespace: xxxxxx
  name: nginx-vs-traffic-split
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: nginx-ingress

spec:
  host: xxxxx.com
  upstreams:
  - name: xxxxx-a
    service: xxxx-a
    port: 80
  - name: xxxx-b
    service: xxxx-b
    port: 80
  - name: xxxx-c
    service: xxxx-c
    port: 80
  routes:
  - path: /
    location-snippets: |
      add_header my-test-header test-value;   
    splits:
    # The sum of the weights of all splits must be equal to 100
    - weight: 33
      action:
        pass: xxxxx-a
    - weight: 33
      action:
        pass: xxxx-b
    - weight: 34
      action:
        pass: xxxxx-c 

Обновлять:

https://docs.nginx.com/nginx-ingress-controller/installation/ingress-nginx/#migration-with-kubernetes-ingress-resources

Я видел эту ссылку, где фрагмент конфигурации используется внутри nginx.

Я пробовал даже с этим все равно безуспешно


58
2

Ответы:

log-format-upstream — это ключ карты конфигурации Ingress Controller. Поскольку вы используете NGINX Ingress Controller, вам нужен ключ log-format. Эти ключи карты конфигурации, относящиеся к ведению журнала, перечислены здесь.

Обязательно добавьте заголовок, содержащий исходный IP-адрес, также в формат журнала.

config:
    log-format: '$http_x_original_forwarded_for ...'

Решено

Прочитав https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header я понял какие заголовки нужно добавлять в заголовки запроса.

Я решил это с помощью enabling snippets на nginx-ingress (поскольку фрагменты отключены по умолчанию) на диаграмме управления и добавил location-snippets на ресурс виртуального сервера.

Команда включения сниппетов

helm upgrade --install nginx-ingress nginx-stable/nginx-ingress \
  --set controller.enableSnippets=true \
  --version 1.0.2 -n nginx-ingress --create-namespace \
  --set controller.ingressClass.create=true \
  --set controller.ingressClass.name=nginx-ingress \
  --set controller.ingressClass.setAsDefaultIngress=false \
  -f ./nginx-ingress/env/env.yaml

Ресурс виртуального сервера

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: nginx-vs-traffic-split
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: nginx-ingress
spec:
  host: {{.Values.domain.my-domain}}
  upstreams:
  - name: web-nginx 
    service: web-nginx 
    port: 80
  - name: web-octane 
    service: web-octane 
    port: 80
  - name: web 
    service: web 
    port: 80
  routes:
  - path: /
    splits:    
    # Header configuration is required for customers who use IP whitelist feature.
    # If this configuration is not present then all the requests will be blocked.
    location-snippets: |
      proxy_set_header 'X-Original-Forwarded-For' '$http_x_azure_clientip';
    splits: 
    # The sum of the weights of all splits must be equal to 100   
    - weight: {{.Values.trafficSplitWeight.nginx}}
      action:
        pass: web-nginx