MetalLB#

MetalLB - это реализация балансировщика нагрузки (LoadBalancer) для Kubernetes, предназначенная для использования в средах, где облачные провайдеры недоступны или не поддерживаются. По умолчанию в публичных облаках (например, Yandex, VK, AWS, GCP, Azure) сервисы типа LoadBalancer автоматически выделяют внешний IP-адрес и настраивают сетевой балансировщик. Однако в локальных кластерах Kubernetes (например, развернутых на bare-metal серверах или в частных дата-центрах), такая функциональность отсутствует – для решения таких типов задач подходит MetalLB.

Основные задачи и возможности
  • Обеспечение внешнего доступа к сервисам типа LoadBalancer: MetalLB предоставляет возможность использовать тип сервиса LoadBalancer в локальных и гибридных средах, выделяя реальные IP-адреса из заданного диапазона.

  • Управление IP-адресами: MetalLB распределяет и управляет рядом IP-адресов, которые будут назначаться сервисам автоматически.

  • Поддержка нескольких режимов работы: MetalLB поддерживает несколько способов предоставления внешнего доступа:

    • Режим Layer 2: один узел становится ответственным за IP-адрес и принимает весь трафик на него. Подходит для простых сетей. В этом режиме Platform V DropApp работает по умолчанию.

    • Режим BGP: MetalLB взаимодействует с внешними маршрутизаторами по протоколу BGP и объявляет маршруты на выделенные IP-адреса, обеспечивая высокую доступность и балансировку трафика между узлами кластера.

Основные компоненты MetalLB:

  • speaker: разворачивается как DaemonSet и отвечает за работу в сети (ARP/NDP в Layer 2 или BGP-соединение).

  • Controller: работает как Deployment и управляет выдачей IP-адресов, следит за состоянием сервисов.

Принцип работы:

Во время создания сервиса типа LoadBalancer, Kubernetes помечает его как "Pending", ожидая выделения внешнего IP. MetalLB перехватывает этот запрос, выбирает свободный IP из списка, который был определен пользователем, и назначает его сервису. Затем он обеспечивает маршрутизацию трафика на нужный Pod через cilium и Service-механизмы Kubernetes.

Примечание

MetalLB является единственным инструментом в компоненте load-balancer. Он устанавливается по умолчанию в процессе установки всего кластера DropApp. В частности, адрес из его Pool присваивается сервису ingress-nginx-controller.

Конфигурация values#

Значения можно переопределить через редактирование инструмента с именем metallb и указанием нужных values в spec.values. Общее описание конфигурации values для инструментов описано в разделе «Конфигурации инструментов дополнительных компонентов».

imagePullSecrets – Secret для загрузки образов#

Параметр

Описание

Значение по умолчанию

imagePullSecrets

Список Secret для загрузки образа контейнера из приватных реестров

[]

nameOverride – переопределение имени чарта#

Параметр

Описание

Значение по умолчанию

nameOverride

Переопределение базового имени ресурсов чарта для генерации имен

""

fullnameOverride – полное переопределение имени чарта#

Параметр

Описание

Значение по умолчанию

fullnameOverride

Полное переопределение имени для всех создаваемых ресурсов чарта

""

loadBalancerClass – класс балансировщика нагрузки#

Параметр

Описание

Значение по умолчанию

loadBalancerClass

Класс LoadBalancer для управления конкретными Service

""

rbac – настройки RBAC (управление доступом на основе ролей)#

Параметр

Описание

Значение по умолчанию

rbac.create

Активация автоматического создания ресурсов RBAC

true

tls – настройки TLS#

Параметр

Описание

Значение по умолчанию

tls.cipherSuites

Список шифров TLS через запятую. Применяется только к TLS 1.2. Если не задано, используются стандартные алгоритмы Go

""

tls.curvePreferences

Список предпочтительных кривых TLS через запятую (например, 29,4588). Если не задано, используются стандартные кривые Go

""

tls.minVersion

Минимальная версия TLS.
Возможные значения: VersionTLS12, VersionTLS13 (по умолчанию).

""

tls.controllerMetricsTLSSecret

