HAProxy Ingress#

HAProxy Ingress — это Ingress-контроллер, реализованный на базе программного балансировщика нагрузки HAProxy. Инструмент функционирует на уровнях L4 и L7 модели OSI. Он обеспечивает маршрутизацию внешнего трафика, терминацию SSL/TLS-соединений и балансировку нагрузки между сервисами внутри кластера.

Основные задачи и возможности
  • Организация единой точки входа: Консолидация ingress-трафика кластера на ограниченном пуле внешних IP-адресов или NodePort.

  • Обеспечение отказоустойчивости (HA): Обнаружение недоступных pod и автоматическое исключение их из пула балансировки.

  • Защита периметра: Ограничение интенсивности запросов и защита бэкенд-сервисов от перегрузки.

  • Оптимизация ресурсов: Снижение вычислительной нагрузки на целевые приложения за счет выноса задач шифрования и авторизации на уровень Ingress.

  • Маршрутизация L7: Распределение входящих запросов на основе доменных имен и путей.

  • Управление SSL/TLS: Терминация шифрования на стороне контроллера, поддержка SNI, интеграция с Cert-manager и динамическое обновление сертификатов.

  • Расширенная балансировка: Поддержка различных алгоритмов распределения трафика и механизмов сохранения сессий.

  • Нативная телеметрия: Экспорт детальных метрик производительности в формате Prometheus и поддержка логирования в формате Syslog.

Примечание

Инструмент HAProxy Ingress является частью Ingress-controller и устанавливается по умолчанию в процессе установки всего кластера DropApp.

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

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

podSecurityPolicy – политика безопасности pod#

Параметр

Описание

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

podSecurityPolicy.annotations

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

apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
seccomp.security.alpha.kubernetes.io/allowedProfileNames: runtime/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: runtime/default

{}

podSecurityPolicy.enabled

Включение политики безопасности pod

false

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

Параметр

Описание

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

rbac.create

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

true

namespace – пространство имен для установки ресурсов#

Параметр

Описание

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

namespace.create

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

false

serviceAccount – настройки сервисного аккаунта#

Параметр

Описание

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

serviceAccount.create

Включение создания ServiceAccount

true

serviceAccount.name

Имя ServiceAccount

~

aws – интеграция с AWS#

Параметр

Описание

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

aws.licenseConfigSecretName

Имя Secret, содержащего файлы лицензии AWS

""

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

Параметр

Описание

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

controller.name

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

controller

controller.image.repository

Имя репозитория Docker-образа контроллера

'{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-haproxy-ingress-controller/kubernetes-ingress'

controller.image.tag

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

3.2.13

controller.image.pullPolicy

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

IfNotPresent

controller.kind

Тип развертывания: Deployment или DaemonSet

Deployment

controller.replicaCount

количество реплик

2

controller.minReadySeconds

минимальное время готовности pod

0

controller.unprivileged

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

true

controller.allowPrivilegedPorts

