使用ASM跨集群網(wǎng)格代理實(shí)現(xiàn)多集群跨網(wǎng)絡(luò)互通
阿里云ASM支持將多個(gè)ACK集群整合在一個(gè)ASM實(shí)例中,為分布廣泛的服務(wù)提供統(tǒng)一的管理和運(yùn)維平臺(tái)。ASM跨集群網(wǎng)格代理提供了更為靈活的多集群網(wǎng)絡(luò)互聯(lián)方案,本文將介紹如何在多集群場(chǎng)景下利用跨集群網(wǎng)格代理打通集群通信。
背景信息
ASM支持多集群模式,即用戶可以在同一個(gè)ASM實(shí)例中加入多個(gè)ACK集群。 您可以在ASM中加入多個(gè)不同網(wǎng)絡(luò)下的ACK集群,若多集群的網(wǎng)絡(luò)不具備打通三層網(wǎng)絡(luò)的條件(設(shè)施限制、CIDR沖突、費(fèi)用等原因),則可以利用ASM網(wǎng)關(guān)打通集群網(wǎng)絡(luò),使用ASM跨集群網(wǎng)格代理可以靈活使用公、私有網(wǎng)絡(luò)將集群網(wǎng)絡(luò)聯(lián)通,無(wú)感解決地址沖突問題,實(shí)現(xiàn)多集群統(tǒng)一的流量治理、安全防護(hù)以及全鏈路可觀測(cè)。本文將以Sleep應(yīng)用跨集群訪問httpbin為例介紹如何在ASM環(huán)境下利用跨集群網(wǎng)格代理配置跨網(wǎng)絡(luò)多集群互通。
能力優(yōu)勢(shì)
ASM 1.22及以上版本提供的跨集群網(wǎng)格代理完整實(shí)現(xiàn)了七層客戶端負(fù)載均衡,跨集群調(diào)用場(chǎng)景下,所有路由能力與非跨集群負(fù)載均衡完全對(duì)齊。
前提條件
已創(chuàng)建ASM實(shí)例,版本不低于1.22。具體操作,請(qǐng)參見創(chuàng)建ASM實(shí)例。
已添加多個(gè)集群到ASM實(shí)例。具體操作,請(qǐng)參見添加集群到ASM實(shí)例。(本文示例為兩個(gè))。
已開啟ASM自動(dòng)注入。具體操作,請(qǐng)參見啟用自動(dòng)注入。
服務(wù)之間跨集群訪問需要滿足以下兩個(gè)條件之一:
開啟了ASM的在ASM中使用DNS代理(推薦)。
手動(dòng)在客戶端所在的集群創(chuàng)建一個(gè)和服務(wù)端集群相同的目標(biāo)Service。
步驟一:為ASM控制面綁定公網(wǎng)IP
為了使與ASM實(shí)例不在同一網(wǎng)絡(luò)的集群中的數(shù)據(jù)平面組件可以正確地連接到ASM控制平面,需要為ASM控制平面Pilot使用的SLB實(shí)例綁定EIP,以將Pilot暴露于公網(wǎng)。
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁(yè)面,單擊目標(biāo)實(shí)例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在基本信息頁(yè)面右側(cè),找到Istio Pilot 地址并單擊綁定EIP。
綁定EIP到Pilot負(fù)載均衡后,若刪除ASM實(shí)例時(shí)未解除綁定,EIP將隨ASM實(shí)例釋放。
步驟二:為集群指定網(wǎng)絡(luò)配置,并啟用跨集群網(wǎng)格代理
您可以為每個(gè)集群指定一個(gè)邏輯網(wǎng)絡(luò)。同一個(gè)邏輯網(wǎng)絡(luò)之間的服務(wù)可以直接互相訪問,不同邏輯網(wǎng)絡(luò)之間的服務(wù)需要通過跨集群網(wǎng)格代理才可以訪問。
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁(yè)面,單擊目標(biāo)實(shí)例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
單擊多集群網(wǎng)絡(luò)配置按鈕,參考如下方式配置多集群網(wǎng)絡(luò)。
為ACK-1指定所屬邏輯網(wǎng)絡(luò)為network1。
為ACK-2指定所屬邏輯網(wǎng)絡(luò)為network2,并且在ACK-2中啟用跨集群網(wǎng)格代理訪問。
應(yīng)用上述配置后,ASM會(huì)為您在ACK-2中創(chuàng)建一個(gè)默認(rèn)跨集群網(wǎng)格代理,該網(wǎng)關(guān)具有公網(wǎng)IP。ACK-1中的服務(wù)將會(huì)自動(dòng)通過這個(gè)跨集群網(wǎng)格代理訪問到ACK-2中的服務(wù),并且這條鏈路默認(rèn)會(huì)啟用mTLS加密。
您可以通過ASM集群的kubeconfig查看跨集群網(wǎng)格代理的定義,跨集群網(wǎng)格代理有一個(gè)特殊的名稱:asm-cross-network-${ACK ID}
。您可以根據(jù)自己的需求,自行調(diào)節(jié)網(wǎng)關(guān)的資源和副本數(shù)等配置。
目前跨集群網(wǎng)格代理是一個(gè)TCP Proxy,無(wú)法進(jìn)行L7負(fù)載均衡。可能在某些情況下存在負(fù)載不均衡的情況。
步驟三:驗(yàn)證跨集群訪問
上述步驟中的網(wǎng)絡(luò)配置需要在業(yè)務(wù)Pod啟動(dòng)時(shí)生效。如果修改網(wǎng)絡(luò)配置之前已經(jīng)啟動(dòng)了業(yè)務(wù)Pod,則需要重啟業(yè)務(wù)Pod。
在ACK-1中創(chuàng)建Sleep應(yīng)用,示例YAML配置如下:
apiVersion: v1 kind: ServiceAccount metadata: name: sleep --- apiVersion: v1 kind: Service metadata: name: sleep labels: app: sleep service: sleep spec: ports: - port: 80 name: http selector: app: sleep --- apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: terminationGracePeriodSeconds: 0 serviceAccountName: sleep containers: - name: sleep image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2 command: ["/bin/sleep", "infinity"] imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /etc/sleep/tls name: secret-volume volumes: - name: secret-volume secret: secretName: sleep-secret optional: true ---
在ACK-2中創(chuàng)建httpbin應(yīng)用,示例YAML配置如下:
從Sleep對(duì)應(yīng)的Pod中訪問httpbin應(yīng)用(使用ACK-1的kubeconfig)。
獲取Sleep Pod名稱。
kubectl get pod | grep sleep
在Sleep中使用curl訪問httpbin。
kubectl exec ${sleep pod名稱} -- curl httpbin:8000/status/418
此時(shí)可以看到訪問成功,輸出如下所示:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 135 100 135 0 0 16075 0 --:--:-- --:--:-- --:--:-- 16875 -=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
驗(yàn)證Sleep通過跨集群網(wǎng)格代理訪問了httpbin。
查看Sleep Pod的日志(使用ACK-1的kubeconfig)。
kubectl logs ${sleep pod名稱} -c istio-proxy | tail -1
輸出如下所示:
{"authority_for":"httpbin:8000","bytes_received":"0","bytes_sent":"135","downstream_local_address":"xxx.xxx.xxx.xx:8000","downstream_remote_address":"xx.x.xxx.xxx:xxxxx","duration":"7","istio_policy_status":"-","method":"GET","path":"/status/418","protocol":"HTTP/1.1","request_id":"08dc43e9-60c8-4f2f-910a-b727172ce311","requested_server_name":"-","response_code":"418","response_flags":"-","route_name":"default","start_time":"2024-05-23T10:06:27.289Z","trace_id":"-","upstream_cluster":"outbound|8000||httpbin.default.svc.cluster.local","upstream_host":"xxx.xx.xxx.xxx:15443","upstream_local_address":"xx.x.xxx.xxx:60248","upstream_response_time":"7","upstream_service_time":"7","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"-"}
其中的
upstream_host
字段標(biāo)識(shí)Sleep Pod直接訪問的目標(biāo),可以看到訪問的端口是15443
,15443
是跨集群網(wǎng)格代理專用的端口。查看跨集群網(wǎng)格代理的日志(使用ACK-2的kubeconfig)。
首先獲取跨集群網(wǎng)格代理Pod。
kubectl -n istio-system get pod | grep asm-cross-network istio-asm-cross-network-c0859be51XXX 1/1 Running 0 20h istio-asm-cross-network-c0859be51XXX 1/1 Running 0 20h
可以看到默認(rèn)有兩個(gè)跨集群網(wǎng)格代理的Pod。您可以分別查看這兩個(gè)Pod的日志,可以看到類似的訪問日志。
kubectl logs istio-asm-cross-network-c0859be51XXX -n istio-system | tail -1 {"authority_for":"-","bytes_received":"xxxx","bytes_sent":"xxxx","downstream_local_address":"xx.xx.x.xx:15443","downstream_remote_address":"xx.xx.xx.xx:xxxxx","duration":"1568569","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"outbound_.8000_._.httpbin.default.svc.cluster.local","response_code":"0","response_flags":"-","route_name":"-","start_time":"2024-05-23T08:41:16.618Z","trace_id":"-","upstream_cluster":"outbound_.8000_._.httpbin.default.svc.cluster.local","upstream_host":"xx.xx.xx.xxx:80","upstream_local_address":"xx.x.xx.xx:xxxxx","upstream_response_time":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}