1. 程式人生 > >一文讀懂SuperEdge拓撲演算法

一文讀懂SuperEdge拓撲演算法

## 前言 SuperEdge service group 利用 application-grid-wrapper 實現拓撲感知,完成了同一個 nodeunit 內服務的閉環訪問 在深入分析 application-grid-wrapper 之前,這裡先簡單介紹一下社群 Kubernetes 原生支援的[拓撲感知特性](https://kubernetes.io/docs/concepts/services-networking/service-topology/) Kubernetes service topology awareness 特性於v1.17釋出alpha版本,用於實現路由拓撲以及就近訪問特性。使用者需要在 service 中新增 topologyKeys 欄位標示拓撲key型別,只有具有相同拓撲域的endpoint會被訪問到,目前有三種 topologyKeys可供選擇: - "kubernetes.io/hostname":訪問本節點內(`kubernetes.io/hostname` label value相同)的 endpoint,如果沒有則 service 訪問失敗 - "topology.kubernetes.io/zone":訪問相同zone域內(`topology.kubernetes.io/zone` label value 相同)的 endpoint,如果沒有則 service 訪問失敗 - "topology.kubernetes.io/region":訪問相同region域內(`topology.kubernetes.io/region` label value相同)的 endpoint,如果沒有則 service 訪問失敗 除了單獨填寫如上某一個拓撲key之外,還可以將這些key構造成列表進行填寫,例如:`["kubernetes.io/hostname", "topology.kubernetes.io/zone", "topology.kubernetes.io/region"]`,這表示:優先訪問本節點內的 endpoint;如果不存在,則訪問同一個 zone 內的 endpoint;如果再不存在,則訪問同一個 region 內的 endpoint,如果都不存在則訪問失敗 另外,還可以在列表最後(只能最後一項)新增"*"表示:如果前面拓撲域都失敗,則訪問任何有效的 endpoint,也即沒有限制拓撲了,示例如下: ``` # A Service that prefers node local, zonal, then regional endpoints but falls back to cluster wide endpoints. apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 9376 topologyKeys: - "kubernetes.io/hostname" - "topology.kubernetes.io/zone" - "topology.kubernetes.io/region" - "*" ``` 而service group實現的拓撲感知和社群對比,有如下區別: - service group 拓撲key可以自定義,也即為 gridUniqKey,使用起來更加靈活;而社群實現目前只有三種選擇:"kubernetes.io/hostname","topology.kubernetes.io/zone" 以及 "topology.kubernetes.io/region" - service group 只能填寫一個拓撲 key,也即只能訪問本拓撲域內有效的 endpoint,無法訪問其它拓撲域的 endpoint;而社群可以通過 topologyKey 列表以及"*"實現其它備選拓撲域 endpoint 的訪問 service group 實現的拓撲感知,service 配置如下: ``` # A Service that only prefers node zone1al endpoints. apiVersion: v1 kind: Service metadata: annotations: topologyKeys: '["zone1"]' labels: superedge.io/grid-selector: servicegrid-demo name: servicegrid-demo-svc spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: appGrid: echo ``` 在介紹完 service group 實現的拓撲感知後,我們深入到原始碼分析實現細節。同樣的,這裡以一個使用示例開始分析: ``` # step1: labels edge nodes $ kubectl get nodes NAME STATUS ROLES AGE VERSION node0 R