ACK One ALB多集群网关是ALB Ingress的多集群模式,可以快速实现同城应用多活容灾、流量多集群负载均衡、基于Header路由流量到指定集群等能力。本文介绍如何通过ALB Ingress管理多集群应用的南北流量。
前提条件
已从ACK One控制台获取Fleet实例的KubeConfig,并通过kubectl连接至Fleet实例。
步骤一:在舰队中通过kubectl创建ALB多集群网关
通过在ACK One舰队中创建AlbConfig对象来创建一个ACK One ALB多集群网关,并将ALB多集群网关添加至关联集群。
从ACK One舰队所在VPC,获取两个虚拟交换机ID。
使用以下内容,创建
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。
执行以下命令,部署
gateway.yaml
,创建ALB多集群网关和IngressClass。kubectl apply -f gateway.yaml
执行以下命令,查看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
确认关联集群是否添加成功,执行以下命令查看状态。
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