Имя Secret с TLS-сертификатом для метрик контроллера. Если не указано, автоматически генерируется самоподписанный сертификат

""

tls.speakerMetricsTLSSecret

Имя Secret с TLS-сертификатом для метрик компонента speaker. Если не указано, автоматически генерируется самоподписанный сертификат

""

prometheus – параметры интеграции с Prometheus и сбора метрик#

Параметр

Описание

Значение по умолчанию

prometheus.scrapeAnnotations

Добавление аннотаций для автоматического сбора метрик Prometheus

false

prometheus.metricsPort

Порт для экспорта метрик контроллера и speaker

9120

prometheus.rbacPrometheus

Создание RBAC-правил для Prometheus

true

prometheus.serviceAccount

Настройки ServiceAccount

""

prometheus.namespace

Пространство имен, в котором развернут Prometheus

""

prometheus.podMonitor.enabled

Включение PodMonitor для Prometheus Operator

false

prometheus.podMonitor.additionalLabels

Дополнительные метки для PodMonitor

{}

prometheus.podMonitor.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

prometheus.podMonitor.jobLabel

Метка Job для цели сбора метрик

"app.kubernetes.io/name"

prometheus.podMonitor.interval

Интервал сбора метрик; при отсутствии используется значение по умолчанию Prometheus

~

prometheus.podMonitor.metricRelabelings

Правила фильтрации и преобразования меток, применяемые к собранным метрикам.
Пример конфигурации:

- action: keep
  regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+'
  sourceLabels: [__name__]

[]

prometheus.podMonitor.relabelings

Правила фильтрации и преобразования меток, применяемые к целям сбора до начала сбора метрик.
Пример конфигурации:

- sourceLabels: [__meta_kubernetes_pod_node_name]
  separator: ;
  regex: ^(.*)$
  target_label: nodename
  replacement: $1
  action: replace

[]

prometheus.serviceMonitor.enabled

Включение ServiceMonitor как альтернативы PodMonitor с поддержкой защищенных метрик

false

prometheus.serviceMonitor.speaker.additionalLabels

Дополнительные метки для ServiceMonitor speaker

{}

prometheus.serviceMonitor.speaker.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

prometheus.serviceMonitor.speaker.tlsConfig.insecureSkipVerify

Активация пропуска проверки TLS-сертификата для speaker

true

prometheus.serviceMonitor.controller.additionalLabels

Дополнительные метки для ServiceMonitor контроллера

{}

prometheus.serviceMonitor.controller.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

prometheus.serviceMonitor.controller.tlsConfig.insecureSkipVerify

Активация пропуска проверки TLS-сертификата для контроллера

true

prometheus.serviceMonitor.jobLabel

Метка Job для ServiceMonitor

"app.kubernetes.io/name"

prometheus.serviceMonitor.interval

Интервал сбора метрик для ServiceMonitor; при отсутствии используется значение по умолчанию Prometheus

~

prometheus.serviceMonitor.metricRelabelings

Правила фильтрации и преобразования меток, применяемые к собранным метрикам.
Пример конфигурации:

- action: keep
  regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+'
  sourceLabels: [__name__]

[]

prometheus.serviceMonitor.relabelings

Правила фильтрации и преобразования меток, применяемые к целям сбора до начала сбора метрик.
Пример конфигурации:

- sourceLabels: [__meta_kubernetes_pod_node_name]
  separator: ;
  regex: ^(.*)$
  target_label: nodename
  replacement: $1
  action: replace

[]

prometheus.prometheusRule.enabled

Включение оповещений через PrometheusRule

false

prometheus.prometheusRule.additionalLabels

Дополнительные метки для PrometheusRule

{}

prometheus.prometheusRule.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

prometheus.prometheusRule.staleConfig.enabled

Активация оповещений MetalLBStaleConfig для устаревшей конфигурации

true

prometheus.prometheusRule.staleConfig.labels.severity

Уровень важности оповещения устаревшей конфигурации

warning

prometheus.prometheusRule.configNotLoaded.enabled

Активация оповещений MetalLBConfigNotLoaded для незагруженной конфигурации

