Я использую входной контроллер F5 NGINX.
Примечание. Я не использую редакцию сообщества Kubernetes (Ingress-nginx).
Я добился разделения трафика с помощью виртуального сервера для входного контроллера NGINX. Однако в производстве некоторые клиенты используют белый список IP-адресов, и для передачи запроса мы используем заголовок X-Original-Forwarded-For
Я хочу установить заголовок запроса X-Original-Forwarded-For
в контроллере входа NGINX.
Согласно приведенной выше настройке ссылки на входном уровне, это также влияет на виртуальный сервер.
Я использую 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
Обновлять:
Я видел эту ссылку, где фрагмент конфигурации используется внутри nginx.
Я пробовал даже с этим все равно безуспешно
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