服务网格 08:服务发现、DNS 与端点更新
DNS 回答没变,为什么请求的后端变了
第 02 篇区分 Service ClusterIP 与 Pod 端点;第 07 篇又增加了代理配置更新。现在让 inventory-v1 下线并增加 inventory-v2:DNS 仍可能答复同一个 Service 入口,而候选端点和代理路由的上游集合发生变化。若应用保留旧连接,某些请求继续打到旧实例;不能用一次 nslookup 的结果解释全部流量。
图中标了两条控制/发现线和一条业务连接线:应用查询 Service DNS;Kubernetes EndpointSlice 描述当前后端;网格控制面可能将相应服务发现变化下发给代理;实际 TCP 连接建立后又有独立生命周期。Istiod 不是业务请求转发节点。
三种“地址”不要混用
应用地址是 inventory 这个主机名加业务端口。普通 ClusterIP Service 的 DNS 回答通常指向稳定虚拟 IP,而不是此次选中的 Pod。EndpointSlice 存放候选后端地址及条件,节点 Service 数据面依据这些资源选择新连接的目标;网格的 Envoy 也可能拥有经控制面下发的 endpoint 集合。具体连接是 orders → ... → 某个 inventory 的当前 TCP socket:连接池或 HTTP/2 多路复用可能让多个请求持续使用同一个已选实例。
这三层有不同缓存:进程或语言运行时可能缓存 DNS;内核/Service 数据面会跟踪连接;Envoy 的 cluster 与连接池有自己的上游状态。DNS TTL 到期不能保证已有 TCP 连接关闭;EndpointSlice 新端点出现不意味着所有代理都已接收或选择它;删除端点也不等于旧连接立即被动迁移。要明确实验是在对比新建连接还是已复用连接,然后才能解释版本分布。不要根据 20 次请求的一个比例猜测默认轮询或健康检查行为。
ServiceEntry 可让 Istio 描述网格外/额外的服务 host、地址与解析策略;它与 Kubernetes Service/EndpointSlice 不是同一对象,也不会自动创建不可逾越的出口网络隔离。具体 resolution、端口协议、DNS 捕获与端点更新路径依冻结的 Istio 版本和配置变化,不能直接把开发中的动态文档示例视为本系列已部署状态。
两轮相同输入的验收设计
用同一 sku=paper 与递增请求 ID 记录 frontend → orders → inventory-v1/v2:
- 先采集调用 Pod 的实际 DNS 查询与搜索域、Service 与 EndpointSlice、被测 orders 代理当前 cluster/endpoint,以及 v1/v2 的请求 ID 日志。发一组新连接与一条复用连接上的多次请求,分别保存后端身份。
- 在隔离实验 namespace 改变 v2 readiness 或副本数,记录资源的 generation/条件与变化时间、代理接受/活跃端点时间,再按同样输入分别测新旧连接。失败/边界条件为 DNS 仍成功但没有就绪后端,必须保存客户端退出码及实际错误,不能猜测代理返回的 HTTP 码。
- 再用本地模拟外部依赖
external-stub建立一条版本已核对的 ServiceEntry 对照,保存资源、网格配置和实际请求路径;本章不能以 ServiceEntry 单独证明出口被防火墙拦截。
前置只读检查(执行目录 examples/service-mesh/,确认实际实验 context 后使用):
1 | |
当前记录 examples/service-mesh/evidence/02/20261001T130351Z-2539112/ 的该检查退出 127,原因 kubectl: command not found;没有集群 DNS 报文、真实 EndpointSlice、Istio 端点下发、新旧连接或 ServiceEntry 请求证据,全部 NOT_RUN。第 00 篇本机错误域名和第 05 篇单进程退出各证明不同的事情,不能替代本章集群结果。
练习与参考解答
- DNS 仍返回同一 ClusterIP,扩容 v2 后新连接偶尔到 v2、旧 HTTP/2 连接仍只到 v1,是否矛盾?参考解答:不矛盾;DNS 为稳定入口,新连接的目标选择与旧连接的后端绑定是独立状态。须检查每个请求复用情况、EndpointSlice 与相关代理的当前端点,以及应用后端日志,不能仅凭 DNS 推断负载均衡按请求发生。
- 创建 ServiceEntry 使
external-stub可路由后,能否认定其他出口已被禁止?参考解答:不能。配置描述被代理识别/路由的服务,不自动替代底层网络访问控制。构造同一 Pod 上访问另一个未声明合成地址的负例,分别检查它是否实际被代理捕获、代理策略以及实验网络层阻断,才能证明边界;此对照尚未运行。
官方资料与系列导航
- Kubernetes DNS 与 EndpointSlice:稳定入口与变化后端。
- Istio ServiceEntry:网格外/额外 host 的模型,版本与默认值待选定版本核验。
- Envoy v1.37.0 Service discovery:cluster 上游发现与更新;本环境未运行二进制。
系列导航:00 基线 → 01 治理 → 02 Service → 03 Envoy → 04 Sidecar → 05 启停 → 06 路由 → 07 xDS → 08 服务发现、DNS 与端点更新(本文)→ 09 HTTP、gRPC 与 TLS。

