Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Node Local Gateway

Node Local Gateway — это компонент, работающий на каждом узле кластера в виде Static Pod. Использование Node Local Gateway обеспечивает несколько преимуществ:

  • Стандартизованный прием HTTP-трафика — входящие подключения всегда обрабатываются на одних и тех же портах 80 и 443.

  • Совместимость с сетевыми политиками — трафик к ingress-контроллерам можно контролировать через существующие механизмы безопасности.

1. Принцип работы

Node Local Gateway принимает и обрабатывает трафик на каждом узле кластера в следующих случаях:

  • узел является точкой обработки (входа) внешнего трафика, то есть ingress endpoint

  • сервисы на узле получают отказоустойчивый доступ к Kubernetes API (например, kubelet или StarVault)

Благодаря такому подходу:

  • Ingress-контроллеры могут работать в стандартном режиме (через Deployment), без привязки к host-сети, что упрощает управление и масштабирование

  • Конфигурация маршрутизации обновляется автоматически, поддерживая актуальное состояние без ручного вмешательства

2. Метки и аннотации для узлов

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

Тип Ключ Значение Описание

label

node.nova-platform.io/ingress-endpoint

-

Базовая метка, которая устанавливается на любой узел, если необходимо объявить его точкой входа трафика независимо от того, есть ли на узле Ingress-контроллер.

annotation

ingress-endpoint.nova-platform.io/type

ingress-nginx или istio-ingressgateway

Тип точки входа трафика: узел может обслуживать входящий трафик либо ingress-nginx, либо istio-ingressgateway.

annotation

ingress-endpoint.nova-platform.io/backend-http-port

номер порта, например, 80

Указывается номер порта, в который необходимо направлять HTTP-трафик.

annotation

ingress-endpoint.nova-platform.io/backend-https-port

номер порта, например, 443

Указывается номер порта, в который необходимо направлять HTTPS-трафик.

annotation

ingress-endpoint.nova-platform.io/internal-traffic-policy

cluster или local

Политика cluster позволяет принимать трафик для ingress-контроллера и направлять его на другой pod контроллера, если pod отсутствует непосредственно на текущем узле. Политика local запрещает такое поведение, и узел может принять трафик, только если на нём локально расположен pod контроллера.

annotation

ingress-endpoint.nova-platform.io/config-profile

имя профиля конфигурации

Имя профиля конфигурации Node Local Gateway. Для базовой конфигурации используется значение default.

annotation

ingress-endpoint.nova-platform.io/config-priority

целое число

Приоритет конфигурации при слиянии.

annotation

ingress-endpoint.nova-platform.io/config-merge-policy

deep или replace

Политика слияния. Значение deep заменяет блок конфигурации, значение replace полностью заменяет конфигурацию.

3. Конфигурация узлов при развертывании

3.1. Infra-узлы

Для всех infra-узлов автоматически задаются:

  • Метки

    node-role.kubernetes.io/infra: ''
    node.nova-platform.io/ingress-endpoint: ''
  • Аннотации

    ingress-endpoint.nova-platform.io/backend-http-port: '80'
    ingress-endpoint.nova-platform.io/backend-https-port: '443'
    ingress-endpoint.nova-platform.io/internal-traffic-policy: cluster
    ingress-endpoint.nova-platform.io/type: ingress-nginx
    ingress-endpoint.nova-platform.io/config-profile: default
    ingress-endpoint.nova-platform.io/config-priority: ''
    ingress-endpoint.nova-platform.io/config-merge-policy: ''

Это означает, что каждый infra-узел принимает входящий трафик на портах 80 и 443, даже если на нём нет pod с ingress-nginx.

Количество реплик nova-ingress-internal-controller:

  • если infra-узел < 3 → 1 реплика

  • если infra-узел ≥ 3 → 2 реплики.

3.2. Worker-узлы

Если нет отдельных ingress-узлов, то для всех worker-узлов автоматически задаются:

  • Метки

    node-role.kubernetes.io/worker: ''
    node.nova-platform.io/ingress-endpoint: ''
  • Аннотации

    ingress-endpoint.nova-platform.io/backend-http-port: '80'
    ingress-endpoint.nova-platform.io/backend-https-port: '443'
    ingress-endpoint.nova-platform.io/internal-traffic-policy: cluster
    ingress-endpoint.nova-platform.io/type: ingress-nginx
    ingress-endpoint.nova-platform.io/config-profile: default
    ingress-endpoint.nova-platform.io/config-priority: ''
    ingress-endpoint.nova-platform.io/config-merge-policy: ''

