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#

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

imagePullSecrets - секреты для доступа к приватным реестрам образов#

Параметр

Описание

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

imagePullSecrets

Массив секретов для аутентификации в приватных реестрах образов

пустой список

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

Параметр

Описание

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

nameOverride

Переопределение имени для ресурсов Kubernetes

""

fullnameOverride - полное переопределение имени ресурсов#

Параметр

Описание

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

fullnameOverride

Полное переопределение имени для всех ресурсов

""

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

Параметр

Описание

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

loadBalancerClass

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

""

rbac - настройки контроля доступа на основе ролей#

Параметр

Описание

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

rbac.create

Создание RBAC-правил для MetalLB-компонентов

true

prometheus - настройки мониторинга и метрик#

Параметр

Описание

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

prometheus.scrapeAnnotations

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

false

prometheus.metricsPort

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

7472

prometheus.speakerMetricsTLSSecret

Имя секрета для TLS-защиты метрик speaker

""

prometheus.controllerMetricsTLSSecret

Имя секрета для TLS-защиты метрик контроллера

""

prometheus.rbacPrometheus

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

true

prometheus.serviceAccount

Учетная запись сервиса для Prometheus

""

prometheus.namespace

Namespace, где развернут Prometheus

dapp-lb

prometheus.rbacProxy.repository

Образ для kube-rbac-proxy-контейнера

{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-kube-rbac-proxy/kube-rbac-proxy

prometheus.rbacProxy.tag

Тег образа kube-rbac-proxy

v0.18.2

prometheus.rbacProxy.pullPolicy

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

~

prometheus.podMonitor.enabled

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

false

prometheus.podMonitor.additionalLabels

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

{}

prometheus.podMonitor.annotations

Аннотации для PodMonitor

{}

prometheus.podMonitor.jobLabel

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

app.kubernetes.io/name

prometheus.podMonitor.interval

Интервал сбора метрик

~

prometheus.podMonitor.metricRelabelings

Настройки переименования метрик

[]

prometheus.podMonitor.relabelings

Настройки переименования целей

[]

prometheus.serviceMonitor.enabled

Включение ServiceMonitor как альтернативы PodMonitor

false

prometheus.serviceMonitor.speaker.additionalLabels

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

{}

prometheus.serviceMonitor.speaker.annotations

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

{}

prometheus.serviceMonitor.speaker.tlsConfig.insecureSkipVerify

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

true

prometheus.serviceMonitor.controller.additionalLabels

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

{}

prometheus.serviceMonitor.controller.annotations

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

{}

prometheus.serviceMonitor.controller.tlsConfig.insecureSkipVerify

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

true

prometheus.serviceMonitor.jobLabel

Метка задания для ServiceMonitor

app.kubernetes.io/name

prometheus.serviceMonitor.interval

Интервал сбора метрик для ServiceMonitor

~

prometheus.serviceMonitor.metricRelabelings

Настройки переименования метрик для ServiceMonitor

[]

prometheus.serviceMonitor.relabelings

Настройки переименования целей для ServiceMonitor

[]

prometheus.prometheusRule.enabled

Включение оповещений Prometheus

false

prometheus.prometheusRule.additionalLabels

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

{}

prometheus.prometheusRule.annotations

Аннотации для PrometheusRule

{}

prometheus.prometheusRule.staleConfig.enabled

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

true

prometheus.prometheusRule.staleConfig.labels.severity

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

warning

prometheus.prometheusRule.configNotLoaded.enabled

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

true

prometheus.prometheusRule.configNotLoaded.labels.severity

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

warning

prometheus.prometheusRule.addressPoolExhausted.enabled

Оповещение для исчерпанного пула адресов

true

prometheus.prometheusRule.addressPoolExhausted.labels.severity

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

critical

prometheus.prometheusRule.addressPoolUsage.enabled

Оповещение для использования пула адресов

true

prometheus.prometheusRule.bgpSessionDown.enabled

Оповещение для разорванного 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

Репозиторий образа контроллера

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

controller.image.tag

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

v0.14.9

controller.image.pullPolicy

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

~

controller.strategy.type

Стратегия обновления развертывания

RollingUpdate

controller.serviceAccount.create

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

true

controller.serviceAccount.name

Имя ServiceAccount контроллера

""

controller.serviceAccount.annotations

Аннотации для ServiceAccount

{}

controller.securityContext.runAsNonRoot

Запуск от имени непривилегированного пользователя

true

controller.securityContext.runAsUser

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

65534

controller.securityContext.fsGroup

Группа файловой системы

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

Селектор узлов для размещения контроллера

{}

controller.tolerations

Tolerations для контроллера

[]

controller.priorityClassName

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

""

controller.runtimeClassName

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

""

controller.affinity

Правила affinity для контроллера

{}

controller.podAnnotations

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

{}

controller.labels

Метки для ресурсов контроллера

{}

controller.livenessProbe.enabled

Включение liveness probe

true

controller.livenessProbe.failureThreshold

Порог неудачных проверок liveness

3

controller.livenessProbe.initialDelaySeconds

Начальная задержка liveness probe

10

controller.livenessProbe.periodSeconds

Период проверки liveness

10

controller.livenessProbe.successThreshold

Порог успешных проверок liveness

1

controller.livenessProbe.timeoutSeconds

Время ожидания liveness probe

1

controller.readinessProbe.enabled

Включение readiness probe

true

controller.readinessProbe.failureThreshold

Порог неудачных проверок readiness

3

controller.readinessProbe.initialDelaySeconds

Начальная задержка readiness probe

10

controller.readinessProbe.periodSeconds

Период проверки readiness

10

controller.readinessProbe.successThreshold

Порог успешных проверок readiness

1

controller.readinessProbe.timeoutSeconds

Время ожидания readiness probe

1

controller.tlsMinVersion

Минимальная версия TLS

VersionTLS12

controller.tlsCipherSuites

Набор шифров TLS

""

controller.extraContainers

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

[]

speaker - настройки speaker компонента MetalLB#

Параметр

Описание

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

speaker.enabled

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

true

speaker.logLevel

Уровень логирования speaker

info

speaker.tolerateMaster

Разрешение размещения на master nodes

true

speaker.memberlist.enabled

Включение memberlist для обнаружения узлов

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.image.repository

Репозиторий образа speaker

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

speaker.image.tag

Тег образа speaker

v0.14.9

speaker.image.pullPolicy

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

~

speaker.updateStrategy.type

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

RollingUpdate

speaker.serviceAccount.create

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

true

speaker.serviceAccount.name

Имя ServiceAccount для speaker

""

speaker.serviceAccount.annotations

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

{}

speaker.securityContext

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

{}

speaker.resources.requests.memory

Запрос памяти для speaker

256Mi

speaker.resources.requests.cpu

Запрос CPU для speaker

200m

speaker.resources.limits.memory

Лимит памяти для speaker

512Mi

speaker.resources.limits.cpu

Лимит CPU для speaker

500m

speaker.nodeSelector

Селектор узлов для размещения speaker

{}

speaker.tolerations.key

Ключ toleration для узлов ingress

dedicated

speaker.tolerations.operator

Оператор toleration

Equal

speaker.tolerations.value

Значение toleration

ingress

speaker.tolerations.effect

Эффект toleration

NoSchedule

speaker.priorityClassName

Класс приоритета для pod speaker

""

speaker.affinity

Правила affinity для speaker

{}

speaker.runtimeClassName

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

""

speaker.podAnnotations

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

{}

speaker.labels

Метки для ресурсов speaker

{}

speaker.livenessProbe.enabled

Включение liveness probe для speaker

true

speaker.livenessProbe.failureThreshold

Порог неудачных проверок liveness

3

speaker.livenessProbe.initialDelaySeconds

Начальная задержка liveness probe

10

speaker.livenessProbe.periodSeconds

Период проверки liveness

10

speaker.livenessProbe.successThreshold

Порог успешных проверок liveness

1

speaker.livenessProbe.timeoutSeconds

Время ожидания liveness probe

1

speaker.readinessProbe.enabled

Включение readiness probe для speaker

true

speaker.readinessProbe.failureThreshold

Порог неудачных проверок readiness

3

speaker.readinessProbe.initialDelaySeconds

Начальная задержка readiness probe

10

speaker.readinessProbe.periodSeconds

Период проверки readiness

10

speaker.readinessProbe.successThreshold

Порог успешных проверок readiness

1

speaker.readinessProbe.timeoutSeconds

Время ожидания readiness probe

1

speaker.startupProbe.enabled

Включение startup probe для speaker

true

speaker.startupProbe.failureThreshold

Порог неудачных проверок startup

30

speaker.startupProbe.periodSeconds

Период проверки startup

5

speaker.frr.enabled

Включение FRR-контейнера для BGP

false

speaker.frr.image.repository

Репозиторий образа FRR

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

speaker.frr.image.tag

Тег образа FRR

09.01.2000

speaker.frr.image.pullPolicy

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

~

speaker.frr.metricsPort

Порт метрик FRR

7473

speaker.frr.resources

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

{}

speaker.frr.reloader.resources

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

{}

speaker.frr.frrMetrics.resources

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

{}

speaker.extraContainers

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

[]

crds - настройки Custom Resource Definitions#

Параметр

Описание

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

crds.enabled

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

true

crds.validationFailurePolicy

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

Fail

frrk8s - настройки интеграции с FRR-K8s#

Параметр

Описание

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

frrk8s.enabled

Включение FRR-K8s как BGP-бекенда

false

frrk8s.external

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

false

frrk8s.namespace

Namespace для FRR-K8s

""