• Русский
  • Настройка ALB

    WARNING

    ALB устарел. Пожалуйста, используйте вместо него ingress-nginx-operator или envoy-gateway.

    ALB

    ALB — это кастомный ресурс, представляющий балансировщик нагрузки. alb-operator, который по умолчанию встроен во все кластеры, отслеживает операции создания/обновления/удаления ресурсов ALB и создает соответствующие деплойменты и сервисы в ответ.

    Для каждого ALB соответствующий Deployment отслеживает все Frontends и Rules, прикрепленные к этому ALB, и маршрутизирует запросы к бэкендам на основе этих конфигураций.

    Предварительные требования

    Высокая доступность Load Balancer требует VIP. Пожалуйста, обратитесь к разделу Настройка VIP.

    Настройка ALB

    Конфигурация ALB состоит из трех частей.

    # test-alb.yaml
    apiVersion: crd.alauda.io/v2beta1
    kind: ALB2
    metadata:
      name: alb-demo
      namespace: cpaas-system
    spec:
      address: 192.168.66.215
      config:
        vip:
          enableLbSvc: false
          lbSvcAnnotations: {}
        networkMode: host
        nodeSelector:
          cpu-model.node.kubevirt.io/Nehalem: 'true'
        replicas: 1
        resources:
          alb:
            limits:
              cpu: 200m
              memory: 256Mi
            requests:
              cpu: 200m
              memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
          requests:
            cpu: 200m
            memory: 256Mi
        projects:
          - ALL_ALL
      type: nginx

    Конфигурация, связанная с ресурсами

    Поля, связанные с ресурсами, описывают конфигурацию деплоймента для alb.

    ПолеТипОписание
    .spec.config.nodeSelectormap[string]stringселектор узлов для alb
    .spec.config.replicasint, необязательно, по умолчанию 3количество реплик для alb
    .spec.config.resources.limitsk8s container-resource, необязательнолимиты контейнера nginx alb
    .spec.config.resources.requestsk8s container-resource, необязательнозапросы контейнера nginx alb
    .spec.config.resources.alb.limitsk8s container-resource, необязательнолимиты контейнера alb
    .spec.config.resources.alb.requestsk8s container-resource, необязательнозапросы контейнера alb
    .spec.config.antiAffinityKeystring, необязательно, по умолчанию localk8s antiAffinityKey

    Конфигурация сети

    Поля сети описывают, как получить доступ к ALB. Например, в режиме host alb использует hostnetwork, и вы можете получить доступ к ALB по IP узла.

    ПолеТипОписание
    .spec.config.networkModestring: host или container, необязательно, по умолчанию hostВ режиме container оператор создает LoadBalancer Service и использует его адрес как адрес ALB.
    .spec.addressstring, обязательновы можете вручную указать адрес alb
    .spec.config.vip.enableLbSvcbool, необязательноАвтоматически true в режиме container.
    .spec.config.vip.lbSvcAnnotationsmap[string]string, необязательноДополнительные аннотации для LoadBalancer Service.

    Конфигурация проекта

    ПолеТип
    .spec.config.projects[]string, обязательно
    .spec.config.portProjectsstring, необязательно
    .spec.config.enablePortProjectbool, необязательно

    Добавление ALB в проект означает:

    1. В веб-интерфейсе только пользователи данного проекта могут найти и настроить этот ALB.
    2. Этот ALB будет обрабатывать ingress ресурсы, принадлежащие этому проекту. Пожалуйста, обратитесь к разделу ingress-sync.
    3. В веб-интерфейсе правила, созданные в проекте X, не будут видны и не могут быть настроены в проекте Y.

    Если вы включите портовый проект и назначите диапазон портов проекту, это означает:

    1. Вы не сможете создавать порты, не принадлежащие диапазону портов, назначенному проекту.

    Дополнительная настройка

    Существуют некоторые глобальные настройки, которые можно изменить в alb cr.

    Операции с ALB

    Создание

    Через веб-консоль

    Некоторые общие настройки доступны в веб-интерфейсе. Следуйте этим шагам для создания балансировщика нагрузки:

    1. Перейдите в раздел Administrator.
    2. В левой боковой панели нажмите Network Management > Load Balancer.
    3. Нажмите Create Load Balancer.

    Каждое поле ввода в веб-интерфейсе соответствует полю CR:

    ПараметрОписание
    Assigned Address.spec.address
    Allocated ByInstance означает режим проекта, и вы можете выбрать проект ниже, port — режим порт-проекта, после создания alb можно назначить диапазон портов
    Через CLI
    kubectl apply -f test-alb.yaml -n cpaas-system

    Обновление

    Через веб-консоль
    NOTE

    Обновление балансировщика нагрузки приведет к прерыванию сервиса на 3-5 минут. Пожалуйста, выберите подходящее время для этой операции!

    1. Войдите в Administrator.

    2. В левой навигационной панели нажмите Network Management > Load Balancer.

    3. Нажмите ⋮ > Update.

    4. Обновите конфигурацию сети и ресурсов по необходимости.

      • Пожалуйста, разумно задавайте спецификации в соответствии с бизнес-требованиями. Также можно обратиться к соответствующему руководству Как правильно выделять CPU и память.

      • Внутренний роутинг поддерживает только обновление из состояния Disabled в состояние Enabled.

    5. Нажмите Update.

    Удаление

    Через веб-консоль
    NOTE

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

    1. Войдите в Administrator.

    2. В левой навигационной панели нажмите Network Management > Load Balancer.

    3. Нажмите ⋮ > Delete и подтвердите.

    Через CLI
    kubectl delete alb2 alb-demo -n cpaas-system

    Frontend

    Frontend — это кастомный ресурс, который определяет порт слушателя и протокол для ALB. Поддерживаемые протоколы: L7 (http|https|grpc|grpcs) и L4 (tcp|udp).

    • В L4 Proxy используйте frontend для прямой настройки backend-сервиса.
    • В L7 Proxy используйте frontend для настройки портов слушателя и rule для настройки backend-сервиса.

    Если необходимо добавить HTTPS-порт слушателя, следует также обратиться к администратору для назначения TLS-сертификата текущему проекту для шифрования.

    Предварительные требования

    Сначала создайте ALB.

    Настройка Frontend

    # alb-frontend-demo.yaml
    apiVersion: crd.alauda.io/v1
    kind: Frontend
    metadata:
      labels:
        alb2.cpaas.io/name: alb-demo
      name: alb-demo-00080
      namespace: cpaas-system
    spec:
      port: 80
      protocol: http
      certificate_name: ''
      backendProtocol: 'http'
      serviceGroup:
        session_affinity_policy: ''
        services:
          - name: hello-world
            namespace: default
            port: 80
            weight: 100
    1. Метка alb: обязательна, указывает экземпляр ALB, к которому принадлежит этот Frontend.

    2. Имя frontend: формат $alb_name-$port.

    3. port: порт, на котором слушает.

    4. protocol: протокол, используемый этим портом.

      • L7 протоколы https|http|grpcs|grpc и L4 протоколы tcp|udp.
      • При выборе HTTPS необходимо добавить сертификат; добавление сертификата для протокола gRPC необязательно.
      • При выборе протокола gRPC протокол бэкенда по умолчанию gRPC, который не поддерживает сессионную привязку. Если для gRPC протокола установлен сертификат, балансировщик нагрузки снимет сертификат gRPC и перенаправит незашифрованный трафик gRPC на backend-сервис.
      • При использовании кластера Google GKE балансировщик нагрузки с одинаковым типом контейнерной сети не может одновременно иметь протоколы слушателя TCP и UDP.
    5. certificate_name: для протоколов grpcs и https, используемый сертификат по умолчанию, формат $secret_ns/$secret_name.

    6. backendProtocol: протокол, используемый backend-сервисом.

    7. По умолчанию serviceGroup:

      • L4 proxy: обязательно. ALB напрямую перенаправляет трафик в группу сервисов по умолчанию.
      • L7 proxy: необязательно. ALB сначала сопоставляет правила (Rules) на этом Frontend; если совпадений нет, используется группа сервисов по умолчанию.
    8. session_affinity_policy

    Операции с Frontend

    Создание

    Через веб-консоль

    1. Перейдите в Container Platform.

    2. В левой навигационной панели нажмите Network > Load Balancing.

    3. Нажмите на имя балансировщика нагрузки, чтобы перейти на страницу деталей.

    4. Нажмите Add Port.

    Каждое поле ввода в веб-интерфейсе соответствует полю CR

    ПараметрОписание
    Session Affinity.spec.serviceGroup.session_affinity_policy
    Через CLI
    kubectl apply -f alb-frontend-demo.yaml -n cpaas-system

    Последующие действия

    Для трафика с портов HTTP, gRPC и HTTPS, помимо группы внутреннего роутинга по умолчанию, вы можете задать более разнообразные правила сопоставления backend-сервисов rules. Балансировщик нагрузки сначала сопоставит соответствующий backend-сервис согласно заданным правилам; если совпадение не найдено, он перейдет к backend-сервисам, соответствующим вышеупомянутой группе внутреннего роутинга.

    Связанные операции

    Вы можете нажать на значок ⋮ справа на странице списка или нажать Actions в правом верхнем углу страницы деталей, чтобы при необходимости обновить маршрут по умолчанию или удалить порт слушателя.

    NOTE

    Если метод выделения ресурсов балансировщика нагрузки — Port, удалять связанные порты слушателей могут только администраторы в режиме Administrator.

    Rule

    Rule — это кастомный ресурс (CR), который определяет, как входящие запросы сопоставляются и обрабатываются ALB.

    Ingress, обрабатываемые ALB, могут быть автоматически преобразованы в правила.

    Предварительные требования

    Ниже приведен демонстрационный rule для быстрого ознакомления с использованием правил.

    NOTE

    rule должен быть прикреплен к frontend и alb через метки.

    apiVersion: crd.alauda.io/v1
    kind: Rule
    metadata:
      labels:
        alb2.cpaas.io/frontend: alb-demo-00080
        alb2.cpaas.io/name: alb-demo
      name: alb-demo-00080-test
      namespace: cpaas-system
    spec:
      backendProtocol: 'https'
      certificate_name: 'a/b'
      dslx:
        - type: URL
          values:
            - - STARTS_WITH
              - /
      priority: 4
      serviceGroup:
        services:
          - name: hello-world
            namespace: default
            port: 80
            weight: 100
    1. Обязательно, указывает Frontend, к которому принадлежит это правило.
    2. Обязательно, указывает ALB, к которому принадлежит это правило.
    3. backendProtocol
    4. certificate_name
    5. dslx
    6. Чем меньше число, тем выше приоритет.
    7. serviceGroup

    Сопоставление запроса с dslx и приоритетом

    dslx

    DSLX — это предметно-ориентированный язык, используемый для описания критериев сопоставления. Например, приведенное ниже правило сопоставляет запрос, который удовлетворяет всем следующим условиям:

    • url начинается с /app-a или /app-b
    • метод — post
    • параметр url с ключом group равен vip
    • host заканчивается на *.app.com
    • заголовок LOCATION равен east-1 или east-2
    • есть cookie с именем uid
    • исходные IP находятся в диапазоне 1.1.1.1-1.1.1.100
    dslx:
      - type: METHOD
        values:
          - - EQ
            - POST
      - type: URL
        values:
          - - STARTS_WITH
            - /app-a
          - - STARTS_WITH
            - /app-b
      - type: PARAM
        key: group
        values:
          - - EQ
            - vip
      - type: HOST
        values:
          - - ENDS_WITH
            - .app.com
      - type: HEADER
        key: LOCATION
        values:
          - - IN
            - east-1
            - east-2
      - type: COOKIE
        key: uid
        values:
          - - EXIST
      - type: SRC_IP
        values:
          - - RANGE
            - '1.1.1.1'
            - '1.1.1.100'

    Приоритет

    Приоритет — это целое число от 0 до 10, где меньшие значения означают более высокий приоритет. Для настройки приоритета правила в ingress можно использовать следующий формат аннотации:

    # alb.cpaas.io/ingress-rule-priority-$rule_index-$path_index
    alb.cpaas.io/ingress-rule-priority-0-0: '10'

    Для правил достаточно задать приоритет напрямую в .spec.priority целочисленным значением.

    Действия

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

    ФункцияОписаниеСсылка
    TimeoutНастройка таймаутов для запросов.timeout
    RedirectПеренаправление входящих запросов на указанный URL.redirect
    CORSВключение Cross-Origin Resource Sharing (CORS) для приложения.cors
    Header ModificationПозволяет изменять заголовки запросов или ответов.header modification
    URL RewriteПерезаписывает URL входящих запросов перед их пересылкой.url-rewrite
    WAFИнтеграция Web Application Firewall (WAF) для повышения безопасности.waf
    OTELВключение OpenTelemetry (OTEL) для распределенного трассирования и мониторинга.otel
    KeepaliveВключение или отключение функции keepalive для приложения.keepalive

    Backend

    backend protocol

    По умолчанию протокол backend установлен в HTTP. Если вы хотите использовать TLS повторное шифрование, можно настроить HTTPS.

    Группа сервисов и политика сессионной привязки

    В правиле можно настроить один или несколько сервисов.

    По умолчанию ALB использует алгоритм round-robin (RR) для распределения запросов между backend-сервисами. Однако вы можете назначать веса отдельным сервисам или выбрать другой алгоритм балансировки нагрузки.

    Подробнее смотрите в разделе Балансировка нагрузки.

    Операции с Rule

    Через веб-консоль

    1. Перейдите в Container Platform.
    2. В левой навигационной панели нажмите Network > Load Balancing.
    3. Нажмите на имя балансировщика нагрузки.
    4. Выберите имя порта слушателя.
    5. Нажмите Add Rule.
    6. Настройте соответствующие параметры согласно описаниям ниже.
    7. Нажмите Add.

    Каждое поле ввода в веб-интерфейсе соответствует полю CR

    Через CLI

    kubectl apply -f alb-rule-demo.yaml -n cpaas-system

    HTTPS

    Если протокол frontend (ft) — HTTPS или GRPCS, правило также может быть настроено для использования HTTPS.

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

    Поддерживается termination, а также повторное шифрование, если backend-протокол HTTPS. Однако вы не можете указывать сертификат для связи с backend-сервисом.

    Аннотация сертификата в Ingress

    Сертификаты могут ссылаться на ресурсы в других пространствах имен через аннотацию.

    alb.networking.cpaas.io/tls: qq.com=cpaas-system/dex.tls,qq1.com=cpaas-system/dex1.tls

    Сертификат в Rule

    В .spec.certificate_name формат: $secret_namespace/$secret_name

    Режим TLS

    Edge Mode

    В режиме edge клиент общается с ALB по HTTPS, а ALB общается с backend-сервисами по HTTP. Для этого:

    1. создайте frontend с протоколом https
    2. создайте rule с backend-протоколом http и укажите сертификат через .spec.certificate_name
    Re-encrypt Mode

    В режиме re-encrypt клиент общается с ALB по HTTPS, а ALB общается с backend-сервисами по HTTPS. Для этого:

    1. создайте frontend с протоколом https
    2. создайте rule с backend-протоколом https и укажите сертификат через .spec.certificate_name

    Ingress

    Синхронизация Ingress

    Каждый ALB создает IngressClass с таким же именем и обрабатывает ingress в рамках одного проекта.

    Если в пространстве имен ingress есть метка cpaas.io/project: demo, это означает, что ingress принадлежит проекту demo.

    ALB, у которых в конфигурации .spec.config.projects указан проект demo, автоматически преобразуют эти ingress в правила.

    NOTE

    ALB слушает ingress и автоматически создает Frontend или Rule. Поле source определяется следующим образом:

    1. spec.source.type в настоящее время поддерживает только ingress.
    2. spec.source.name — имя ingress.
    3. spec.source.namespace — пространство имен ingress.
    SSL стратегия

    Для ingress без настроенных сертификатов ALB предоставляет стратегию использования сертификата по умолчанию.

    Вы можете настроить кастомный ресурс ALB следующими параметрами:

    • .spec.config.defaultSSLStrategy: определяет SSL стратегию для ingress без сертификатов
    • .spec.config.defaultSSLCert: задает сертификат по умолчанию в формате $secret_ns/$secret_name

    Доступные SSL стратегии:

    • Never: не создавать правила на HTTPS портах (поведение по умолчанию)
    • Always: создавать правила на HTTPS портах с использованием сертификата по умолчанию

    Логи и мониторинг

    Комбинируя логи и данные мониторинга, вы можете быстро выявлять и устранять проблемы с балансировщиком нагрузки.

    Просмотр логов

    1. Перейдите в Administrator.

    2. В левой навигационной панели нажмите Network Management > Load Balancer.

    3. Нажмите на Имя балансировщика нагрузки.

    4. Во вкладке Logs просмотрите логи работы балансировщика нагрузки с точки зрения контейнера.

    Метрики мониторинга

    NOTE

    В кластере, где расположен балансировщик нагрузки, должны быть развернуты сервисы мониторинга.

    1. Перейдите в Administrator.

    2. В левой навигационной панели нажмите Network Management > Load Balancer.

    3. Нажмите на Имя балансировщика нагрузки.

    4. Во вкладке Monitoring просмотрите тенденции метрик балансировщика нагрузки с точки зрения узла.

      • Usage Rate: текущая загрузка CPU и памяти балансировщика нагрузки на данном узле.

      • Throughput: общий входящий и исходящий трафик экземпляра балансировщика нагрузки.

    Для более подробной информации о метриках мониторинга смотрите ALB Monitoring.