Включение привязки к привилегированным портам от имени пользователя без административных полномочий; устанавливает sysctl net.ipv4.ip_unprivileged_port_start=0`

false

controller.enableRuntimeDefaultSeccompProfile

Включение ограничения системных вызовов контейнера через профиль Seccomp по умолчанию

true

controller.allowPrivilegeEscalation

Активация разрешения на эскалацию привилегий в контейнере

false

controller.initContainers

init-контейнеры для pod.
Пример конфигурации:

- name: sysctl
  image: "busybox:musl"
  command:
    - /bin/sh
    - -c
    - sysctl -w net.core.somaxconn=65536
  securityContext:
    privileged: true

[]

controller.sysctls

Параметры sysctls для pod.
Пример конфигурации:

"net.core.somaxconn": "8192"

{}

controller.terminationGracePeriodSeconds

тайм-аут корректного завершения работы pod

60

controller.imageCredentials.registry

Адрес приватного реестра образов

null

controller.imageCredentials.username

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

null

controller.imageCredentials.password

Пароль приватного реестра

null

controller.existingImagePullSecret

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

null

controller.containerPort.http

Порт контейнера для HTTP-трафика

8080

controller.containerPort.https

Порт контейнера для HTTPS-трафика

8443

controller.containerPort.stat

Порт контейнера для статистики и метрик

1024

controller.containerPort.admin

Порт контейнера для административных эндпоинтов

6060

controller.prometheus.enabled

Включение эндпоинта метрик Prometheus

true

controller.pprof.enabled

Включение pprof-эндпоинтов отладки

true

controller.quic.announcePort

Порт, объявляемый клиентам в заголовках Alt-Svc; при пустом значении выводится автоматически из топологии развертывания

""

controller.livenessProbe.httpGet.path

Путь HTTP-проверки работоспособности

/healthz

controller.livenessProbe.httpGet.port

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

1042

controller.livenessProbe.httpGet.scheme

Схема HTTP-проверки работоспособности

HTTP

controller.livenessProbe.initialDelaySeconds

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

10

controller.livenessProbe.periodSeconds

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

10

controller.livenessProbe.timeoutSeconds

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

1

controller.livenessProbe.successThreshold

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

1

controller.livenessProbe.failureThreshold

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

3

controller.readinessProbe.httpGet.path

Путь HTTP-проверки готовности

/healthz

controller.readinessProbe.httpGet.port

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

1042

controller.readinessProbe.httpGet.scheme

Схема HTTP-проверки готовности

HTTP

controller.readinessProbe.initialDelaySeconds

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

10

controller.readinessProbe.periodSeconds

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

10

controller.readinessProbe.timeoutSeconds

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

1

controller.readinessProbe.successThreshold

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

1

controller.readinessProbe.failureThreshold

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

3

controller.startupProbe.httpGet.path

Путь HTTP-проверки запуска

/healthz

controller.startupProbe.httpGet.port

Порт HTTP-проверки запуска

1042

controller.startupProbe.httpGet.scheme

Схема HTTP-проверки запуска

HTTP

controller.startupProbe.initialDelaySeconds

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

10

controller.startupProbe.periodSeconds

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

5

controller.startupProbe.timeoutSeconds

Тайм-аут проверки запуска в секундах

1

controller.startupProbe.successThreshold

Количество успешных проверок запуска, необходимое для перевода контейнера в состояние «запущен»

1

controller.startupProbe.failureThreshold

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

30

controller.ingressClassResource.name

Имя ресурса IngressClass

haproxy

controller.ingressClassResource.default

Установка IngressClass как класс по умолчанию

false

controller.ingressClassResource.parameters

Параметры ресурса IngressClass

{}

controller.ingressClass

Класс ingress для выбора ingress-ресурсов в средах с несколькими контроллерами

haproxy

controller.kubernetesGateway.enabled

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

false

controller.kubernetesGateway.gatewayControllerName

Имя контроллера Gateway API

haproxy.org/gateway-controller

controller.extraLabels

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

{}

controller.annotations

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

{}

controller.podLabels

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

{}

controller.podAnnotations

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

{}

controller.enableServiceLinks

Включение переменных окружения для обнаружения сервисов

true

controller.defaultTLSSecret.enabled

Включение секретa TLS по умолчанию; при пустом значении Secret контроллер использует автоматически сгенерированный

true

controller.defaultTLSSecret.secretNamespace

Пространство имен секрета TLS по умолчанию

'{{ include "kubernetes-ingress.namespace" . }}'

controller.defaultTLSSecret.secret

Имя Secret с сертификатом TLS; при пустом значении генерируется автоматически

null

controller.resources.requests.cpu

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

250m

controller.resources.requests.memory

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

400Mi

controller.autoscaling.enabled

Включение горизонтального автомасштабирования

false

controller.autoscaling.minReplicas

Минимальное количество реплик при автоматическом масштабировании

2

controller.autoscaling.maxReplicas

Максимальное количество реплик при автоматическом масштабировании

20

controller.autoscaling.targetCPUUtilizationPercentage

Целевой процент использования CPU для масштабирования

80

controller.autoscaling.annotations

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

annotationKey: value

{}

controller.keda.enabled

Включение автомасштабирования на основе событий Kubernetes через KEDA 2.x; взаимно исключает HPA

false

controller.keda.minReplicas

Минимальное количество реплик при автоматическом масштабировании

2

controller.keda.maxReplicas

Максимальное количество реплик при автоматическом масштабировании

20

controller.keda.pollingInterval

Интервал опроса в секундах

30

controller.keda.cooldownPeriod

Период охлаждения в секундах

300

controller.keda.restoreToOriginalReplicaCount

Восстановление исходного количества реплик после масштабирования

false

controller.keda.scaledObject.annotations

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

{}

controller.keda.horizontalPodAutoscalerConfig

Настройки HorizontalPodAutoscaler.
Пример конфигурации:

name: ""
behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15

{}

controller.keda.triggers

Триггеры масштабирования KEDA.
Пример конфигурации:

- type: prometheus
  metadata:
    serverAddress: http://<prometheus-host>:9090
    metricName: haproxy_process_idle_time_percent
    threshold: '50'
    query: avg(100-avg_over_time(haproxy_process_idle_time_percent{container="kubernetes-ingress-controller",service="mytest-kubernetes-ingress"}[2m]))

[]

controller.PodDisruptionBudget.enable

ограничение одновременной недоступности pod

false

controller.nodeSelector

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

{}

controller.tolerations

Toleration для размещения pod на узлах с ограничениями (taints).
Пример конфигурации:

- key: "key"
  operator: "Equal|Exists"
  value: "value"
  effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"

[]

controller.affinity

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

{}

controller.topologySpreadConstraints

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

- maxSkew: 1
  topologyKey: kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule
  labelSelector:
    matchLabels:
      app.kubernetes.io/name: kubernetes-ingress
      app.kubernetes.io/instance: kubernetes-ingress

[]

controller.dnsConfig

Пользовательская конфигурация DNS для pod

{}

controller.dnsPolicy

Политика разрешения DNS для pod; установите ClusterFirstWithHostNet при использовании useHostNetwork: true

ClusterFirst

controller.extraArgs

Дополнительные аргументы командной строки для контроллера.
Пример конфигурации:

- --namespace-whitelist=default
- --namespace-whitelist=namespace1
- --namespace-blacklist=namespace2
- --disable-ipv4
- --disable-ipv6
- --disable-http
- --disable-https
- --disable-quic
- --sync-period=10s

[]

controller.config

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

timeout-connect: "250ms"
servers-increment: "10"
servers-increment-max-disabled: "10"
rate-limit: "ON"
rate-limit-expire: "1m"
rate-limit-interval: "10s"
rate-limit-size: "100k"

{}

controller.configAnnotations

Аннотации для пользовательской ConfigMap контроллера.
Пример конфигурации:

annotationKey: value

{}

controller.auxiliaryConfig

Вспомогательная конфигурация HAProxy; создает dedicated ConfigMap и монтирует ее по пути /etc/haproxy/haproxy-aux.cfg.
Пример конфигурации:

cache mycache
    total-max-size 4095
    max-object-size 10000
    max-age 30

""

controller.logging.level

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

info

controller.logging.traffic

Настройки логов трафика HAProxy.
Пример конфигурации:

address: "stdout"
format: "raw"
facility: "daemon"

{}

controller.publishService.enabled

Отображение адресов эндпоинтов сервиса в статусе всех ingress-объектов

true

controller.publishService.pathOverride

Переопределение пути к публикуемому сервису в формате <namespace>/<service_name>

""

controller.service.enabled

Активация создания Service

true

controller.service.type

Тип Service

LoadBalancer

controller.service.annotations

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

{}

controller.service.labels

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

{}

controller.service.healthCheckNodePort

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

0

controller.service.nodePorts

NodePort-порты для http, https и stat.
Пример конфигурации:

http: 31080
https: 31443
stat: 31024
admin: 31060

{}

controller.service.ports.http

Порт service для HTTP-трафика

80

controller.service.ports.https

Порт service для HTTPS-трафика

443

controller.service.ports.stat

Порт service для статистики

1024

controller.service.ports.admin

Порт service для административных эндпоинтов

6060

controller.service.enablePorts.http

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

true

controller.service.enablePorts.https

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

true

controller.service.enablePorts.quic

Включение порта quic (HTTP/3)

true

controller.service.enablePorts.stat

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

true

controller.service.enablePorts.admin

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

true

controller.service.targetPorts.http

Целевой порт для http

http

controller.service.targetPorts.https

Целевой порт для https

https

controller.service.targetPorts.quic

Целевой порт для quic

quic

controller.service.targetPorts.stat

Целевой порт для stat

stat

controller.service.targetPorts.admin

Целевой порт для admin

admin

controller.service.tcpPorts

Дополнительные tcp-порты для экспорта.
Пример конфигурации:

- name: http-alt
  port: 8080
  targetPort: http-alt
  nodePort: 32080

[]

controller.service.externalIPs

Внешние IP-адреса service

[]

controller.service.loadBalancerIP

IP-адрес балансировщика нагрузки

""

controller.service.loadBalancerSourceRanges

IP-диапазоны источников, разрешенных для доступа к балансировщику нагрузки

[]

controller.service.loadBalancerClass

Класс реализации балансировщика нагрузки

null

controller.service.metrics.type

Тип Service для метрик

ClusterIP

controller.service.metrics.annotations

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

{}

controller.service.metrics.labels

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

{}

controller.deployment.useHostNetwork

Использование сетевой модели хоста для Deployment

false

controller.deployment.useHostPort

Использование портов хоста для Deployment

false

controller.deployment.hostIP

IP-адрес хоста для привязки портов Deployment

null

controller.deployment.hostPorts.http

Порт хоста для HTTP в Deployment

80

controller.deployment.hostPorts.https

Порт хоста для HTTPS в Deployment

443

controller.deployment.hostPorts.stat

Порт хоста для статистики в Deployment

1024

controller.daemonset.useHostNetwork

Использование сетевой модели хоста для DaemonSet

false

controller.daemonset.useHostPort

Использование портов хоста для DaemonSet

false

controller.daemonset.hostIP

IP-адрес хоста для привязки портов DaemonSet

null

controller.daemonset.hostPorts.http

Порт хоста для HTTP в DaemonSet

80

controller.daemonset.hostPorts.https

Порт хоста для HTTPS в DaemonSet

443

controller.daemonset.hostPorts.stat

Порт хоста для статистики в DaemonSet

1024

controller.strategy.type

Тип стратегии обновления Deployment или DaemonSet

RollingUpdate

controller.priorityClassName

имя класса приоритета pod

""

controller.runtimeClassName

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

""

controller.lifecycle

хуки жизненного цикла контейнера.
Пример конфигурации:

preStop:
  exec:
    command: ["/bin/sh", "-c", "kill -USR1 $(pidof haproxy); while killall -0 haproxy; do sleep 1; done"]

{}

controller.extraEnvs

переменные окружения контейнера.
Пример конфигурации:

- name: TZ
  value: "Etc/UTC"

[]

controller.extraEnvFrom

Источники переменных окружения (Secret или ConfigMap) для pod.
Пример конфигурации:

- configMapRef:
    name: ha-env-config

[]

controller.extraContainers

Дополнительные контейнеры в pod контроллера.
Пример конфигурации:

- name: sidecar
  image: alpine
  command: ["/bin/sh"]
  args: ["-c", "while true; do date; sleep 5;done"]

[]

controller.extraVolumeMounts

Список дополнительных точек монтирования томов (VolumeMounts) в контейнере.
Пример конфигурации:

- name: etc-haproxy
  mountPath: /etc/haproxy
- name: tmp
  mountPath: /tmp
- name: var-state-haproxy
  mountPath: /var/state/haproxy

[]

controller.extraVolumes

Дополнительные тома (Volume) для pod.
Пример конфигурации:

- name: etc-haproxy
  emptyDir: {}
- name: tmp
  emptyDir: {}
- name: var-state-haproxy
  emptyDir: {}

[]

controller.serviceMonitor.enabled

Активация создания ServiceMonitor для Prometheus Operator

true

controller.serviceMonitor.extraLabels

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

{}

controller.serviceMonitor.endpoints

Эндпоинты ServiceMonitor

- port: stat
  path: /metrics
  scheme: http
  interval: 30s

controller.podMonitor.enabled

Включение PodMonitor для сбора метрик Prometheus Operator; взаимно исключает ServiceMonitor

false

controller.podMonitor.extraLabels

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

{}

controller.podMonitor.endpoints

Эндпоинты PodMonitor

- port: stat
  path: /metrics
  scheme: http
  interval: 30s
  params:
    scope:
    - global
    - frontend
    - backend

controller.sync.mode

Режим синхронизации контроллера с Kubernetes: default или fetch (периодический запрос)

default

controller.sync.fetchParams.source

Источник данных для периодического запроса: proxy или k8s (обязателен при режиме fetch)

k8s

controller.sync.proxyParams.replicaCount

Количество реплик прокси (обязательно при источнике proxy)

3

controller.sync.proxyParams.proxySvcLabelSelector

Селектор меток service прокси (обязательно при источнике proxy)

run:haproxy-ingress-proxy

crdjob – настройки CRD job#

Параметр

Описание

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

crdjob.podAnnotations

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

key: value

{}

crdjob.ttlSecondsAfterFinished

Время жизни завершенной job в секундах перед автоматическим удалением

600

crdjob.nodeSelector

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

{}

crdjob.tolerations

Toleration для размещения pod на узлах с ограничениями (taints).
Пример конфигурации:

- key: "key"
  operator: "Equal|Exists"
  value: "value"
  effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"

[]

crdjob.affinity

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

{}

crdjob.resources.requests.cpu

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

250m

crdjob.resources.requests.memory

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

400Mi

extraObjects – дополнительные объекты Helm-чарта#

Параметр

Описание

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

extraObjects

Добавление дополнительных динамических объектов в Helm-чарте.
Пример конфигурации:

- apiVersion: v1
  kind: ConfigMap
  metadata:
    name: extra-conf-1
  data:
    extra.conf: |
      example_config_1

[]