Функция доступна только в DKP Enterprise Edition.
Egress Gateway позволяет централизованно управлять исходящим трафиком и контролировать его, а также обеспечивает такие функции, как шифрование, маршрутизация и мониторинг.
Чтобы использовать Egress Gateway, включите в кластере модуль cni-cilium
.
Режимы использования Egress Gateway
Базовый режим
Используются предварительно настроенные IP-адреса на egress-узлах.
Режим с Virtual IP
Реализована возможность динамически назначать дополнительные IP-адреса узлам.
Принцип настройки
Для настройки egress-шлюза добавьте два кастомных ресурса:
- EgressGateway — определяет группу узлов, один из которых будет выбран в качестве активного egress-шлюза, а остальные останутся в резерве на случай отказа:
-
Из узлов, попадающих под
spec.nodeSelector
, будут отобраны пригодные к использованию. Один из них будет назначен активным шлюзом. Выбор активного узла осуществляется в алфавитном порядке.Узел считается пригодным, если:
- находится состоянии
Ready
.- не помечен как недоступный (cordon).
- агент
cilium-agent
на нём также в состоянииReady
.
- Если EgressGateway используется в режиме
VirtualIP
, на активном узле запускается агент, который эмулирует виртуальный IP-адрес с использованием протокола ARP. При определении пригодности узла также учитывается состояние пода данного агента. - Один и тот же узел может быть задействован в нескольких EgressGateway. Выбор активного узла в каждом EgressGateway осуществляется независимо от других, что позволяет сбалансировать нагрузку между ними.
- находится состоянии
-
- EgressGatewayPolicy — определяет политику перенаправления сетевых запросов от подов в кластере на конкретный egress-шлюз, заданный с помощью EgressGateway.
Обслуживание узла
Для проведения работ на узле, который в данный момент является активным egress-шлюзом, выполните следующие шаги:
-
Снимите лейбл с узла, чтобы исключить его из списка кандидатов для роли egress-шлюза.
<egress-label>
— это метка, указанная вspec.nodeSelector
вашего EgressGateway.d8 k label node <node-name> <egress-label>-
-
Переведите узел в режим обслуживания (cordon), чтобы предотвратить запуск новых подов:
d8 k cordon <node-name>
После этого Cilium автоматически выберет новый активный узел из оставшихся кандидатов. Трафик продолжит направляться через новый шлюз без прерывания.
-
Для возврата узла в работу выполните:
d8 k uncordon <node-name> d8 k label node <node-name> <egress-label>=<value>
Повторное добавление метки может привести к тому, что узел снова будет выбран активным egress-шлюзом (если он первый в алфавитном порядке среди доступных кандидатов).
Чтобы избежать немедленного возврата узла в активное состояние, временно уменьшите количество реплик в EgressGateway или настройте приоритет выбора через дополнительные метки.
Сравнение с CiliumEgressGatewayPolicy
CiliumEgressGatewayPolicy
подразумевает настройку только одного узла в качестве egress-шлюза. При выходе его из строя не предусмотрено failover-механизмов и сетевая связь будет нарушена.
Примеры настройки
EgressGateway в режиме PrimaryIPFromEgressGatewayNodeInterface (базовый режим)
apiVersion: network.deckhouse.io/v1alpha1
kind: EgressGateway
metadata:
name: myegressgw
spec:
nodeSelector:
node-role.deckhouse.io/egress: ""
sourceIP:
mode: PrimaryIPFromEgressGatewayNodeInterface
primaryIPFromEgressGatewayNodeInterface:
# Все узлы, подходящие под nodeSelector, должны иметь одинаковое имя публичного интерфейса.
# При выходе из строя активного узла, трафик будет перенаправлен через резервный.
# при этом IP-адрес источника в сетевых пакетах изменится.
interfaceName: eth1
EgressGateway в режиме VirtualIPAddress (Режим с Virtual IP)
apiVersion: network.deckhouse.io/v1alpha1
kind: EgressGateway
metadata:
name: myeg
spec:
nodeSelector:
node-role.deckhouse.io/egress: ""
sourceIP:
mode: VirtualIPAddress
virtualIPAddress:
# На каждом узле должны быть настроены все необходимые маршруты для доступа на все внешние публичные сервисы,
# Публичный интерфейс должен быть подготовлен к автоматической настройке виртуального IP в качестве дополнительного (secondary) IP-адреса.
# При выходе из строя активного узла, трафик будет перенаправлен через резервный.
# IP-адрес отправителя у сетевых пакетов не поменяется.
ip: 172.18.18.242
# Список сетевых интерфейсов, на которых будет назначен виртуальный IP-адрес.
interfaces:
- eth1
EgressGatewayPolicy
apiVersion: network.deckhouse.io/v1alpha1
kind: EgressGatewayPolicy
metadata:
name: my-egressgw-policy
spec:
destinationCIDRs:
- 0.0.0.0/0
egressGatewayName: my-egressgw
selectors:
- podSelector:
matchLabels:
app: backend
io.kubernetes.pod.namespace: my-ns