true

prometheus.prometheusRule.configNotLoaded.labels.severity

Уровень важности оповещения незагруженной конфигурации

warning

prometheus.prometheusRule.addressPoolExhausted.enabled

Активация оповещений MetalLBAddressPoolExhausted для исчерпанного пула адресов

true

prometheus.prometheusRule.addressPoolExhausted.labels.severity

Уровень важности оповещения исчерпанного пула

critical

prometheus.prometheusRule.addressPoolExhausted.excludePools

Регулярное выражение для исключения пулов адресов из срабатывания оповещений исчерпания адресов

""

prometheus.prometheusRule.addressPoolUsage.enabled

Активация оповещений для использования пула адресов

true

prometheus.prometheusRule.addressPoolUsage.thresholds

Список порогов использования пулов адресов и уровней важности соответствующих оповещений

- percent: 75
  labels:
    severity: warning
- percent: 85
  labels:
    severity: warning
- percent: 95
  labels:
    severity: critical

prometheus.prometheusRule.addressPoolUsage.excludePools

Регулярное выражение для исключения пулов адресов из срабатывания оповещений по использованию

""

prometheus.prometheusRule.bgpSessionDown.enabled

Активация оповещений MetalLBBGPSessionDown для разорванного BGP-соединения

true

prometheus.prometheusRule.bgpSessionDown.labels.severity

Уровень важности оповещения BGP-соединения

critical

prometheus.prometheusRule.extraAlerts

Дополнительные кастомные оповещения

[]

controller – настройки контроллера MetalLB#

Параметр

Описание

Значение по умолчанию

controller.enabled

Включение контроллера MetalLB

true

controller.logLevel

Уровень логирования контроллера.
Возможные значения: all, debug, info, warn, error, none

info

controller.image.repository

Путь к Docker-образу контроллера

'{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-metallb/metallb-controller'

controller.image.tag

Тег образа контейнера

v0.16.1

controller.image.pullPolicy

Политика загрузки образа

~

controller.strategy.type

Стратегия обновления Deployment контроллера

RollingUpdate

controller.serviceAccount.create

Создание ServiceAccount для контроллера

true

controller.serviceAccount.name

Имя ServiceAccount контроллера; при пустом значении и create: true генерируется из шаблона fullname

""

controller.serviceAccount.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

controller.securityContext.runAsNonRoot

Запуск от имени пользователя без административных полномочий

true

controller.securityContext.runAsUser

ID пользователя для запуска контейнера

65534

controller.securityContext.fsGroup

Идентификатор группы файловой системы для pod

65534

controller.resources.requests.memory

Запрашиваемые ресурсы памяти для контейнера

"256Mi"

controller.resources.requests.cpu

Запрашиваемые ресурсы CPU для контейнера

"200m"

controller.resources.limits.memory

Ограничение ресурсов памяти для контейнера

"512Mi"

controller.resources.limits.cpu

Ограничение ресурсов CPU для контейнера

"500m"

controller.nodeSelector

Селектор узлов для планирования pod

{}

controller.tolerations

Toleration для размещения pod на узлах с ограничениями (taints)

[]

controller.priorityClassName

Имя PriorityClass для pod

""

controller.runtimeClassName

Класс среды выполнения для контроллера

""

controller.affinity

Настройки правила привязки (affinity и anti-affinity) pod к узлам

{}

controller.podAnnotations

Аннотации для pod контроллера

{}

controller.labels

Метки, добавляемые ко всем создаваемым ресурсам

{}

controller.livenessProbe.enabled

Включение проверки работоспособности

true

controller.livenessProbe.port

Порт проверки работоспособности

17472

controller.livenessProbe.failureThreshold

Количество неудачных попыток до перевода контейнера в статус NotReady

3

controller.livenessProbe.initialDelaySeconds

Задержка в секундах перед первой проверкой работоспособности

10

controller.livenessProbe.periodSeconds

Интервал в секундах между проверками работоспособности

10

controller.livenessProbe.successThreshold

Количество успешных попыток для подтверждения работоспособности

1

controller.livenessProbe.timeoutSeconds

