一文讀懂SuperEdge拓撲演算法
阿新 • • 發佈:2021-03-18
## 前言
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