Количество реплик nova-ingress-public-controller:

  • если в конфигурации явно указан блок с ingress-узлами → число реплик совпадает с числом этих узлов;

  • если блок отсутствует:

    • при количестве мастер-узлов < 3 → создается 1 реплика;

    • при количестве мастер-узлов ≥ 3 → создается 2 реплики.

4. Конфигурация узлов при масштабировании

  • Новый worker-узел при добавлении будет иметь следующий набор меток:

    labels:
        <...>
        node-role.kubernetes.io/worker: ''
  • Новый infra-узел при добавлении будет иметь следующий набор меток:

    labels:
        <...>
        node-role.kubernetes.io/infra: ''

У только что добавленных worker- или infra-узлов нет метки node.nova-platform.io/ingress-endpoint: '' и аннотаций ingress-endpoint.*.

5. Динамическое управление конфигурацией

Конфигурацией Node Local Gateway управляют с помощью ресурсов ConfigMap.

ConfigMap следует создавать в пространстве имён kube-system.

Пример ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: nlg-infra-config
  namespace: kube-system
  labels:
    ingress-endpoint.nova-platform.io/config-profile: nlg-infra-config (1)
    ingress-endpoint.nova-platform.io/config-priority: "100" (2)
    ingress-endpoint.nova-platform.io/config-merge-policy: "deep" (3)
data:
  cds-config-overrides: | (4)
    resources:
      - name: kube_apiserver_cluster
        "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
        connect_timeout: 1s
        # ...
  lds-config-overrides: | (5)
    resources:
      - name: listener_kube_apiserver
        "@type": type.googleapis.com/envoy.config.listener.v3.Listener
        # ...
1 Имя профиля конфигурации, указанное в аннотации узла.
2 Приоритет конфигурации. Чем больше значение, тем выше приоритет.
3 Политика слияния. Значение deep заменяет блок конфигурации, значение replace полностью заменяет конфигурацию.
4 Настройки конфигурации Envoy clusters.
5 Настройки конфигурации Envoy listeners.

Конфигурация, заданная в ConfigMap, полностью заменяет целевой блок конфигурации в cds.yaml или lds.yaml. Например, в приведённом выше примере ConfigMap будут полностью заменены блоки kube_apiserver_cluster в cds.yaml и listener_kube_apiserver в lds.yaml.

Config-builder сопоставляет аннотации целевого узла с метками ConfigMap, чтобы найти конфигурацию для этого узла. Аннотации для выбора и применения конфигурации приведены в таблице ниже.

Ключ Значение Описание

ingress-endpoint.nova-platform.io/config-profile

Любое имя профиля в соответствии с синтаксисом Kubernetes.

Имя профиля конфигурации. Аннотация обязательна. Для базовой конфигурации зарезервировано имя default: в этом случае config-builder не ищет дополнительные конфигурации и генерирует lds.yaml и cds.yaml по стандартной схеме.

ingress-endpoint.nova-platform.io/config-priority

100-N

Приоритет конфигурации. Определяет порядок слияния всех конфигураций.

ingress-endpoint.nova-platform.io/config-merge-policy

deep или replace

Политика слияния. Значение deep заменяет блок конфигурации, значение replace полностью заменяет конфигурацию.

Аннотацию config-profile config-builder использует как метку для поиска ConfigMap, соответствующих профилю конфигурации узла. Затем конфигурационные файлы сливаются с конфигурацией по умолчанию в порядке приоритета.

После запуска config-builder постоянно отслеживает ресурсы ConfigMap и обновляет конфигурацию при их изменении.

5.1. Пример настройки circuit_breakers

Следующий ConfigMap добавляет настройки circuit_breakers для кластера ingress_https_cluster:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nlg-demo
  namespace: kube-system
  labels:
    ingress-endpoint.nova-platform.io/config-profile: nlg-demo
    ingress-endpoint.nova-platform.io/config-priority: "100"
    ingress-endpoint.nova-platform.io/config-merge-policy: deep
data:
  cds-config-overrides: |
    resources:
      - name: ingress_https_cluster
        "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
        connect_timeout: 1s
        type: STATIC
        lb_policy: LEAST_REQUEST
        circuit_breakers:
          thresholds:
            - priority: DEFAULT
              max_connections: 7777
              max_pending_requests: 7777
              max_requests: 7777
              max_retries: 7
        transport_socket:
          name: upstream_proxy_protocol
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.transport_sockets.proxy_protocol.v3.ProxyProtocolUpstreamTransport
            config: { version: V2 }
            transport_socket:
              name: upstream_raw_buffer
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.transport_sockets.raw_buffer.v3.RawBuffer