SuperEdge service group利用 application-grid-wrapper实现拓扑感知,并在同一个nodeunit单元中完成服务的闭环访问
在深入分析application-grid-wrapper之前,这里简单介绍一下最初由社区Kubernetes支持的拓扑感知特性
Kubernetes服务拓扑感知特性在v1.17中发布,用于实现路由拓扑alpha邻近接入特性。用户需要在服务中添加一个拓扑关键字字段来指示拓扑关键字类型。将只访问具有相同拓扑域的端点。目前,有三种拓扑键可供选择:
“kubernetes.io/hostname”:访问此节点中的端点(kubernetes.io/hostname有相同的标签值)。如果没有端点,服务访问将失败
“topology.kubernites.io/zone”:访问同一区域域中的端点(topology.kubernetes.io/zone具有相同的标签值)。如果没有端点,服务访问将失败
“topology.kubernites.io/region”:访问同一个区域域中的端点(topology.kubernetes.io/region有相同的标签值)。如果没有端点,服务访问将失败
除了分别填写上述拓扑键中的一个之外,还可以将这些键构造成一个列表来填写,例如:【“Kubernetes。io/主机名" ",拓扑。Kubernetes。io/zone " “,拓扑。Kubernetes。io/region”],意思是:访问端点;首先在这个节点中;如果不存在,则访问端点;在同一个区域;如果不再存在,则访问同一区域的端点;如果它不存在,访问就会失败。
此外,您还可以在列表末尾(仅最后一项)添加“*”,这意味着如果之前的所有拓扑域都失败了,您可以访问任何有效的端点,即没有受限拓扑。示例如下:
# 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"
- "*"
但是,服务组实施的拓扑感知和社区比较有以下差异:
服务组拓扑键可以自定义,即gridUniqKey,使用起来更灵活;目前社区实现只有三个选项:“kubernetes.io/hostname”、“topology.kubernetes.io/zone”和“topology.kubernetes.io/region”
服务组只能填写一个拓扑关键字,即只能访问该拓扑域中的有效端点,不能访问其他拓扑域中的端点;社区可以通过拓扑密钥列表和“*”访问其他备选拓扑域端点
服务组实现拓扑感知,服务配置如下:
# 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
在创建完 ServiceGrid CR 后,ServiceGrid Controller 负责根据 ServiceGrid 产生对应的 service (包含由serviceGrid.Spec.GridUniqKey 构成的 topologyKeys annotations);而 application-grid-wrapper 根据 service 实现拓扑感知。