Skip to content

Kubernetes服务发现面试题:标准回答与原理跳转

本页只保留面试标准回答、追问边界和精确原理入口。完整对象链、Demo和生产Runbook见Kubernetes服务发现主线

高频问题

问题标准回答原理页
Kubernetes怎样实现服务发现Service提供稳定名称和端口;EndpointSlice Controller根据selector、Pod地址和Ready生成后端;CoreDNS负责解析;kube-proxy或eBPF把新连接映射到Endpoint。对象链请求流程
Service和EndpointSlice区别Service是稳定身份和选择规则;EndpointSlice是动态后端地址、端口和条件快照。Slice不转发网络包。正确模型
ClusterIP是真实监听IP吗通常不是普通网卡地址,也没有每个Service一个进程listen。iptables、IPVS或eBPF匹配VIP和端口并映射到Pod。请求流程
kube-proxy一定转发每个包吗不能这样说。iptables/IPVS主要由内核规则和Conntrack完成;部分集群由eBPF替代。排查先识别真实数据面。数据面对比
EndpointSlice为什么替代Endpoints单一Endpoints在大规模后端下对象大、更新成本高;EndpointSlice分片保存端点并支持更多条件、拓扑和双栈信息。EndpointSlice
ready、serving、terminating区别ready表示是否接普通新流量;serving表达是否仍在服务;terminating表示Pod正在终止。具体处理受版本和实现影响。Endpoint条件
Pod Running为什么不能接流量Running不证明Spring初始化、配置、线程池和关键资源可用。应由startup保护启动,再由readiness决定接流。启动传播
Readiness失败后流量立刻消失吗不会。Pod Condition、EndpointSlice和各Node数据面异步传播,已有TCP、HTTP/2或gRPC连接也可能继续存在。条件传播终止
Service按请求轮询Pod吗通常是四层连接级选择。连接建立时选Endpoint,Conntrack和连接复用让多个HTTP请求继续到同一Pod。连接级负载
gRPC扩容后为何不均衡少量HTTP/2 Channel多路复用大量RPC;旧Channel不会因Endpoint增加自动迁移。要治理Resolver、子连接和连接生命周期。gRPC倾斜
Headless Service是什么clusterIP: None,没有普通ClusterIP转发,DNS返回端点,客户端负责刷新、选择、重试和连接管理。Headless
Headless下线后为何仍访问旧PodJVM、OS、DNS、应用Resolver和连接池可能缓存旧地址,已有连接也不会自动断开。HeadlessDNS
CoreDNS返回ClusterIP后Pod变化要改DNS吗普通ClusterIP DNS返回稳定VIP,Pod变化由EndpointSlice和数据面收敛;Headless返回端点,缓存直接影响收敛。DNS
ndots为何可能导致DNS变慢点数低于ndots时Resolver可能拼接多个search domain尝试,外部域名也会多次查询。DNS
Service与Nacos/Dubbo区别ClusterIP由平台数据面选Pod;Nacos/Dubbo通常由客户端维护实例并选择;Headless交给客户端;Mesh交给代理。方案对比
Spring Cloud LoadBalancer和Service能同时用吗可以,但要明确边界。双层选择和多层重试会增加不确定性,应明确地址、选择层、Deadline和重试预算。Spring Cloud接入
Pod怎样优雅摘流Readiness和EndpointSlice先传播摘流,应用停止接新业务并完成有界在途请求,客户端关闭旧连接,在宽限期内退出;写操作仍需幂等。终止时间线
Pod删除后为何还有请求数据面未同步、旧长连接、Ingress/Mesh/LB缓存、Headless旧地址或直接PodIP都可能造成。终止边界Runbook
DNS成功但请求超时怎么查核对Service端口、全部EndpointSlice、Pod监听、直连Pod、同/跨Node、数据面、NetworkPolicy和Conntrack。取证Runbook
SessionAffinity能保存登录吗不能。ClientIP受NAT、网络变化和Pod下线影响;登录应使用Token或共享存储。会话亲和
Java 8/Boot 2与Java 17+/Boot 3发现原理不同吗Kubernetes对象链不变;差异在Spring依赖矩阵、Jakarta迁移、Actuator、Observation和客户端兼容性,两条基线要分别验证。双基线

场景题:滚动发布出现1%失败

先按版本、Pod、Node、调用方和连接类型拆分错误,再对齐DeletionTimestamp、Pod Ready、EndpointSlice条件、节点同步、SIGTERM和连接关闭时间线。Kubernetes摘流是异步传播,已有Keep-Alive、HTTP/2和gRPC连接不会自动迁移,因此还要检查Ingress、Mesh和客户端Drain。配置上使用startup/readiness、优雅关闭和足够宽限期;业务上保证新旧接口与Schema兼容,写请求使用幂等键和结果查询。

原理入口:启动传播终止流程滚动发布Runbook

场景题:扩容后短暂有效,随后又倾斜

扩容只增加可选Endpoint,不迁移已有连接。少量HTTP/2或gRPC Channel可能继续固定旧Pod,新Pod只承接新连接;若数据库、锁或第三方已饱和,短暂提升后仍会回落。应同时看Endpoint快照、每Pod连接数、每连接请求数、P99和下游资源,而不只看Pod数。

若指MQ消费者,应回到消息堆积与Lag分布分析分区上限、热点分区、慢消息、下游瓶颈和重试风暴。

项目回答模板

我们以Service提供稳定身份,EndpointSlice保存Ready后端,CoreDNS负责解析,节点数据面完成新连接到Pod的映射。应用用startup保护慢启动、readiness控制接流,并实现SIGTERM优雅关闭。我们明确HTTP连接池和gRPC Channel是连接级负载,扩容时观察每Pod连接数。故障按DNS、Service、全部EndpointSlice、Pod、Node数据面和应用逐层取证。Java 8/Boot 2存量和Java 17+/Boot 3新服务使用各自兼容的Spring Cloud发行列,但Kubernetes对象链一致。

本章小结

高质量回答必须同时提到稳定身份、动态后端、DNS、数据面、连接复用和异步传播。只说“Service根据label负载到Pod”无法解释滚动发布失败、长连接倾斜和摘流残留。