节点池服务拓扑管理

原生Kubernetes Service的后端端点扁平分布在集群中任意节点。因此,跨越不同分组节点的Service流量,会大概率出现访问不可达、或者访问效率低下的问题。Service流量拓扑支持边缘节点应用只能由相同节点池的节点访问,或者只能由本节点访问。本文介绍Service流量拓扑管理功能以及如何配置Service流量拓扑。

背景信息

在边缘计算场景下,边缘节点通常具备很强的区域性、地域性或者其他逻辑上的分组特性(比如具有相同的CPU架构、运营商或云提供商),不同分组的节点间往往存在网络不互通、资源不共享、资源异构、应用独立等明显的隔离属性。

Service流量拓扑管理实现原理

为了解决上述问题,容器服务 Edge 版基于原生的Service,增加了Endpoint的拓扑管理功能,即通过简单配置来限制Service后端Endpoint的访问范围。例如,边缘节点应用只能由相同节点池的节点访问,或者只能由本节点访问。具体实现原理如下图所示。

image
  • Service1关联后端Pod2和Pod3两个实例,且Service1通过annotation:"openyurt.io/topologyKeys: kubernetes.io/zone"配置了其拓扑节点池范围。

  • Pod2所在的节点2和Pod3所在的节点4分别属于两个不同的节点池A和节点池B。

  • 因为Pod3和Pod1不在一个节点池,当Pod1访问Service1时,流量只会转发到Pod2上,访问Pod3的流量被限制。

注意事项

  • v1.26.3-aliyun.1以下版本:创建Service时,需要同步配置Service的流量拓扑注解,流量拓扑功能才能生效。如果Service创建完成后,再增加注解配置,流量拓扑功能无法生效,此时需要删除该Service,重新创建。

  • v1.26.3-aliyun.1及以上版本:Service拓扑注解支持创建后修改,修改后Service拓扑功能会立即生效。

注解说明

通过在原生的Service上添加Annotation实现流量的拓扑配置,相关参数如下所示。

annotation Key

annotation Value

说明

openyurt.io/topologyKeys

kubernetes.io/hostname

限制Service只能被本节点访问。

openyurt.io/topologyKeys

kubernetes.io/zone或openyurt.io/nodepool

限制Service只能被本节点池的节点访问。ACK Edge集群版本如果大于等于1.18,推荐您使用openyurt.io/nodepool。

-

-

Service不做任何拓扑限制。

配置Service流量拓扑

您可以通过控制台或命令行两种方式进行Service流量拓扑配置。

方式一:通过控制台配置Service流量拓扑

若您需要创建一个限制在本节点池内被访问的Service,只需要给Service添加注解即可。例如将名称配置为openyurt.io/topologyKeys配置为kubernetes.io/zone。关于创建服务的更多信息,请参见Service快速入门

G-9

方式二:通过命令行配置Service流量拓扑

新建一个使用节点池拓扑域的Service,YAML样例如下。

apiVersion: v1
kind: Service
metadata:
  annotations:
    openyurt.io/topologyKeys: kubernetes.io/zone
  name: my-service-nodepool
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP