Понимание ALB

ALB (Another Load Balancer) — это Kubernetes Gateway, основанный на OpenResty, с многолетним опытом эксплуатации в продакшене от Alauda.

Содержание

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

  • ALB Operator: оператор, управляющий жизненным циклом экземпляров ALB. Он отслеживает CR ALB и создает/обновляет экземпляры для разных арендаторов.
  • ALB Instance: экземпляр ALB включает OpenResty, выступающий в роли data plane, и контроллер на Go в роли control plane. Контроллер на Go следит за различными CR (Ingress, Gateway, Rule и др.) и преобразует их в специфичные для ALB DSL-правила. OpenResty затем использует эти DSL-правила для сопоставления и обработки входящих запросов.

Быстрый старт

Развертывание ALB Operator

  1. Создайте кластер.
  2.  helm repo add alb https://alauda.github.io/alb/;helm repo update;helm search repo|grep alb
  3.  helm install alb-operator alb/alauda-alb2

Развертывание экземпляра ALB

cat <<EOF | kubectl apply -f -
apiVersion: crd.alauda.io/v2beta1
kind: ALB2
metadata:
    name: alb-demo
    namespace: kube-system
spec:
    address: "172.20.0.5"  # IP-адрес ноды, на которой развернут alb
    type: "nginx"
    config:
        networkMode: host
        loadbalancerName: alb-demo
        projects:
        - ALL_ALL
        replicas: 1
EOF

Запуск демонстрационного приложения

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  labels:
    k8s-app: hello-world
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: hello-world
  template:
    metadata:
      labels:
        k8s-app: hello-world
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: hello-world
        image: docker.io/crccheck/hello-world:latest
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world
  labels:
    k8s-app: hello-world
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8000
  selector:
    k8s-app: hello-world
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-world
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: hello-world
            port:
              number: 80
EOF

Теперь вы можете получить доступ к приложению через curl http://${ip}

Взаимосвязь между ALB, ALB Instance, Frontend/FT, Rule, Ingress и Project

LoadBalancer — ключевой компонент современных облачно-нативных архитектур, выступающий в роли интеллектуального маршрутизатора трафика и балансировщика нагрузки.

Чтобы понять, как работает ALB в Kubernetes-кластере, необходимо разобраться в нескольких основных понятиях и их взаимосвязях:

  • Сам ALB
  • Frontend (FT)
  • Правила (Rules)
  • Ресурсы Ingress
  • Проекты (Projects)

Эти компоненты работают совместно, обеспечивая гибкое и мощное управление трафиком.

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

В цепочке вызова запроса:

  1. Клиент отправляет HTTP/HTTPS/другой протокол запрос, который в конечном итоге попадает на pod ALB, и этот pod (экземпляр ALB) начинает обрабатывать запрос.
  2. Экземпляр ALB находит правило, которое может соответствовать этому запросу.
  3. При необходимости модифицирует/перенаправляет/переписывает запрос на основе правила.
  4. Находит и выбирает IP одного из pod-ов сервиса, указанного в правиле, и пересылает запрос на этот pod.

Ingress

Ingress — ресурс в Kubernetes, используемый для описания, какой запрос должен быть направлен к какому сервису.

Ingress Controller

Программа, которая понимает ресурс Ingress и проксирует запросы к сервису.

ALB

ALB — это Ingress controller.

В Kubernetes-кластере мы используем ресурс alb2 для управления ALB. Вы можете использовать kubectl get alb2 -A, чтобы просмотреть все ALB в кластере.

ALB создаются пользователями вручную. Каждый ALB имеет свой собственный IngressClass. При создании Ingress можно использовать поле .spec.ingressClassName, чтобы указать, какой Ingress controller должен обрабатывать этот Ingress.

ALB Instance

ALB также представляет собой Deployment (набор pod-ов), работающий в кластере. Каждый pod называется экземпляром ALB.

Каждый экземпляр ALB обрабатывает запросы независимо, но все экземпляры разделяют Frontend (FT), Rule и другие конфигурации, принадлежащие одному ALB.

ALB-Operator

ALB-Operator — компонент по умолчанию, развернутый в кластере, оператор для ALB. Он создает/обновляет/удаляет Deployment и другие связанные ресурсы для каждого ALB в соответствии с ресурсом ALB.

Frontend (сокращенно: FT)

FT — ресурс, определяемый самим ALB. Он используется для представления портов прослушивания экземпляра ALB.

FT может быть создан ALB-Leader или пользователем вручную.

Случаи создания FT ALB-Leader:

  1. Если у Ingress есть сертификат, создается FT 443 (HTTPS).
  2. Если у Ingress нет сертификата, создается FT 80 (HTTP).

RULE

RULE — ресурс, определяемый самим ALB. Он выполняет ту же роль, что и Ingress, но более конкретен. RULE уникально связан с FT.

RULE может быть создан ALB-Leader или пользователем вручную.

Случаи создания RULE ALB-Leader:

  1. Синхронизация Ingress в RULE.

ALB Leader

В нескольких экземплярах ALB один выбирается лидером. Лидер отвечает за:

  1. Преобразование Ingress в Rules. Для каждого пути в Ingress создается Rule.
  2. Создание FT, необходимых для Ingress. Например, если у Ingress есть сертификат, создается FT 443 (HTTPS), если нет — FT 80 (HTTP).

Project

С точки зрения ALB, Project — это набор namespace-ов.

Вы можете настроить один или несколько Projects в ALB. Когда ALB Leader преобразует Ingress в Rules, он игнорирует Ingress в namespace-ах, не входящих в Project.

Дополнительные ресурсы: