拓扑感知路由
拓扑感知路由(Topology Aware Routing)是 Kubernetes 的一项网络优化功能,它允许客户端访问服务时根据端点的拓扑位置,优先将流量路由到与客户端位于同一节点或可用区的端点上,从而减少网络延迟并降低跨区域流量成本。
工作原理
拓扑感知路由通过以下方式工作:
- 拓扑信息收集:EndpointSlice 控制器收集每个端点的拓扑信息(节点、可用区等)
- 提示生成:控制器根据拓扑分布情况为端点生成拓扑提示
- 智能路由:kube-proxy 根据这些提示优先选择本地端点进行流量转发
前提条件
要启用拓扑感知路由功能,需要满足以下条件:
- Kubernetes 版本 1.21+(该功能在 1.23 版本中达到 GA 状态)
- 启用
TopologyAwareHints
特性门控(1.23+ 版本默认启用) - 确保 EndpointSlice 控制器正常运行
- kube-proxy 组件正常工作
EndpointSlice 资源详解
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
:端点所在的地理区域(可选)
启用拓扑感知路由
1. 启用特性门控
对于 Kubernetes 1.23 之前的版本,需要在以下组件中启用特性门控:
# kube-apiserver
--feature-gates=TopologyAwareHints=true
# kube-controller-manager
--feature-gates=TopologyAwareHints=true
# kube-proxy
--feature-gates=TopologyAwareHints=true
2. 配置服务注解
在 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
3. 验证配置
启用后,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"
最佳实践
适用场景
拓扑感知路由特别适用于以下场景:
- 多可用区部署:应用跨多个可用区部署时
- 成本敏感应用:需要减少跨区域网络流量费用
- 延迟敏感应用:对网络延迟有严格要求的应用
注意事项
- 负载均衡考虑:拓扑感知可能导致负载分布不均,需要权衡性能和负载均衡
- 故障转移:当本地端点不可用时,系统会自动回退到其他可用区的端点
- 监控指标:建议监控跨区域流量比例和端点健康状态
故障排查
常见问题
- 提示未生成:检查 Service 注解配置和特性门控状态
- 负载不均:评估端点分布情况,考虑调整副本数量
- 连接失败:验证网络策略和防火墙规则
诊断命令
# 查看 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
标签进行关联管理。