Тайм-аут ожидания проверки работоспособности

1

controller.readinessProbe.enabled

Включение проверки готовности

true

controller.readinessProbe.port

Порт проверки готовности

17472

controller.readinessProbe.failureThreshold

Количество неудачных попыток до перевода контейнера в статус NotReady

3

controller.readinessProbe.initialDelaySeconds

Задержка в секундах перед первой проверкой готовности

10

controller.readinessProbe.periodSeconds

Интервал в секундах между проверками готовности

10

controller.readinessProbe.successThreshold

Количество успешных попыток для подтверждения готовности

1

controller.readinessProbe.timeoutSeconds

Тайм-аут ожидания проверки готовности

1

controller.extraContainers

Дополнительные контейнеры в pod контроллера

[]

speaker – настройки speaker MetalLB#

Параметр

Описание

Значение по умолчанию

speaker.enabled

Включение speaker-компонента

true

speaker.logLevel

Уровень логирования speaker.
Возможные значения: all, debug, info, warn, error, none

info

speaker.tolerateMaster

Разрешение размещения на мастер узле

true

speaker.memberlist.enabled

Включение memberlist для обнаружения узлов; при отключении pod speaker должны работать на всех узлах

true

speaker.memberlist.mlBindPort

Порт для соединений memberlist

7946

speaker.memberlist.mlBindAddrOverride

Переопределение адреса для memberlist

""

speaker.memberlist.mlSecretKeyPath

Путь к секретному ключу memberlist

"/etc/ml_secret_key"

speaker.excludeInterfaces.enabled

Исключение интерфейсов из обработки

true

speaker.ignoreExcludeLB

Игнорирование метки exclude-from-external-loadbalancer

false

speaker.bgpDebounceTimeout

Тайм-аут debounce для перезагрузок конфигурации FRR в миллисекундах; применяется только когда BGP-тип равен frr; по умолчанию 3000 мс, функция экспериментальная

null

speaker.image.repository

Путь к Docker-образу speaker

'{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-metallb/metallb-speaker'

speaker.image.tag

Тег образа контейнера

v0.16.1

speaker.image.pullPolicy

Политика загрузки образа

~

speaker.updateStrategy.type

Стратегия обновления DaemonSet speaker

RollingUpdate

speaker.serviceAccount.create

Создание ServiceAccount для speaker

true

speaker.serviceAccount.name

Имя ServiceAccount для speaker; при пустом значении и create: true генерируется из шаблона fullname

""

speaker.serviceAccount.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

speaker.securityContext

Контекст безопасности для speaker

{}

speaker.resources.requests.memory

Запрашиваемые ресурсы памяти для контейнера

"256Mi"

speaker.resources.requests.cpu

Запрашиваемые ресурсы CPU для контейнера

"200m"

speaker.resources.limits.memory

Ограничение ресурсов памяти для контейнера

"512Mi"

speaker.resources.limits.cpu

Ограничение ресурсов CPU для контейнера

"500m"

speaker.nodeSelector

Селектор узлов для планирования pod

{}

speaker.tolerations

Toleration для размещения pod на узлах с ограничениями (taints)

- operator: Exists
  effect: NoSchedule
- operator: Exists
  effect: PreferNoSchedule

speaker.priorityClassName

Имя PriorityClass для pod

""

speaker.affinity

Настройки правила привязки (affinity и anti-affinity) pod к узлам

{}

speaker.runtimeClassName

Класс среды выполнения для speaker

""

speaker.podAnnotations

Аннотации для pod speaker

{}

speaker.labels

Метки, добавляемые ко всем создаваемым ресурсам

{}

speaker.livenessProbe.enabled

Включение проверки работоспособности для speaker

true

speaker.livenessProbe.port

Порт проверки работоспособности speaker

17472

speaker.livenessProbe.failureThreshold

Количество неудачных попыток до перевода контейнера в статус NotReady

3

speaker.livenessProbe.initialDelaySeconds

Задержка в секундах перед первой проверкой работоспособности

10

speaker.livenessProbe.periodSeconds

Интервал в секундах между проверками работоспособности

