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 |
|
- |
Базовая метка, которая устанавливается на любой узел, если необходимо объявить его точкой входа трафика независимо от того, есть ли на узле Ingress-контроллер. |
annotation |
|
|
Тип точки входа трафика: узел может обслуживать входящий трафик либо ingress-nginx, либо istio-ingressgateway. |
annotation |
|
номер порта, например, |
Указывается номер порта, в который необходимо направлять HTTP-трафик. |
annotation |
|
номер порта, например, |
Указывается номер порта, в который необходимо направлять HTTPS-трафик. |
annotation |
|
|
Политика |
annotation |
|
имя профиля конфигурации |
Имя профиля конфигурации Node Local Gateway. Для базовой конфигурации используется значение |
annotation |
|
целое число |
Приоритет конфигурации при слиянии. |
annotation |
|
|
Политика слияния. Значение |
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-узлов нет метки |
5. Динамическое управление конфигурацией
Конфигурацией Node Local Gateway управляют с помощью ресурсов ConfigMap.
|
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, полностью заменяет целевой блок конфигурации в |
Config-builder сопоставляет аннотации целевого узла с метками ConfigMap, чтобы найти конфигурацию для этого узла. Аннотации для выбора и применения конфигурации приведены в таблице ниже.
| Ключ | Значение | Описание |
|---|---|---|
|
Любое имя профиля в соответствии с синтаксисом Kubernetes. |
Имя профиля конфигурации. Аннотация обязательна. Для базовой конфигурации зарезервировано имя |
|
|
Приоритет конфигурации. Определяет порядок слияния всех конфигураций. |
|
|
Политика слияния. Значение |
Аннотацию 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