在原生Kubernetes集群中,Service的后端端点扁平分布在集群中任意节点,节点之间IP可达。在云边协同版集群架构下,边缘节点分散在不同网络区域,Service后端端点可能会分散在网络隔离的节点分组上。因此,跨越不同分组节点的Service流量,会大概率出现访问不可达、或者访问效率低下的问题。
Service流量拓扑支持边缘节点应用只能由相同节点池的节点访问,或者只能由本节点访问。本文为您介绍Service流量拓扑管理功能和配置Service流量拓扑方法。
背景信息
在边缘计算场景下,边缘节点通常具备很强的区域性、地域性、或者其他逻辑上的分组特性(比如具有相同的CPU架构、运营商或云提供商),不同分组的节点间往往存在网络不互通、资源不共享、资源异构、应用独立等明显的隔离属性。
Service流量拓扑实现原理
为了解决上述问题,ECK云边协同版在原生的Service之上,增加了Service流量拓扑管理功能,即通过简单配置来限制Service后端Endpoint的访问范围,使边缘节点应用只能由相同节点池的节点访问,或者只能由本节点访问。具体实现原理如下图所示。
- Service关联后端两个实例(Pod2,Pod4),且Service通过 annotation:"openyurt.io/topologyKeys: kubernetes.io/nodepool" 配置了其拓扑节点池范围。
- Pod2和Pod4分别属于两个不同的节点池guangzhou和节点池shenzhen。
- 因为Pod1和Pod4不在一个节点池,当Pod1访问Service时,流量只会转发到Pod2上,访问Pod4的流量被限制。
实现细节:
- kube-proxy list/watch EndpointSlices。
- 请求经过本地yurt-hub代理组件访问集群APIServer。
- yurt-hub接收到响应后,基于Service中的openyurt.io/topologyKeys配置,修改响应,过滤其他节点池的endpoint,只保本地节点池的endpoint。
- kube-proxy 收到的响应中只包含本地节点池endpoint,配置service转发规则。 因此转发规则不会跨节点池。
注意事项
创建Service时,需要同步配置Service的流量拓扑注解,流量拓扑功能才能生效。如果Service创建完成后,再增加注解配置,流量拓扑功能无法生效,此时需要删除该Service,重新创建。
方式一:通过控制台配置Service拓扑
若您需要创建一个限制在本节点池内被访问的Service,只需给Service添加注解即可。例如将名称配置为openyurt.io/topologyKeys,值配置为openyurt.io/nodepool。
方式二:通过命令行配置Service拓扑
新建一个使用节点池拓扑的Service,YAML样例如下。
apiVersion: v1
kind: Service
metadata:
name: test-service-topology
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
spec:
ports:
- name: test
port: 8088
targetPort: 8088
protocol: TCP
type: ClusterIP
注解说明
通过在原生的Service上添加Annotation实现流量的拓扑配置,相关参数如下所示。
annotation Key | annotation Value | 说明 |
---|---|---|
openyurt.io/topologyKeys | kubernetes.io/hostname | 限制Service只能被本节点访问。 |
openyurt.io/topologyKeys | openyurt.io/nodepool | 限制Service只能被本节点池的节点访问。 |
- | - | Service不做任何拓扑限制。 |