博客 / 詳情

返回

TCM服務網格同城雙活設計方案

1、TCM服務網格能力概述

1.1 架構概述

上篇文章,講述了接入層高可用架構設計,這篇文章我們聊聊TCM(服務網格)。TCM(服務網格)是騰訊雲提供的微服務流量治理雲產品,100% 兼容支持 Istio API,TCM與騰訊雲基礎設施原生集成,提供全託管服務化的支撐能力,輕鬆保障和管理網格生命週期。簡易架構如下圖:
圖片
騰訊雲託管網格主要是增強了Control plane,默認與騰訊雲基礎設施集成,如CLB(負載均衡)、APM(應用性能監控)、TMP(Prometheus)、CLS(日誌服務)、TKE(容器服務)等,用户無需配置即可用原生方式使用服務網格。

1.2 託管網格的跨區可用性

託管網格的控制面,部署在對所有云用户不可見的TKE集羣。TKE集羣內node來自多可用區,同時通過反親和性配置,保證同一個用户的控制面進程在不同的可用區,從而實現了部署層面的高可用。同時,基於TKE集羣本身的健康檢查機制等,保證了進程的高可用TCM詳細資料參考:https://cloud.tencent.com/document/product/1261/62928

2、架構設計方案

2.1 同城雙活需求分析

使用了TCM服務網格產品,只需要考慮數據面的高可用建設,即業務程序的同城雙活。這種架構模式下,有兩個技術點需要解決:
1、 接入層的流量負載均衡
2、 邏輯層的set部署,即可用區內流量閉環

2.2 設計方案

適合上面同城雙活的集羣部署模式,如下圖一、圖二所示。圖一代表一個服務網格 + 一個TKE集羣的部署模式,TKE集羣的Node節點分佈在兩個可用區圖二代表一個服務網格 + 兩個TKE集羣的部署模式,一個TKE的node節點分佈在上海四區,另一個TKE的node節點分佈在上海五區。
圖片

2.3 原理分析

2.3.1 就近接入能力

istio本身會參考Region/Zone/Sub-zone這個三元組來決定就近調度。
Region來源:對應雲的地域,從k8s node節點label中獲取,key是 topology.kubernetes.io/region
Zone來源:對應雲的可用區,從k8s node節點label中獲取,key是topology.kubernetes.io/zone
Sub-zone來源:istio自定義的,用來定義比可用區更細的調度單元,需用户按需給node節點打label topology.istio.io/subzone
計算就近的順序是Region、Zone、Sub-zone。
比如一個服務網格+一個TKE集羣場景,流量進入四區的istio-gateway後,只會調用四區的Service A,依此類推。
默認情況下,該能力是關閉的,即流量進入四區的istio-gateway後,會在四區、五區的Service A輪詢,如需使用,需開啓異常檢測能力,即配置outlierDetection流量管理功能,參考配置如下:

spec:

  host: stock

  trafficPolicy:

    outlierDetection:

      consecutiveErrors: 5

      interval: 10000ms

      baseEjectionTime: 30000ms

      maxEjectionPercent: 10

      minHealthPercent: 50

2.3.2 failover能力

就近接入能力開啓後,那就面臨一個問題,如果就近區域的服務全部不可用,如何failover呢?實際是通過envoy endpoints中的priority參數來控制,不設置默認是0。在大於兩個單元的場景,failover的順序是按0>1>2的順序來轉移。細節參考文檔:Locality Weighted Load Balancing — envoy tag-v1.23.0 documentation

2.3.3 相關配置分析

調用鏈路
如果流量是從四區的istio gateway進入,那麼訪問product時,鏈路會是istio gateway --> frontend --> product,且都在四區,反之亦然。
圖片
配置情況下面是一個服務網格+一個TKE集羣場景下ingress-gateway的endpoint配置,172.16.0.38 locality為zone: "200005"

- addedViaApi: true

  hostStatuses:

  - address:

      socketAddress:

        address: 172.16.1.124

        portValue: 80

    healthStatus:

      edsHealthStatus: HEALTHY

    locality:

      region: sh

      zone: "200004"

    weight: 1

  - address:

      socketAddress:

        address: 172.16.0.38

        portValue: 80

    healthStatus:

      edsHealthStatus: HEALTHY

    locality:

      region: sh

      zone: "200005"

    weight: 1

  name: outbound|80||istio-ingressgateway.istio-system.svc.cluster.local

  observabilityName: outbound|80||istio-ingressgateway.istio-system.svc.cluster.local

frontend的endpoint配置,172.16.0.37 locality為zone: "200005"

- addedViaApi: true

  hostStatuses:

  - address:

      socketAddress:

        address: 172.16.0.37

        portValue: 80

    healthStatus:

      edsHealthStatus: HEALTHY

    locality:

      region: sh

      zone: "200005"

    weight: 1

  - address:

      socketAddress:

        address: 172.16.1.120

        portValue: 80

    healthStatus:

      edsHealthStatus: HEALTHY

    locality:

      region: sh

      zone: "200004"

    priority: 1

    weight: 1

  name: outbound|80||frontend.base.svc.cluster.local

  observabilityName: outbound|80||frontend.base.svc.cluster.local

pronduct的endpoint配置,172.16.0.36 locality為zone: "200005"

- addedViaApi: true

  hostStatuses:

  - address:

      socketAddress:

        address: 172.16.0.36

        portValue: 7000

    locality:

      region: sh

      zone: "200005"

    weight: 1

  - address:

      socketAddress:

        address: 172.16.1.119

        portValue: 7000

    locality:

      region: sh

      zone: "200004"

    priority: 1

    weight: 1

  name: outbound|7000||product.base.svc.cluster.local

  observabilityName: outbound|7000||product.base.svc.cluster.local

結果驗證
從調用鏈來看,確實實現了就近接入,且與上面配置一致:
圖片

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.