了解 ALB

WARNING

ALB 已弃用。请改用 ingress-nginx-operator 或 envoy-gateway。

ALB(Another Load Balancer)是由 OpenResty 驱动的 Kubernetes Gateway,融合了 Alauda 多年的生产实践经验。

核心组件

  • ALB Operator:用于管理 ALB 实例生命周期的 operator。它会监视 ALB CR,并为不同租户创建或更新实例。
  • ALB Instance:ALB 实例包括充当数据平面的 OpenResty 和充当控制平面的 Go controller。Go controller 会监视各种 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"  # the ip address of node where alb been deployed
    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: 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/其他协议请求,最终请求将到达 ALB 的某个 pod,该 pod(一个 ALB 实例)将开始处理此请求。
  2. 此 ALB 实例查找能够匹配此请求的规则。
  3. 如有需要,根据规则修改、重定向或重写请求。
  4. 从规则配置的服务中查找并选择一个 pod IP,然后将请求转发到该 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 实例独立处理请求,但所有实例共享属于同一 ALB 的 Frontend(FT)、Rule 和其他配置。

ALB-Operator

ALB-Operator 是部署在集群中的默认组件,是用于 ALB 的 operator。它会根据 ALB 资源为每个 ALB 创建、更新或删除 Deployment 及其他相关资源。

Frontend(缩写:FT)

FT 是由 ALB 自身定义的资源,用于表示 ALB 实例监听的端口。

FT 可以由 ALB-Leader 创建,也可以由用户手动创建。

ALB-Leader 创建 FT 的情况:

  1. 如果 Ingress 有证书,我们将创建 FT 443(HTTPS)。
  2. 如果 Ingress 没有证书,我们将创建 FT 80(HTTP)。

RULE

RULE 是由 ALB 自身定义的资源。
它与 Ingress 具有相同的作用,但更加具体。
一个 RULE 唯一关联一个 FT。

RULE 可以由 ALB-Leader 创建,也可以由用户手动创建。

ALB-Leader 创建 RULE 的情况:

  1. 将 Ingress 同步到 RULE。

ALB Leader

在多个 ALB 实例中,其中一个将被选举为 leader。
leader 负责:

  1. 将 Ingress 转换为 RULE。 我们将为 Ingress 中的每个路径创建一个 RULE。
  2. 创建 Ingress 所需的 FT。 例如,如果 Ingress 有证书,我们将创建 FT 443(HTTPS);如果 Ingress 没有证书,我们将创建 FT 80(HTTP)。

项目

从 ALB 的角度来看,项目是一组命名空间。

您可以在一个 ALB 中配置一个或多个项目。
当 ALB Leader 将 Ingress 转换为 RULE 时,它会忽略不属于该项目的命名空间中的 Ingress。

其他资源:

商标声明

Envoy® 是 The Linux Foundation 的注册商标。

NGINX® 是 F5, Inc. 在美国及其他国家/地区的注册商标。

Alauda 是一家独立的供应商。本产品与 The Linux Foundation 或 F5, Inc. 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,此处使用这些商标仅用于标识目的。