Advanced

DNAT

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сценарий

A шлюз трансляции сетевых адресов назначения (DNAT) расположен между узлами кластера и общедоступными сетями и имеет назначенный EIP. После получения входящих запросов из общедоступных сетей NAT gateway переводит EIP (адрес назначения во входящих запросах) во внутренний адрес кластера. Он выглядит для пользователей нагрузки так, как будто все узлы, запускающие нагрузку, используют один и тот же EIP.

DNAT обеспечивает более высокую надежность, чем NodePort на основе EIP, где EIP привязан к отдельному узлу, и при выходе узла из строя все входящие запросы к нагрузке не распределяются. Адрес доступа имеет формат <EIP>:<access port>, например, 10.117.117.117:80.

Рисунок 1 DNAT


Примечания и ограничения

Обратите внимание на следующие ограничения при использовании службы NAT Gateway:

  • Правила DNAT не поддерживают enterprise‑project authorization.
  • Контейнеры в кластере не могут получить доступ к службе DNAT, чей externalTrafficPolicy является Local.
  • Несколько правил для одного NAT gateway могут использовать один и тот же EIP, но правила для разных NAT gateway должны использовать разные EIP.
  • Каждый VPC может иметь только один NAT gateway.
  • Пользователи не могут вручную добавить маршрут по умолчанию в VPC.
  • В подсети VPC можно добавить только одно правило SNAT.
  • Правила SNAT и DNAT предназначены для разных функций. Если правила SNAT и DNAT используют один и тот же EIP, произойдет вытеснение ресурсов. Правило SNAT не может делить EIP с правилом DNAT, который Тип порта установить в Все порты.
  • Правила DNAT не поддерживают привязку EIP к виртуальному IP-адресу.
  • Когда для сервера одновременно настроены службы EIP и NAT Gateway, данные будут перенаправляться через EIP.
  • Пользовательский CIDR‑блок должен быть подмножеством CIDR‑блоков подсетей VPC.
  • Пользовательский CIDR‑блок должен быть CIDR‑блоком Direct Connect и не может конфликтовать с существующими CIDR‑блоками подсетей VPC.
  • Когда вы выполняете операции над базовыми ресурсами ECS, например, меняете его характеристики, настроенные правила NAT gateway становятся недействительными. Удалите правила и перенастройте их.
  • После создания службы, если настройка аффинити переключается с уровня кластера на уровень узла, таблица трассировки соединений не будет очищена. Не изменяйте настройку аффинити службы после её создания. Чтобы изменить её, создайте службу заново.
  • Если подсеть узла связана с пользовательской таблицей маршрутов, добавьте маршрут NAT в пользовательскую таблицу маршрутов при использовании службы DNAT.

Создание NAT Gateway и Elastic IP Address

Вы создали NAT gateway и Elastic IP. Конкретная процедура следующая:

  1. Войдите в консоль управления, выберите Сеть > NAT Gateway из списка сервисов и нажмите Купить Public NAT Gateway в правом верхнем углу.

    Note

    При покупке NAT gateway убедитесь, что NAT gateway принадлежит тому же VPC и подсети, что и кластер CCE, где работает нагрузка.

  2. Войдите в консоль управления, выберите Сеть > Elastic IP из списка сервисов и нажмите Купить EIP в правом верхнем углу.

Создание сервиса DNAT Gateway

  1. Войдите в консоль CCE и нажмите название кластера, чтобы открыть консоль кластера.
  2. В панели навигации выберите Services & Ingresses. В правом верхнем углу нажмите Создать Service.
  3. Настройте параметры доступа внутри кластера.

    • Имя сервиса: Укажите имя сервиса, которое может совпадать с именем нагрузки.
    • Тип сервиса: Выберите DNAT.
    • Пространство имён: Пространство имён, к которому относится нагрузка.
    • Аффинити сервиса: Подробности см. externalTrafficPolicy (Service Affinity).
      • Уровень кластера: IP-адреса и порты доступа всех узлов в кластере могут обращаться к нагрузке, связанной с сервисом. Доступ к сервису вызывает потерю производительности из‑за перенаправления маршрутов, и исходный IP‑адрес клиента получить невозможно.
      • Уровень узла: Только IP-адрес и порт доступа узла, на котором размещена нагрузка, могут обращаться к нагрузке, связанной с сервисом. Доступ к сервису не вызывает потери производительности из‑за перенаправления маршрутов, и исходный IP‑адрес клиента может быть получен.
    • Селектор: Добавьте метку и нажмите Подтвердить. Сервис будет использовать эту метку для выбора pod'ов. Вы также можете нажать Ссылка на метку нагрузки чтобы использовать метку существующей нагрузки. В появившемся диалоговом окне выберите нагрузку и нажмите OK.
    • DNAT: Выберите шлюз DNAT и EIP, созданные в Создание NAT Gateway и Elastic IP Address.
    • Порты
      • Протокол: протокол, используемый сервисом.
      • Порт контейнера: порт прослушивателя нагрузки. Nginx workload прослушивает порт 80.
      • Порт сервиса: порт, сопоставленный с портом контейнера по внутреннему IP‑адресу кластера. Доступ к нагрузке можно получить по <cluster-internal IP address>:<access port>. Диапазон номеров портов: 1–65535.

  4. Нажмите OK.

Настройка типа доступа с помощью kubectl

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

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Доступ к кластеру с помощью kubectl.
  2. Создайте и отредактируйте nginx-deployment.yaml и nginx-nat-svc.yaml файлы.

    Имена файлов задаются пользователем. nginx-deployment.yaml и nginx-nat-svc.yaml являются лишь примерами имён файлов.

    vi nginx-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - image: nginx:latest
    name: nginx
    imagePullSecrets:
    - name: default-secret

    Для описаний предыдущих полей см. Таблица 1.

    vi nginx-nat-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx
    annotations:
    kubernetes.io/elb.class: dnat
    kubernetes.io/natgateway.id: e4a1cfcf-29df-4ab8-a4ea-c05dc860f554
    spec:
    loadBalancerIP: 10.78.42.242
    ports:
    - name: service0
    port: 80
    protocol: TCP
    targetPort: 80
    selector:
    app: nginx
    type: LoadBalancer
    Таблица 1 Ключевые параметры

    Параметр

    Обязательно

    Тип

    Описание

    kubernetes.io/elb.class

    Да

    String

    Этот параметр установлен в dnat чтобы CCE мог работать с шлюзом NAT, и можно было добавить правила DNAT.

    kubernetes.io/natgateway.id

    Да

    String

    ID шлюза NAT.

    loadBalancerIP

    Да

    String

    ID EIP.

    порт

    Да

    Integer

    Порт доступа, установленный в консоли. Значения находятся в диапазоне от 1 до 65535.

    targetPort

    Да

    String

    Порт контейнера, установленный в консоли. Значения находятся в диапазоне от 1 до 65535.

    type

    Да

    String

    Тип сервиса шлюза NAT должен быть установлен в LoadBalancer.

  3. Создайте нагрузку.

    kubectl create -f nginx-deployment.yaml

    Если отображается информация, похожая на следующую, нагрузка создаётся.

    deployment "nginx" created

    kubectl get po

    Если отображается информация, похожая на следующую, нагрузка работает.

    NAME READY STATUS RESTARTS AGE
    nginx-2601814895-sf71t 1/1 Running 0 8s

  4. Создайте Service.

    kubectl create -f nginx-nat-svc.yaml

    Если отображается информация, похожая на следующую, Service создан.

    service "nginx-eip" created

    kubectl get svc

    Если отображается следующая информация, Service успешно настроен, и нагрузка доступна.

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3d
    nginx-nat LoadBalancer 10.247.226.2 10.154.74.98 80:30589/TCP 5s

  5. В адресной строке браузера введите 10.154.74.98:80 и нажмите Enter.

    В этом примере, 10.154.74.98 это адрес elastic IP и 80 это номер порта, полученный на предыдущем шаге.