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(預設值):公網類型。面向公網提供應用型負載平衡服務,公網可訪問。
說明應用型負載平衡通過綁定Elastic IP Address進行公網服務,使用公網類型ALB執行個體將收取Elastic IP Address的執行個體費與頻寬、流量費用,詳情參見隨用隨付。
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