拓扑感知路由让服务流量更智能地靠近用户,是提升 Kubernetes 网络效率与体验的关键利器。
拓扑感知路由(Topology Aware Routing)是 Kubernetes 的一项网络优化功能,它允许客户端访问服务时根据端点的拓扑位置,优先将流量路由到与客户端位于同一节点或可用区的端点上,从而减少网络延迟并降低跨区域流量成本。
拓扑感知路由通过以下方式工作:
要启用拓扑感知路由功能,需要满足以下条件:
TopologyAwareHints 特性门控(1.23+ 版本默认启用)EndpointSlice 是 Kubernetes 中用于替代传统 Endpoint 资源的新 API,它提供了更好的可扩展性和拓扑感知能力。
以下是相关的代码示例:
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: example-service
labels:
kubernetes.io/service-name: example-svc
endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.io
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 80
endpoints:
- addresses:
- "10.244.1.5"
conditions:
ready: true
hostname: backend-pod-1
nodeName: worker-node-1
zone: us-west-1a
EndpointSlice 中每个端点可以包含以下拓扑信息:
nodeName:端点所在的节点名称zone:端点所处的可用区标识hostname:端点对应的 Pod 主机名region:端点所在的地理区域(可选)对于 Kubernetes 1.23 之前的版本,需要在以下组件中启用特性门控:
# kube-apiserver
--feature-gates=TopologyAwareHints=true
# kube-controller-manager
--feature-gates=TopologyAwareHints=true
# kube-proxy
--feature-gates=TopologyAwareHints=true
在 Service 资源上添加注解来启用拓扑感知提示:
apiVersion: v1
kind: Service
metadata:
name: example-service
annotations:
service.kubernetes.io/topology-mode: "Auto"
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080
启用后,EndpointSlice 将包含拓扑提示信息:
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: example-service-abc123
labels:
kubernetes.io/service-name: example-service
endpoints:
- addresses:
- "10.244.1.5"
conditions:
ready: true
hostname: backend-pod-1
nodeName: worker-node-1
zone: us-west-1a
hints:
forZones:
- name: "us-west-1a"
拓扑感知路由特别适用于以下场景:
以下是相关的代码示例:
# 查看 EndpointSlice 详情
kubectl get endpointslices -o yaml
# 检查 Service 注解
kubectl get service <service-name> -o yaml
# 查看 kube-proxy 日志
kubectl logs -n kube-system -l k8s-app=kube-proxy
EndpointSlice 支持多个控制器同时管理,通过 endpointslice.kubernetes.io/managed-by 标签进行区分:
endpointslice-controller.k8s.io:默认的 EndpointSlice 控制器custom-controller.example.com:自定义控制器标识EndpointSlice 的生命周期通常与对应的 Service 绑定,通过 owner reference 和 kubernetes.io/service-name 标签进行关联管理。