5月29日 22:48

DNS 在微服务架构中怎么做服务发现?

DNS 服务发现就是用域名代替硬编码 IP:服务 A 调用 service-b.namespace.svc.cluster.local,DNS 返回 service-b 的 IP。Kubernetes 内置 CoreDNS 实现了这套机制——每个 Service 自动注册 DNS 记录。优点:零代码改造、语言无关、兼容现有 HTTP 客户端。缺点:DNS 缓存导致服务上下线有延迟(默认 TTL 30s)、无法做健康检查和负载均衡策略定制。

追问

DNS 服务发现和 Consul/Nacos 有什么区别?

DNS 发现只做域名→IP 映射,无健康检查、无权重路由、无配置中心。Consul/Nacos 是专用服务发现:实时健康检查、权重负载均衡、灰度发布、配置热更新。K8s 中小规模用 DNS 足够,大规模+精细化流量管理用 Istio/Consul。

DNS 缓存导致服务下线延迟怎么办?

缩短 TTL(K8s CoreDNS 默认 5s)+ 客户端缩短 DNS 缓存时间。根本方案:配合 K8s 就绪探针,Pod 先标记 NotReady 再优雅关闭。

Headless Service 和普通 Service 有什么区别?

普通 Service 分配 ClusterIP,DNS 返回 VIP。Headless Service 不分配 VIP,DNS 直接返回所有 Pod IP——客户端自己做负载均衡。适合 StatefulSet 场景。

跨命名空间的服务发现怎么写?

service-b.other-namespace.svc.cluster.local,完整 FQDN 指定命名空间。同命名空间可简写 service-b。

DNS 服务发现能做金丝雀发布吗?

单独用 DNS 不行——DNS 只能返回一组 IP,无法按比例分配流量。需要 Istio VirtualService 或 Deployment 配合 label selector 切换版本。

标签:Java