40.拓扑感知路由

拓扑感知路由

拓扑感知路由指的是客户端对一个服务的访问流量,可以根据这个服务的端点拓扑,优先路由到与该客户端在同一个节点或者可用区的端点上的路由行为。

先决条件

为了开启服务感知路由,你需要:

  • 开启 TopologyAwareHints 智能感知提示门控
  • 开启EndpointSlice控制器
  • 安装kube-proxy

端点切片

我们知道Endpoint通常情况下是由Service资源自动创建和管理的,但是随着Kubernetes集群的规模越来越大和管理的服务越来越多,Endpoint API的局限性变得越来越明显。端点切片(EndpointSlices)提供了一种简单的方法来跟踪Kubernetes集群中的网络端点。它们为Endpoint提供了一种可伸缩和可拓展的替代方案,同时还可以被用到拓扑感知路由中。

EndpointSlices示例如下:

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.127.2.3"
    conditions:
      ready: true
    hostname: pod-1
    nodename: node-a
    zone: zone-a

EndpointSlice中的每个端点都可以包含一定的拓扑信息。拓扑信息包括端点的位置,对应节点、可用区的信息。这些信息体现为EndpointSlices的如下端点字段:

  • nodeName -端点所在的Node名称
  • zone -端点所处的可用区
  • hostname -端点的pod名称

启用拓扑感知

请启用kube-apiserver、kube-controller-manager、和kube-proxy特性门控 TopologyAwareHints。通过把Service中的注解 service.kubernetes.io/topology-aware-hints 的值设置为 auto, 来激活服务的拓扑感知提示功能。这告诉EndpointSlice控制器在它认为安全的时候来设置拓扑提示。kube-proxy组件依据EndpointSlice控制器设置的提示,过滤由它负责路由的端点。

EndpointSlice控制器提供提示信息后EndpointSlice的示例如下:

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.1.2.3"
    conditions:
      ready: true
    hostname: pod-1
    zone: zone-a
    hints:
      forZones:
        - name: "zone-a"

我们看到其中已注入了 hints 信息,对于上面这个示例,zone-a 的客户端访问会优先路由到该端点上。

管理

在大多数场合下,EndpointSlice都由某个Service所有,因为端点切片正是为该服务跟踪记录其端点。这一属主关系是通过为每个EndpointSlice设置一个 属主(owner)引用,同时设置 kubernetes.io/service-name 标签来标明的, 目的是方便查找隶属于某服务的所有EndpointSlice

控制面(尤其是端点切片的控制器) 会创建和管理EndpointSlice对象。EndpointSlice对象还有一些其他使用场景, 例如作为服务网格(Service Mesh)的实现。这些场景都会导致有其他实体 或者控制器负责管理额外的EndpointSlice集合。

为了确保多个实体可以管理EndpointSlice而且不会相互产生干扰,Kubernetes定义了标签 endpointslice.kubernetes.io/managed-by,用来标明哪个实体在管理某个EndpointSlice。端点切片控制器会在自己所管理的所有EndpointSlice上将该标签值设置 为 endpointslice-controller.k8s.io。管理EndpointSlice的其他实体也应该为此标签设置一个唯一值。

参考

上一页
下一页