管理南北流量

ACK One ALB多集群网关是ALB Ingress的多集群模式,可以快速实现同城应用多活容灾、流量多集群负载均衡、基于Header路由流量到指定集群等能力。本文介绍如何通过ALB Ingress管理多集群应用的南北流量。

前提条件

步骤一:在舰队中通过kubectl创建ALB多集群网关

通过在ACK One舰队中创建AlbConfig对象来创建一个ACK One ALB多集群网关,并将ALB多集群网关添加至关联集群。

  1. 从ACK One舰队所在VPC,获取两个虚拟交换机ID。

  2. 使用以下内容,创建gateway.yaml文件。

    说明
    • 请将${vsw-id1}${vsw-id2}替换为您上一步获取的交换机ID,${cluster1}${cluster2}替换为您待添加的关联集群ID。

    • 子集群${cluster1}${cluster2}的安全组的入方向需要允许该交换机网段的IP和所有端口通过。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: ackone-gateway-demo
      annotations:
        # 添加要处理流量的关联集群到ALB多集群实例。
        alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2}
    spec:
      config:
        name: one-alb-demo
        addressType: Internet
        addressAllocatedMode: Fixed
        zoneMappings:
        - vSwitchId: ${vsw-id1}
        - vSwitchId: ${vsw-id2}
      listeners:
      - port: 8001
        protocol: HTTP
    ---
    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: alb
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: ackone-gateway-demo

    需要同步的参数及其说明如下表所示:

    参数

    是否必填

    说明

    metadata.name

    AlbConfig的名称。

    metadata.annotations:

    alb.ingress.kubernetes.io/remote-clusters

    表示待添加到ALB多集群网关的关联集群列表。此处所填的是已经关联到舰队实例的集群ID。

    spec.config.name

    ALB实例的名称。

    spec.config.addressType

    ALB实例的网络类型。取值如下:

    • Internet(默认值):公网类型。面向公网提供应用型负载均衡服务,公网可访问。

      说明

      应用型负载均衡通过绑定弹性公网IP进行公网服务,使用公网类型ALB实例将收取弹性公网IP的实例费与带宽、流量费用,详情参见按量付费

      Intranet:私网类型。面向VPC内部提供应用型负载均衡服务,公网不可访问。

    spec.config.zoneMappings

    设置ALB交换机ID。创建交换机具体操作请参见创建和管理交换机

    说明
    • 指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB支持的地域与可用区,请参见ALB支持的地域与可用区

    • 应用型负载均衡支持多可用区部署,若当前地域支持2个及以上可用区,为保障业务高可用,请至少选择2个或以上不同可用区的交换机。

    spec.listeners

    配置ALB的监听端口和协议。本文配置示例为端口8001的HTTP监听。

    监听定义了流量进入负载均衡的方式和规则,此处建议保留该配置,否则您需要另行创建监听才可使用ALB Ingress。

  3. 执行以下命令,部署gateway.yaml,创建ALB多集群网关和IngressClass。

    kubectl apply -f gateway.yaml
  4. 执行以下命令,查看ALB多集群网关是否创建成功(1~3min)。

    kubectl get albconfig ackone-gateway-demo

    预期输出如下:

    NAME      		      ALBID      DNSNAME                               PORT&PROTOCOL   CERTID   AGE
    ackone-gateway-demo           alb-xxxx   alb-xxxx.<regionid>.alb.aliyuncs.com                           4d9h
  5. 确认关联集群是否添加成功,执行以下命令查看状态。

    kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'

    预期输出为集群ID列表。

步骤二:通过Ingress实现不同场景下的调度流量

通过在Ingress中指定IngressClass来使用ALB Ingress,可以使用不同的Annotation实现不同的流量管理能力。ALB Ingress可以支持常用的Nginx-Ingress注解,还有针对ALB自身模型的强化功能。ALB Ingress的全量配置可以参考 ALB Ingress配置词典。下文以部分典型的多集群流量管理场景为例说明。

示例1:默认负载均衡到所有服务后端

不同集群按照副本数分配流量。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

示例2:流量仅路由到指定集群

通过alb.ingress.kubernetes.io/cluster-weight.{clusterID} 动态注解指定集群,若指定的集群不存在,则会被自动跳过。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "100"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

示例3:根据Header将流量路由到指定集群

  • 通过alb.ingress.kubernetes.io/cluster-weight.{clusterID}动态注解指定集群,若指定的集群不存在,则会被自动跳过。

  • 通过alb.ingress.kubernetes.io/condition.{backend.service.name}动态注解来注入请求头参数,您可以根据请求的头部信息来控制流量的路由。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/conditions.service1: |
     [{
       "type": "Header",
       "headerConfig": {
          "key":"stage",
           "values": [
              "gray"
           ]
       }
      }]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "100"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

示例4:根据权重进行流量路由

通过alb.ingress.kubernetes.io/cluster-weight注解对多后端服务进行流量分配,权重之和必须等于100。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "60"
    alb.ingress.kubernetes.io/cluster-weight.cd174e5d9394b4b4a8728f08d16203793: "40"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80