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 - определить список секретов для загрузки образов из приватных реестров#

Параметр

Описание

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

imagePullSecrets

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

[]

nameOverride - переопределить сокращенное имя релиза#

Параметр

Описание

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

nameOverride

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

""

fullnameOverride - переопределить полное имя ресурсов релиза#

Параметр

Описание

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

fullnameOverride

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

""

loadBalancerClass - определить класс LoadBalancer для сервисов MetalLB#

Параметр

Описание

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

loadBalancerClass

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

""

rbac - определить настройки RBAC для компонентов MetalLB#

Параметр

Описание

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

rbac.create

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

true

prometheus - определить настройки интеграции с 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

Пространство имен, в котором развернут 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.21.0

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

Оповещение для разорванного BGP-соединения

true

prometheus.prometheusRule.bgpSessionDown.labels.severity

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

critical

prometheus.prometheusRule.extraAlerts

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

[]

controller - определить настройки 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.15.3

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

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

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.15.3

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

Список tolerations для размещения pod speaker на узлах с taint’ами

- operator: Exists, effect: NoSchedule; - operator: Exists, effect: PreferNoSchedule

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

10.4.1

speaker.frr.image.pullPolicy

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

``

speaker.frr.metricsPort

Порт метрик FRR

7473

speaker.frr.resources

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

{}

speaker.reloader.resources

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

{}

speaker.frrMetrics.resources

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

{}

speaker.initContainers.cpFrrFiles.resources

Ограничения и запросы ресурсов для initContainer, копирующего файлы FRR

{}

speaker.initContainers.cpReloader.resources

Ограничения и запросы ресурсов для initContainer, копирующего reloader

{}

speaker.initContainers.cpMetrics.resources

Ограничения и запросы ресурсов для initContainer, копирующего бинарники метрик

{}

speaker.extraContainers

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

[]

crds - определить настройки установки CRD MetalLB#

Параметр

Описание

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

crds.enabled

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

true

crds.validationFailurePolicy

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

Fail

frrk8s - определить настройки интеграции с внешним backend frr-k8s#

Параметр

Описание

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

frrk8s.enabled

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

false

frrk8s.external

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

false

frrk8s.namespace

Пространство имен для FRR-K8s

""

networkpolicies - определить настройки сетевых политик для компонентов MetalLB#

Параметр

Описание

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

networkpolicies.enabled

Определяет, нужно ли устанавливать NetworkPolicy для компонентов MetalLB в их namespace

false

networkpolicies.defaultDeny

Определяет, нужно ли устанавливать базовую политику default deny в namespace MetalLB

false

networkpolicies.apiPort

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

6443