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