Сохранение исходного IP-адреса клиента
Трафик, поступающий в кластер Managed Kubernetes через сервис типа LoadBalancer, может быть направлен на узел, на котором нет подов целевого приложения. В этом случае трафик пересылается между узлами, и исходный IP-адрес клиента заменяется на IP-адрес промежуточного узла. Такое преобразование IP-адресов (SNAT) затрудняет контроль доступа по IP-адресам, использование геолокации и логирование.
Сохранить исходный IP-адрес клиента позволяет параметр externalTrafficPolicy: Local в описании сервиса типа LoadBalancer. Благодаря этому параметру трафик сразу направляется на тот узел, на котором есть поды приложения, и не пересылается между узлами. Под, который получает трафик, видит исходный IP-адрес клиента.
Чтобы настроить и проверить сохранение исходного IP-адреса клиента:
Перед началом работы
Заголовок раздела «Перед началом работы»Создайте кластер Managed Kubernetes с публичным эндпоинтом и группу узлов для него.
Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.
1. Подготовьте окружение
Заголовок раздела «1. Подготовьте окружение»Подключитесь к терминалу на вашем компьютере или к промежуточной ВМ.
Установите и настройте утилиту MWS CLI:
Установите утилиту командной строки
kubectl.
2. Разверните тестовое приложение с балансировщиком нагрузки
Заголовок раздела «2. Разверните тестовое приложение с балансировщиком нагрузки»Создайте файл
test-app.yamlс манифестом для развертывания тестового приложения и внешнего балансировщика нагрузки:yaml apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:selector:matchLabels:app: nginx-serverreplicas: 3template:metadata:labels:app: nginx-serverspec:containers:- name: nginx-demoimage: nginx:stableimagePullPolicy: Alwaysports:- containerPort: 80name: http-web-svcvolumeMounts:- name: config-volumemountPath: /etc/nginx/conf.dvolumes:- name: config-volumeconfigMap:name: nginx-conf---apiVersion: v1kind: ConfigMapmetadata:name: nginx-confdata:default.conf: |server {listen 80;server_name _;location / {return 200 "Your IP Address is: $remote_addr\n";add_header Content-Type text/plain;}}---apiVersion: v1kind: Servicemetadata:name: localspec:externalTrafficPolicy: LocalloadBalancerSourceRanges:- 0.0.0.0/0selector:app: nginx-serverports:- name: tcpprotocol: TCPport: 80targetPort: 80type: LoadBalancerПримените манифест:
bash kubectl apply -f test-app.yamlОжидаемый результат:
bash deployment.apps/nginx-deployment createdconfigmap/nginx-conf createdservice/lb createdУбедитесь, что поды тестового приложения запущены (
Running):bash kubectl get pods -l app=nginx-serverОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEnginx-deployment-679cf8c9d7-42wq2 1/1 Running 0 109snginx-deployment-679cf8c9d7-lkfsc 1/1 Running 0 109snginx-deployment-679cf8c9d7-qhmbw 1/1 Running 0 109s
3. Узнайте исходный IP-адрес клиента
Заголовок раздела «3. Узнайте исходный IP-адрес клиента»Запросите информацию о созданном балансировщике нагрузки:
bash kubectl get svc lbОжидаемый результат:
bash NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGElb LoadBalancer 10.222.89.80 171.22.74.117 80:31290/TCP 13mСделайте запрос к балансировщику по внешнему IP-адресу (
EXTERNAL-IP):bash curl 171.22.74.117Ожидаемый результат:
bash Your IP Address is: <IP-адрес клиента>
Удалите платные ресурсы
Заголовок раздела «Удалите платные ресурсы»Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:
- Если вы создавали виртуальную машину, удалите ее.