10

speaker.livenessProbe.successThreshold

Количество успешных попыток для подтверждения работоспособности

1

speaker.livenessProbe.timeoutSeconds

Тайм-аут ожидания проверки работоспособности

1

speaker.readinessProbe.enabled

Включение проверки готовности для speaker

true

speaker.readinessProbe.port

Порт проверки готовности speaker

17472

speaker.readinessProbe.failureThreshold

Количество неудачных попыток до перевода контейнера в статус NotReady

3

speaker.readinessProbe.initialDelaySeconds

Задержка в секундах перед первой проверкой готовности

10

speaker.readinessProbe.periodSeconds

Интервал в секундах между проверками готовности

10

speaker.readinessProbe.successThreshold

Количество успешных попыток для подтверждения готовности

1

speaker.readinessProbe.timeoutSeconds

Тайм-аут ожидания проверки готовности

1

speaker.startupProbe.enabled

Включение проверки запуска для speaker

true

speaker.startupProbe.failureThreshold

Количество неудачных попыток проверки запуска

30

speaker.startupProbe.periodSeconds

Интервал в секундах между проверками запуска

5

speaker.frr.enabled

Включение FRR-контейнера для BGP; устаревший режим, рекомендуется использовать frrk8s

false

speaker.frr.image.repository

Путь к Docker-образу FRR

'{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-frr/frr'

speaker.frr.image.tag

Тег образа контейнера

10.5.3

speaker.frr.image.pullPolicy

Политика загрузки образа

~

speaker.frr.metricsPort

Порт метрик FRR

9121

speaker.frr.resources

Ресурсы для FRR контейнера

{}

speaker.reloader.resources

Ресурсы для контейнера reloader

{}

speaker.frrMetrics.resources

Ресурсы для FRR метрик

{}

speaker.initContainers.cpFrrFiles.resources

Ресурсы для init-контейнера, копирующего файлы FRR

{}

speaker.initContainers.cpReloader.resources

Ресурсы для init-контейнера, копирующего reloader

{}

speaker.initContainers.cpMetrics.resources

Ресурсы для init-контейнера, копирующего бинарники метрик

{}

speaker.extraContainers

Дополнительные контейнеры в pod speaker

[]

crds – настройки установки и обновления Custom Resource Definitions (CRD)#

Параметр

Описание

Значение по умолчанию

crds.enabled

Включение установки CRD-ресурсов

true

crds.validationFailurePolicy

Политика обработки ошибок валидации

Fail

frrk8s – интеграция с frr-k8s#

Параметр

Описание

Значение по умолчанию

frrk8s.enabled

Включение FRR-K8s как BGP-бекенда; взаимно исключает FRR-режим

false

frrk8s.external

Использование внешнего экземпляра FRR-K8s вместо встроенного дочернего чарта

false

frrk8s.namespace

Пространство имен для внешнего FRR-K8s (применяется только при external: true)

""

frr-k8s – настройки дочернего чарта frr-k8s#

Параметр

Описание

Значение по умолчанию

frr-k8s.prometheus.serviceMonitor.enabled

Включение ServiceMonitor для метрик frr-k8s

false

frr-k8s.prometheus.serviceMonitor.metricRelabelings

Правила фильтрации и преобразования меток, применяемые к собранным метрикам.
Пример конфигурации:

- sourceLabels: [__name__]
  regex: "frrk8s_bgp_(.*)"
  targetLabel: "__name__"
  replacement: "metallb_bgp_$1"
- sourceLabels: [__name__]
  regex: "frrk8s_bfd_(.*)"
  targetLabel: "__name__"
  replacement: "metallb_bfd_$1"

[]

networkpolicies – настройки сетевых политик#

Параметр

Описание

Значение по умолчанию

networkpolicies.enabled

Включение установки NetworkPolicy для компонентов MetalLB в их пространстве имен

false

networkpolicies.defaultDeny

Включение установки базовой политики default deny в пространстве имен MetalLB

false

networkpolicies.apiPort

Порт Kubernetes API, используемый в сетевых политиках при необходимости переопределения внутреннего targetPort

6443