Понимание 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
- Создайте кластер.
-
helm repo add alb https://alauda.github.io/alb/;helm repo update;helm search repo|grep alb
-
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)
Эти компоненты работают совместно, обеспечивая гибкое и мощное управление трафиком.
Ниже описано, как эти концепции взаимодействуют в цепочке обработки запроса. Подробные описания каждого понятия приведены в отдельных статьях.
В цепочке вызова запроса:
- Клиент отправляет HTTP/HTTPS/другой протокол запрос, который в конечном итоге попадает на pod ALB, и этот pod (экземпляр ALB) начинает обрабатывать запрос.
- Экземпляр ALB находит правило, которое может соответствовать этому запросу.
- При необходимости модифицирует/перенаправляет/переписывает запрос на основе правила.
- Находит и выбирает 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:
- Если у Ingress есть сертификат, создается FT 443 (HTTPS).
- Если у Ingress нет сертификата, создается FT 80 (HTTP).
RULE
RULE — ресурс, определяемый самим ALB.
Он выполняет ту же роль, что и Ingress, но более конкретен.
RULE уникально связан с FT.
RULE может быть создан ALB-Leader или пользователем вручную.
Случаи создания RULE ALB-Leader:
- Синхронизация Ingress в RULE.
ALB Leader
В нескольких экземплярах ALB один выбирается лидером.
Лидер отвечает за:
- Преобразование Ingress в Rules.
Для каждого пути в Ingress создается Rule.
- Создание FT, необходимых для Ingress.
Например, если у Ingress есть сертификат, создается FT 443 (HTTPS), если нет — FT 80 (HTTP).
Project
С точки зрения ALB, Project — это набор namespace-ов.
Вы можете настроить один или несколько Projects в ALB.
Когда ALB Leader преобразует Ingress в Rules, он игнорирует Ingress в namespace-ах, не входящих в Project.
Дополнительные ресурсы: