Облачная платформаAdvanced

DNAT

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

A DNAT Service provides Network Address Translation (NAT) for all nodes in a cluster so that multiple nodes can share an EIP. The access address of a DNAT Service is in the format of <EIP-of-the-NAT-gateway>:<access-port>, for example, 10.117.117.117:80.

Если pods требуют временного или небольшого объёма доступа из Интернета, вы можете создать DNAT Service. DNAT Services обеспечивают более высокую надёжность, чем NodePort Services. При использовании DNAT Service нет необходимости привязывать EIP к отдельному узлу, и запросы всё равно могут распределяться между рабочей нагрузкой, даже если один из узлов внутри недоступен.

Рисунок 1 DNAT Service


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

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

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

Подготовка: создание NAT Gateway и EIP

Вы приобрели NAT gateway и EIP. Конкретная процедура выглядит следующим образом:

  1. Войдите в NAT Gateway console и нажмите Buy Public NAT Gateway в правом верхнем углу.

    После покупки NAT gateway добавлять правила SNAT или DNAT не требуется.

    Note

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

  2. Войдите в EIP console и нажмите Buy EIP в правом верхнем углу.

Использование CCE Console

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

    Параметр

    Описание

    Имя сервиса

    Введите имя, которое может совпадать с именем рабочей нагрузки.

    Тип сервиса

    Выберите DNAT.

    Пространство имён

    Выберите пространство имён, к которому относится рабочая нагрузка.

    Привязка сервиса

    Определяет, направлять ли внешний трафик к локальному узлу или к конечной точке на уровне кластера. Подробнее см. Service Affinity (externalTrafficPolicy).

    • Cluster-level: IP‑адреса и порты всех узлов в кластере могут обращаться к рабочей нагрузке, связанной с сервисом. Однако доступ к сервису может привести к ухудшению производительности из‑за перенаправления маршрута, и исходный IP‑адрес клиента может быть недоступен.
    • Node-level: Только IP‑адрес и порт узла, на котором расположена рабочая нагрузка, могут обращаться к рабочей нагрузке, связанной с сервисом. Доступ к сервису не приведёт к ухудшению производительности из‑за перенаправления маршрута, и исходный IP‑адрес клиента может быть получен.

    Селектор

    Сервис будет связан с pod‑ами рабочей нагрузки на основе метки и будет направлять трафик к pod‑ам с этой меткой.

    Вы можете добавить ключ и значение для метки pod и нажмите Confirm.

    Вы также можете нажать Reference Workload Label, чтобы использовать метку существующего workload. В отображаемом диалоговом окне выберите workload и нажмите OK.

    DNAT

    Выберите шлюз DNAT и EIP, приобретённые в Preparations: Creating a NAT Gateway and an EIP.

    Port

    • Protocol: протокол, поддерживаемый Service.
    • Container Port: порт, на котором слушают контейнеры сервиса. Порт может принимать значения от 1 до 65535. Необходимо определить порт на основе образа контейнера. Например, порт по умолчанию для Nginx — 80, а порт по умолчанию для MySQL — 3306.
    • Service Port: порт, используемый для доступа к DNAT Service. При необходимости можно задать пользовательский порт. Порт может принимать значения от 1 до 65535.

  4. Нажмите OK.

Использование kubectl

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

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Accessing a Cluster Using kubectl.
  2. Создайте и отредактируйте файл nginx-deployment.yaml для настройки образца workload. Подробнее см. Creating a Deployment. nginx-deployment.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

  3. Создайте и отредактируйте файл nginx-nat-svc.yaml для настройки параметров Service. nginx-nat-svc.yaml — пример имени файла. При желании вы можете изменить имя файла.

    vi nginx-nodeport-svc.yaml

    Содержимое файла:

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-nat
    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, который используется для доступа к сервису NAT Gateway и добавления правил DNAT. Этот параметр нельзя изменить после создания Service.

    kubernetes.io/natgateway.id

    Да

    String

    Идентификатор NAT gateway. Этот параметр нельзя изменить после создания Service.

    Как получить:

    В консоли управления нажмите Service List и выберите Networking > NAT Gateway. Нажмите имя целевого NAT gateway, чтобы открыть страницу его деталей. На вкладке Basic Information найдите и скопируйте ID.

    loadBalancerIP

    Yes

    String

    Введите EIP, связанный с NAT gateway.

    port

    Yes

    Integer

    Порт, используемый для доступа к сервису DNAT. При необходимости вы можете настроить порт. Диапазон портов от 1 до 65535.

    targetPort

    Yes

    String

    Порт прослушивания контейнеров сервиса. Диапазон портов от 1 до 65535. Необходимо определить порт исходя из образа контейнера. Например, порт по умолчанию для Nginx — 80, а порт по умолчанию для MySQL — 3306.

    type

    Yes

    String

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

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

    kubectl create -f nginx-deployment.yaml

    Если отображается информация, аналогичная следующей, workload создан:

    deployment/nginx created

    Проверьте созданный workload.

    kubectl get pod

    Если отображается информация, аналогичная следующей, workload работает:

    NAME READY STATUS RESTARTS AGE
    nginx-2601814895-znhbr 1/1 Running 0 15s

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

    kubectl create -f nginx-nat-svc.yaml

    Если отображается информация, аналогичная следующей, Service создаётся:

    service/nginx-nat created

    Проверьте созданный Service.

    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 **.**.**.** 80:30589/TCP 5s

  6. Введите URL, который имеет формат \u003cEIP\u003e:\u003cport\u003e, в адресную строку браузера.