它管的是集群内流量路径
internalTrafficPolicy 只影响集群内部通过 ClusterIP 访问 Service 的路径:取 Cluster(默认)时,流量可以转发到任意节点的后端;取 Local 时,kube-proxy 只把流量交给本节点上的后端 Pod,少一次跨节点跳转,延迟与出口流量都更省。代价是节点上没有该 Service 的后端时,来自本节点的请求会被丢弃,而不是绕道转发。集群外部流量由 externalTrafficPolicy 单独控制,两者互不替代。
基本信息
| 适用平台 | Kubernetes Service 字段,较新版本中已稳定,老版本按特性开关对待 |
|---|---|
| 关键字段 | spec.internalTrafficPolicy |
| 取值 | Cluster(默认,任意后端)|Local(仅本节点后端) |
| 作用范围 | 仅集群内 ClusterIP 访问,不影响外部流量 |
| 对应字段 | externalTrafficPolicy 控制外部流量路径 |
典型使用场景
- 降低同节点调用的延迟:节点本地访问本地副本,减少一次转发
- 节省跨节点流量:集群内东西向流量大时优先本地转发
- 就近读取:配合本地缓存或本地盘数据,避免跨节点访问远端副本
- 与外部 Local 策略配套:让内外路径的语义保持一致
- 验证节点分布:排查服务在哪些节点上真正有可用的后端
配置与检查
配置与检查
apiVersion: v1
kind: Service
metadata:
name: web
namespace: prod
spec:
internalTrafficPolicy: Local # 仅使用本节点上的后端
selector:
app: web
ports:
- port: 80
targetPort: 8080核对分布与生效情况
核对分布与生效情况
kubectl get svc web -n prod -o jsonpath='{.spec.internalTrafficPolicy}'
kubectl describe svc web -n prod | grep -i -E 'traffic|endpoints'
kubectl get pods -l app=web -o wide # 看副本分布在哪些节点
kubectl get endpointslices -l kubernetes.io/service-name=web -n prod取值与影响
| 取值 | 流量路径 | 注意 |
|---|---|---|
| Cluster | 可转发到任意节点的后端 | 多一次跳转,分布更均匀 |
| Local | 只使用本节点上的后端 | 本节点无后端时请求被丢弃 |
| externalTrafficPolicy: Local | 约束的是外部流量入口 | 与集群内策略是两个不同字段 |
Local 是硬限制而不是偏好:节点上没有对应后端时请求会失败,副本数少、节点分布不均的服务开启前,先确认后端是否覆盖了会发起访问的节点。
与拓扑感知路由(trafficDistribution)语义不同:后者表达的是「尽量就近」,前者决定「是否允许跨节点」,混用预期容易得出错误结论。