Перейти к содержимому

Сохранение исходного IP-адреса клиента

Трафик, поступающий в кластер Managed Kubernetes через сервис типа LoadBalancer, может быть направлен на узел, на котором нет подов целевого приложения. В этом случае трафик пересылается между узлами, и исходный IP-адрес клиента заменяется на IP-адрес промежуточного узла. Такое преобразование IP-адресов (SNAT) затрудняет контроль доступа по IP-адресам, использование геолокации и логирование.

Сохранить исходный IP-адрес клиента позволяет параметр externalTrafficPolicy: Local в описании сервиса типа LoadBalancer. Благодаря этому параметру трафик сразу направляется на тот узел, на котором есть поды приложения, и не пересылается между узлами. Под, который получает трафик, видит исходный IP-адрес клиента.

Чтобы настроить и проверить сохранение исходного IP-адреса клиента:

  1. Создайте кластер Managed Kubernetes с публичным эндпоинтом и группу узлов для него.

  2. Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.

  1. Подключитесь к терминалу на вашем компьютере или к промежуточной ВМ.

  2. Установите и настройте утилиту MWS CLI:

  3. Установите утилиту командной строки kubectl.

2. Разверните тестовое приложение с балансировщиком нагрузки

Заголовок раздела «2. Разверните тестовое приложение с балансировщиком нагрузки»
  1. Создайте файл test-app.yaml с манифестом для развертывания тестового приложения и внешнего балансировщика нагрузки:

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    selector:
    matchLabels:
    app: nginx-server
    replicas: 3
    template:
    metadata:
    labels:
    app: nginx-server
    spec:
    containers:
    - name: nginx-demo
    image: nginx:stable
    imagePullPolicy: Always
    ports:
    - containerPort: 80
    name: http-web-svc
    volumeMounts:
    - name: config-volume
    mountPath: /etc/nginx/conf.d
    volumes:
    - name: config-volume
    configMap:
    name: nginx-conf
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: nginx-conf
    data:
    default.conf: |
    server {
    listen 80;
    server_name _;
    location / {
    return 200 "Your IP Address is: $remote_addr\n";
    add_header Content-Type text/plain;
    }
    }
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: local
    spec:
    externalTrafficPolicy: Local
    loadBalancerSourceRanges:
    - 0.0.0.0/0
    selector:
    app: nginx-server
    ports:
    - name: tcp
    protocol: TCP
    port: 80
    targetPort: 80
    type: LoadBalancer
  2. Примените манифест:

    bash
    kubectl apply -f test-app.yaml

    Ожидаемый результат:

    bash
    deployment.apps/nginx-deployment created
    configmap/nginx-conf created
    service/lb created
  3. Убедитесь, что поды тестового приложения запущены (Running):

    bash
    kubectl get pods -l app=nginx-server

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    nginx-deployment-679cf8c9d7-42wq2 1/1 Running 0 109s
    nginx-deployment-679cf8c9d7-lkfsc 1/1 Running 0 109s
    nginx-deployment-679cf8c9d7-qhmbw 1/1 Running 0 109s
  1. Запросите информацию о созданном балансировщике нагрузки:

    bash
    kubectl get svc lb

    Ожидаемый результат:

    bash
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    lb LoadBalancer 10.222.89.80 171.22.74.117 80:31290/TCP 13m
  2. Сделайте запрос к балансировщику по внешнему IP-адресу (EXTERNAL-IP):

    bash
    curl 171.22.74.117

    Ожидаемый результат:

    bash
    Your IP Address is: <IP-адрес клиента>

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:

  1. Если вы создавали виртуальную машину, удалите ее.