Сценарий
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. Конкретная процедура следующая:
- Войдите в консоль управления, выберите Сеть > NAT Gateway из списка сервисов и нажмите Купить Public NAT Gateway в правом верхнем углу. Note
При покупке NAT gateway убедитесь, что NAT gateway принадлежит тому же VPC и подсети, что и кластер CCE, где работает нагрузка.
- Войдите в консоль управления, выберите Сеть > Elastic IP из списка сервисов и нажмите Купить EIP в правом верхнем углу.
Создание сервиса DNAT Gateway
- Войдите в консоль CCE и нажмите название кластера, чтобы открыть консоль кластера.
- В панели навигации выберите Services & Ingresses. В правом верхнем углу нажмите Создать Service.
- Настройте параметры доступа внутри кластера.
- Имя сервиса: Укажите имя сервиса, которое может совпадать с именем нагрузки.
- Тип сервиса: Выберите 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.
- Нажмите OK.
Настройка типа доступа с помощью kubectl
Вы можете настроить доступ к Service при создании нагрузки с помощью kubectl. В этом разделе в качестве примера используется нагрузка Nginx, чтобы описать, как реализовать внутрикластерный доступ с помощью kubectl.
- Используйте kubectl для доступа к кластеру. Подробнее см. Доступ к кластеру с помощью kubectl.
- Создайте и отредактируйте nginx-deployment.yaml и nginx-nat-svc.yaml файлы.
Имена файлов задаются пользователем. nginx-deployment.yaml и nginx-nat-svc.yaml являются лишь примерами имён файлов.
vi nginx-deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginximagePullSecrets:- name: default-secretДля описаний предыдущих полей см. Таблица 1.
vi nginx-nat-svc.yaml
apiVersion: v1kind: Servicemetadata:name: nginxannotations:kubernetes.io/elb.class: dnatkubernetes.io/natgateway.id: e4a1cfcf-29df-4ab8-a4ea-c05dc860f554spec:loadBalancerIP: 10.78.42.242ports:- name: service0port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: 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.
- Создайте нагрузку.
kubectl create -f nginx-deployment.yaml
Если отображается информация, похожая на следующую, нагрузка создаётся.
deployment "nginx" createdkubectl get po
Если отображается информация, похожая на следующую, нагрузка работает.
NAME READY STATUS RESTARTS AGEnginx-2601814895-sf71t 1/1 Running 0 8s - Создайте Service.
kubectl create -f nginx-nat-svc.yaml
Если отображается информация, похожая на следующую, Service создан.
service "nginx-eip" createdkubectl get svc
Если отображается следующая информация, Service успешно настроен, и нагрузка доступна.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3dnginx-nat LoadBalancer 10.247.226.2 10.154.74.98 80:30589/TCP 5s - В адресной строке браузера введите 10.154.74.98:80 и нажмите Enter.
В этом примере, 10.154.74.98 это адрес elastic IP и 80 это номер порта, полученный на предыдущем шаге.