Функция доступна только в DKP Enterprise Edition.

Egress Gateway позволяет централизованно управлять исходящим трафиком и контролировать его, а также обеспечивает такие функции, как шифрование, маршрутизация и мониторинг.

Чтобы использовать Egress Gateway, включите в кластере модуль cni-cilium.

Режимы использования Egress Gateway

Базовый режим

Используются предварительно настроенные IP-адреса на egress-узлах.

Режим с Virtual IP

Реализована возможность динамически назначать дополнительные IP-адреса узлам.

Принцип настройки

Для настройки egress-шлюза добавьте два кастомных ресурса:

  1. EgressGateway — определяет группу узлов, один из которых будет выбран в качестве активного egress-шлюза, а остальные останутся в резерве на случай отказа:
    • Из узлов, попадающих под spec.nodeSelector, будут отобраны пригодные к использованию. Один из них будет назначен активным шлюзом. Выбор активного узла осуществляется в алфавитном порядке.

      Узел считается пригодным, если:

      • находится состоянии Ready.
        • не помечен как недоступный (cordon).
        • агент cilium-agent на нём также в состоянии Ready.
      • Если EgressGateway используется в режиме VirtualIP, на активном узле запускается агент, который эмулирует виртуальный IP-адрес с использованием протокола ARP. При определении пригодности узла также учитывается состояние пода данного агента.
      • Один и тот же узел может быть задействован в нескольких EgressGateway. Выбор активного узла в каждом EgressGateway осуществляется независимо от других, что позволяет сбалансировать нагрузку между ними.
  2. EgressGatewayPolicy — определяет политику перенаправления сетевых запросов от подов в кластере на конкретный egress-шлюз, заданный с помощью EgressGateway.

Обслуживание узла

Для проведения работ на узле, который в данный момент является активным egress-шлюзом, выполните следующие шаги:

  1. Снимите лейбл с узла, чтобы исключить его из списка кандидатов для роли egress-шлюза. <egress-label> — это метка, указанная в spec.nodeSelector вашего EgressGateway.

    d8 k label node <node-name> <egress-label>-
    
  2. Переведите узел в режим обслуживания (cordon), чтобы предотвратить запуск новых подов:

    d8 k cordon <node-name>
    

    После этого Cilium автоматически выберет новый активный узел из оставшихся кандидатов. Трафик продолжит направляться через новый шлюз без прерывания.

  3. Для возврата узла в работу выполните:

    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