服务发现把变化的实例集合隐藏在稳定服务身份之后

说明 Kubernetes Service、DNS、EndpointSlice 和数据平面怎样把请求连接到动态后端,并区分发现与流量策略。

服务发现把变化的实例集合隐藏在稳定服务身份之后

云原生工作负载的实例地址会因扩缩容、重启和调度不断变化。让调用方保存 Pod IP 清单,很快就会连接到已经退出的实例。服务发现提供稳定名称或虚拟地址,并把它解析为当前可用后端集合;负载均衡再决定一次连接或请求落到哪个后端。

两者密切相关却不是一回事。发现回答“可访问的端点在哪里”,负载均衡回答“这次应该选哪个端点”。Kubernetes Service 将二者的基础能力组合在 API 中,但具体转发方式仍取决于集群数据平面和外部基础设施。

Service 提供稳定的逻辑身份

Service 通过选择器关联一组 Pod,并通常获得稳定的集群地址和 DNS 名称。Pod 可以被替换,调用方仍使用服务名。控制器维护 EndpointSlice,记录当前后端地址、端口和就绪状态,避免调用方理解工作负载生命周期。

选择器必须准确。过宽会把不兼容版本纳入同一服务,过窄则可能没有端点。标签变更相当于流量操作,需要与代码发布同样审查。没有选择器的 Service 也可指向手工或外部端点,但其健康和更新责任不会由 Kubernetes 自动补全。

服务端口、目标端口和命名端口把调用契约与容器监听细节分离。修改目标端口时,客户端仍可使用稳定服务端口;若协议语义本身改变,仅保持端口不变并不能保证兼容。

DNS 与虚拟地址有不同缓存行为

集群 DNS 通常为 Service 提供名称解析。普通 Service 的名称多解析到虚拟地址,再由服务代理或网络实现转发;无头 Service 不分配集群虚拟地址,DNS 可直接返回后端地址,适合由客户端自行发现和选择实例的场景。

DNS 记录会被客户端、运行库和本地缓存保存。端点变化后,过长 TTL 或不正确的永久缓存会继续使用旧地址;过短 TTL 则增加 DNS 压力。调用方应理解所用语言和连接池何时重新解析,而不是假设每个请求都查询 DNS。

现有长连接也不会因 DNS 更新自动迁移。扩容后,新实例可能几乎收不到流量,因为客户端一直复用旧连接;缩容时则需要优雅终止,使连接在端点移除后有时间结束。连接级均衡和请求级均衡的效果因此不同。

EndpointSlice 是后端事实来源之一

EndpointSlice 将大量端点分片,包含地址、端口和就绪等条件。服务数据平面监视 Service 与 EndpointSlice,并通过操作系统或网络组件配置转发。Kubernetes 定义这些 API,却不规定所有实现使用完全相同的代理机制。

就绪状态决定端点是否适合普通流量,但“探针成功”只代表检查条件满足。应用可能仍在业务上错误,或者下游依赖已经饱和。端点健康需要与版本、错误率和容量监测结合。

拓扑感知路由可以优先同区域或同节点端点以降低延迟和跨区成本,但也可能让局部容量不均。策略必须知道每个故障域的副本和流量分布,在区域故障时还要有跨域回退。

负载均衡算法受连接与请求特性影响

轮询、随机、最少连接和一致性哈希各有假设。请求成本相近且连接短时,简单分配可能足够;长连接、流式调用或少数高成本请求会使实例负载严重偏斜。只看连接数也不一定反映 CPU 或队列占用。

会话亲和可以让同一客户端倾向相同后端,但降低均衡效果,并在实例退出时丢失局部状态。更稳健的设计通常把必要状态放到共享或可恢复存储中;确需亲和时,要明确键、时限和故障回退。

客户端负载均衡直接获取端点并自行选择,能感知请求结果和延迟,却使每个客户端承担发现、缓存和熔断复杂度。代理式均衡集中策略,代价是增加一跳和额外故障面。选择应基于协议、规模和运维能力。

集群内发现与外部暴露边界不同

ClusterIP 面向集群内部访问;NodePort、LoadBalancer、Ingress 或 Gateway 等机制可以把服务暴露到集群外。外部负载均衡器可能先选择节点,再由集群数据平面选择 Pod,因此存在多层均衡和源地址转换。

多层策略若不了解彼此,可能产生热点。例如外部设备按少量长连接分配到节点,节点再只转发本地端点,最终负载与 Pod 数量不成比例。排查时应画出每一跳的地址、健康检查和选择算法。

服务发现也不是访问控制。知道服务名不代表应被允许连接。NetworkPolicy、身份认证、授权和加密仍要单独设计;外部暴露还需明确 TLS 终止、主机名和路由所有权。

变更和故障需要端到端验证

扩缩容测试应观察端点更新延迟、DNS 缓存、连接迁移和新实例预热。故障测试应覆盖 Pod 异常、节点断开、DNS 不可用、服务代理故障和外部负载均衡健康检查偏差。

监测需要同时看到请求分布与发现状态:每个端点的流量、错误和延迟,EndpointSlice 数量与就绪变化,DNS 查询失败,以及没有端点的 Service。只有总服务指标时,一个热点实例可能被其他实例平均掉。

稳定服务身份减少了调用方与实例生命周期的耦合,但不会消除容量、版本和协议问题。可靠的服务发现应让端点变化可见、传播时间可测、失败路径可演练,并把均衡选择与应用的真实工作量联系起来。

资料依据