网易首页 > 网易号 > 正文 申请入驻

谷歌K8s把服务发现藏了8年,运维发现后集体破防

0
分享至


一个Pod重启,IP地址从10.244.1.5变成10.244.2.10。你的微服务集群里,这样的地址漂移每天发生上千次。

谷歌的Kubernetes(容器编排系统,简称K8s)从2014年开源至今,解决了容器调度、弹性扩缩容、故障自愈,却把一个最基础的问题留给了用户:服务之间怎么互相找到对方?

这不是配置问题,是架构设计的选择。理解它,才能理解为什么你的服务网格(Service Mesh)方案总是过度设计。

Pod的"房间号"每天都在变

K8s给每个Pod分配独立IP,这设计看似优雅——每个容器像一栋大楼里的独立房间,有自己的门牌号。房间之间可以直接通话,无需中转。

但Pod是临时的。崩溃重启、滚动更新、水平扩缩,都会让旧Pod消失、新Pod诞生。新Pod拿到新IP,旧地址永久失效。

想象一家咖啡店:周一在101室,周二系统崩溃后重生到205室,周三为了应对早高峰同时开了101、205、302三个分店。你的老顾客该去哪找咖啡?

这正是K8s原生网络模型的残酷现实。IP地址不是身份标识,只是临时坐标。 用IP直接访问服务,等于把系统稳定性建立在流沙之上。

谷歌的工程师当然知道这个问题。他们的解法不是修改Pod模型——那样会打破K8s的设计哲学——而是在之上叠加一层抽象。

Service:大楼前台的"转分机"机制

K8s的Service(服务)本质上是一个稳定的DNS条目加四层负载均衡。它不指向具体Pod,而指向一组Label(标签)匹配的Pod集合。

用咖啡店的类比:你不再记房间号,而是拨打"咖啡店转分机"。前台系统实时查询哪些房间挂着"咖啡店"门牌,把电话转过去。101室关了?自动转205。三个分店都在?轮流分配客流。

这个设计的精妙之处在于解耦。调用方只认Service名字,不关心后端拓扑;运维方随意扩缩、替换Pod,上游无感知。

Service拿到一个ClusterIP(集群内部虚拟IP),这个地址比Pod IP稳定得多——只要Service对象不被删除,ClusterIP不变。但注意,ClusterIP只在集群内部可达,外部流量需要NodePort或Ingress(入口网关)额外暴露。

这里藏着K8s的第一个"坑":很多团队早期直接用Pod IP做服务间调用,或者把Service当DNS用却忽略了缓存问题。CoreDNS(K8s默认DNS服务)的默认TTL(生存时间)是5秒,意味着客户端可能缓存过期地址长达半分钟。

Endpoints:前台背后的实时花名册

Service本身不存储Pod列表。真正干活的是Endpoints(端点)对象——一个自动维护的IP:Port列表,由K8s控制平面实时同步。

当你创建一个Service,K8s的Endpoint Controller(端点控制器)开始监听所有匹配Label的Pod。Pod Ready(就绪)状态变化?Endpoints列表秒级更新。Pod被删除?立刻从列表剔除。新Pod启动?加入轮换。

kube-proxy(K8s的网络代理组件)在每个节点运行,它把Service的ClusterIP映射到本地iptables(Linux防火墙规则)或IPVS(虚拟服务器)规则。流量命中ClusterIP时,被透明地DNAT(目标地址转换)到某个后端Pod。

这个机制从2014年沿用至今,简单、可靠、无额外依赖。但它有两个隐性成本:

第一,网络跳数。流量从客户端Pod出发,先到本节点kube-proxy做DNAT,再路由到目标节点,最后进入目标Pod。跨节点通信至少多一跳。

第二,扩缩容抖动。大规模集群中,Endpoints对象可能包含数千个条目。每次Pod变动触发全量列表推送,控制平面和网络代理的压力随规模线性增长。

2020年,K8s引入EndpointSlice(端点切片)作为替代。把一个大Endpoints对象拆成多个切片,按需分发,更新粒度更细。但底层逻辑没变:还是"前台转分机"模式。

DNS的陷阱:名字解析不是免费的

Service的名字通过DNS暴露,格式是service-name.namespace.svc.cluster.local。这给了开发者"像访问网站一样访问内部服务"的幻觉。

但DNS在K8s里是多层架构。Pod里的应用发起查询→本地DNS缓存(如nscd或systemd-resolved)→CoreDNS Pod→etcd(K8s的分布式键值存储)中的DNS记录。

任何一层缓存过期、CoreDNS Pod重启、etcd网络分区,都会导致解析失败或返回过期IP。更隐蔽的是NDOTS配置:Linux默认的DNS搜索域后缀数量是1,K8s为了支持短域名(直接写coffee-shop而非全限定名)把它设成5。这意味着每次DNS查询可能触发5次递归尝试,延迟暴涨。

我见过一个生产事故:某团队的服务间调用P99延迟突然从5ms跳到200ms。根因是新部署的Java应用使用了默认JVM DNS缓存,TTL永不刷新,而上游Service的后端Pod已经全换了一遍。应用拿着5个过期IP疯狂重试,超时后 fallback 到下一个,恶性循环。

解决方案?要么禁用JVM DNS缓存(-Dsun.net.inetaddr.ttl=0),要么改用K8s的Headless Service(无头服务)直接返回Pod IP让客户端自己负载均衡,要么上Service Mesh接管服务发现。

Headless Service:当"前台转分机"不够用时

把Service的clusterIP: None,它就变成Headless Service。DNS查询不再返回虚拟IP,而是直接返回所有后端Pod的A记录。

这有什么用?

StatefulSet(有状态应用集)需要它。MySQL主从、Redis Cluster、ZooKeeper——这些系统要求客户端知道每个节点的具体身份,不能透明负载均衡。Headless Service让DNS返回mysql-0.mysql.default.svc.cluster.localmysql-1.mysql.default.svc.cluster.local这种可预测的FQDN(全限定域名),配合稳定的网络标识(Pod名即主机名),实现有状态服务的身份持久化。

另一个场景是客户端负载均衡。某些RPC框架(如gRPC)更愿意自己维护连接池,根据实时健康状态做智能路由。Headless Service给它们提供"原始素材",把负载均衡策略从kube-proxy手里拿回来。

代价也很明显:应用层必须处理IP变动。Pod重启后DNS记录更新有延迟(默认5秒TTL),这段时间客户端可能连到黑洞。gRPC的Name Resolver(名称解析器)需要配置serviceConfig做优雅处理,否则就是连锁故障。

ExternalName:给外部世界一个"分机号"

不是所有依赖都在K8s里。你的MySQL可能是云厂商的托管实例,Redis可能是ElasticCache,支付网关可能是第三方SaaS。

ExternalName类型的Service把这些外部端点纳入K8s的命名体系。创建一个ExternalName Service指向prod-mysql.example.com,集群内应用就可以用mysql.default.svc.cluster.local访问它,和访问内部服务完全一致。

这看似只是语法糖,实则统一了服务契约。配置管理、监控埋点、访问控制都可以基于Service名字做,无需区分内外。哪天把外部MySQL迁进K8s?改Service类型,上游零感知。

但注意:ExternalName只是DNS层面的CNAME记录,没有健康检查、没有负载均衡、没有连接管理。如果prod-mysql.example.com背后只有单IP,它挂了就是挂了,K8s不会帮你切流。

Ingress与Gateway:当"分机号"需要对外开放

ClusterIP只在集群内可达。要让外部流量进来,传统方案是NodePort(节点端口)——在每个节点开固定端口,把流量转发到Service。端口范围30000-32767,URL变成http://node-ip:30080,生产环境几乎不可用。

Ingress(入口)是K8s的七层路由抽象。你部署一个Ingress Controller(如Nginx Ingress、Traefik),它监听集群外的80/443,根据Host和Path规则把流量分发到不同Service。

Ingress API的设计堪称K8s史上最混乱的章节之一。它只定义了最小公约数:Host、Path、Service后端、TLS终止。高级功能(重写、限流、认证、灰度发布)全靠各Controller的自定义Annotation(注解),没有可移植性。

2022年,Kubernetes Gateway API(网关API)正式发布,试图终结这种混乱。它把路由、后端、策略拆成独立资源,支持多租户、多协议(HTTP/TCP/UDP/gRPC)、更细粒度的流量控制。

但迁移成本是真实的。Nginx Ingress的生态积累太深,很多团队宁愿继续写nginx.ingress.kubernetes.io/rewrite-target这种咒语,也不愿拥抱新标准。

Service Mesh:当"前台转分机"成为瓶颈

回到最初的问题:kube-proxy的DNAT方案,在超大规模集群中开始吃力。每次Service后端变动,全集群的iptables规则都要刷新,延迟和CPU消耗不可忽视。

更深层的问题是可观测性安全。Service只解决"找到对方",不解决"加密通信""身份认证""细粒度授权""调用链追踪"。这些需求催生了Service Mesh(服务网格):Istio、Linkerd、Consul Connect。

Service Mesh的核心是Sidecar(边车)代理。每个Pod里除了业务容器,再注入一个Envoy(或类似代理)。所有进出流量被劫持到Sidecar,它完成服务发现、负载均衡、mTLS(双向TLS)、指标采集、故障注入。

服务发现机制也变了:不再依赖K8s Service和DNS,而是直接对接控制平面(如Istiod)获取全量端点列表,基于实时健康状态做智能路由。这消除了DNS缓存和kube-proxy的中间层,但也引入了新的复杂度——Sidecar本身的资源消耗、启动延迟、配置传播时延。

一个常被忽视的真相:Service Mesh不是K8s服务发现的替代,而是增强。 你完全可以保留K8s Service作为"兜底",只在需要高级功能的命名空间启用Mesh。很多团队的实践是渐进式采用:先让Mesh接管东西向流量,南北向继续走Ingress。

2024年的新变量:K8s原生服务网格

Istio的维护者——Google、IBM、Red Hat——在2022年把项目捐赠给CNCF(云原生计算基金会),但社区对Sidecar模式的抱怨从未停止。每个Pod多一个容器,意味着多30-100MB内存、多1-3秒启动时间、多一层故障点。

2023年,Istio推出Ambient Mesh(环境网格)模式。Sidecar变成可选,改为在每个节点运行ztunnel(零信任隧道)和waypoint(路径点代理)。无加密需求的流量走ztunnel直接转发,需要七层处理的才经过waypoint。资源开销大幅降低,但架构复杂度上升。

同期,Cilium(基于eBPF的容器网络方案)推出Service Mesh功能,完全无Sidecar。利用Linux内核的eBPF(扩展伯克利包过滤器)技术,在数据平面直接完成负载均衡、可观测性、安全策略,无需用户态代理。

这些演进的共同指向是:服务发现正在从"用户态代理"回退到"内核态或控制平面直接处理"。 K8s的原始设计——Service + Endpoints + kube-proxy——在简单场景依然够用,但边界不断被压缩。

一个被忽视的替代方案:直接走Pod网络

回到Networking 101的类比。K8s的Pod网络是"全连通"的——任何Pod可以直接访问任何Pod的IP,无需NAT。

这意味着,如果你愿意放弃Service的负载均衡和故障转移,完全可以自己实现服务发现。用K8s API Watch(监听)Pod变化,维护本地端点缓存,直接对Pod IP建连接。

一些高性能场景确实这么做。比如Cassandra、Kafka这类数据系统,它们有自己的集群成员协议(Gossip),只需要K8s提供稳定的Pod标识(Headless Service + StatefulSet),网络层完全自建。

更激进的方案是跳过K8s网络,直接用主机网络(hostNetwork: true)或SR-IOV(单根I/O虚拟化)网卡直通。延迟最低,但牺牲了K8s的调度灵活性和安全隔离。

选型建议:没有银弹,只有权衡

对于25-40岁的技术决策者,我的建议是分层看待:

小规模集群(<50节点,<100服务):K8s原生Service + CoreDNS足够。关注DNS缓存配置,监控CoreDNS的转发延迟和丢包率。

中等规模(50-500节点):评估是否需要Headless Service让客户端做负载均衡,或者引入External-DNS把Service同步到外部DNS(如Route53、Cloudflare),简化跨集群发现。

大规模或强合规场景:Service Mesh是必选项,但不必全盘Istio。Linkerd更轻量,Cilium Service Mesh对eBPF友好团队更自然。关键指标是Sidecar资源占比——如果超过业务容器的15%,考虑Ambient模式或无Sidecar方案。

混合云/多集群:K8s的Service发现止步于集群边界。需要Submariner、Cilium Cluster Mesh或Istio多集群模式打通。这些方案的运维复杂度常被低估,建议从联邦控制平面(Federation v2)的教训中吸取经验——不要过早追求"一个平面管理所有集群"。

一个具体的产品细节:Google GKE(Google Kubernetes Engine)在2023年把Dataplane V2(基于eBPF的网络策略和可观测性)设为默认,kube-proxy被完全绕过。这是云厂商层面的优化,自建集群的工程师需要评估Cilium或Calico eBPF数据平面的成熟度。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
张雪峰妻子:高校副教授历史博士,相差7岁认识40天闪婚

张雪峰妻子:高校副教授历史博士,相差7岁认识40天闪婚

赵昉是个热血青年
2026-03-25 15:40:01
黄文雅任深圳市政府副秘书长,此前任龙岗区委副书记

黄文雅任深圳市政府副秘书长,此前任龙岗区委副书记

南方都市报
2026-03-25 20:54:03
48岁王阳开奔驰接女儿放学!又高又瘦一点不油腻,5岁女儿好可爱

48岁王阳开奔驰接女儿放学!又高又瘦一点不油腻,5岁女儿好可爱

乐悠悠娱乐
2026-03-25 10:32:20
被抓后家中查出20吨黄金?秘密移民国外?赵本山身上的谣言太离谱

被抓后家中查出20吨黄金?秘密移民国外?赵本山身上的谣言太离谱

潮鹿逐梦
2026-03-24 17:58:35
可能出大事了,四名军工系统院士被除名,释放的信号让人不敢细想

可能出大事了,四名军工系统院士被除名,释放的信号让人不敢细想

张嘴说财经
2026-03-25 23:07:05
崩了,知名光伏公司大规模停产,大面积待岗!

崩了,知名光伏公司大规模停产,大面积待岗!

黯泉
2026-03-25 21:36:39
张雪峰一生挚爱国足:想当国脚夺世界杯 国足若进决赛愿死在现场

张雪峰一生挚爱国足:想当国脚夺世界杯 国足若进决赛愿死在现场

念洲
2026-03-25 06:43:05
伊朗已非头号大敌,特朗普调转枪口,美国“内战”或进入倒计时

伊朗已非头号大敌,特朗普调转枪口,美国“内战”或进入倒计时

兴史兴谈
2026-03-24 22:36:43
梁兴初被隔离审查8年,自由后叶帅给出两个选择,梁:一个也不要

梁兴初被隔离审查8年,自由后叶帅给出两个选择,梁:一个也不要

兴趣知识
2026-03-25 12:32:27
山东大胜20分!广东狂胜42分!辽宁输7分,上海赢32分,排名大变

山东大胜20分!广东狂胜42分!辽宁输7分,上海赢32分,排名大变

老吴说体育
2026-03-25 21:52:52
詹姆斯愿降薪2000万!为留里夫斯+争冠布局41岁老詹主动让出顶薪

詹姆斯愿降薪2000万!为留里夫斯+争冠布局41岁老詹主动让出顶薪

阿晞体育
2026-03-25 13:01:56
刘亦菲真空上阵宝格丽!身形肥硕但事业线干瘪,一个动作全网怒赞

刘亦菲真空上阵宝格丽!身形肥硕但事业线干瘪,一个动作全网怒赞

涵豆说娱
2026-03-24 10:41:07
王毅判断没错,短短三天中方见识了:比利时的虚伪、西班牙的真诚

王毅判断没错,短短三天中方见识了:比利时的虚伪、西班牙的真诚

影孖看世界
2026-03-24 22:52:36
泡泡玛特闪崩,市值蒸发600亿!发生了什么?

泡泡玛特闪崩,市值蒸发600亿!发生了什么?

说财猫
2026-03-25 16:45:41
辗转4队!C罗15岁儿子赴皇马试训:有望加盟U16 子承父业

辗转4队!C罗15岁儿子赴皇马试训:有望加盟U16 子承父业

叶青足球世界
2026-03-25 19:08:47
中美都在赌,美国赌中国不敢打日本,而中国则在赌美国不会下场

中美都在赌,美国赌中国不敢打日本,而中国则在赌美国不会下场

南权先生
2026-03-24 15:30:39
这4种鱼,可能含有甲醛和重金属,建议:还是少吃比较好!

这4种鱼,可能含有甲醛和重金属,建议:还是少吃比较好!

阿龙美食记
2026-03-24 21:52:23
辣椒被关注!研究发现:癌症患者吃辣椒,或引发六种关键变化

辣椒被关注!研究发现:癌症患者吃辣椒,或引发六种关键变化

全球军事记
2026-02-26 11:27:44
刚夺冠就1轮游?塔猜亚首轮战克星,或延续不胜纪录,丁俊晖受益

刚夺冠就1轮游?塔猜亚首轮战克星,或延续不胜纪录,丁俊晖受益

刘姚尧的文字城堡
2026-03-25 08:38:43
髌腱撕裂!赛季报销!NBA生涯可能也结束了…

髌腱撕裂!赛季报销!NBA生涯可能也结束了…

左右为篮
2026-03-25 09:48:29
2026-03-26 00:36:49
全栈遛狗员
全栈遛狗员
白天跟需求对线,晚上在小区遛狗。
41文章数 0关注度
往期回顾 全部

科技要闻

红极一时却草草收场,Sora宣布正式关停

头条要闻

伊朗放话愿意与"主和派"万斯谈 特朗普表态

头条要闻

伊朗放话愿意与"主和派"万斯谈 特朗普表态

体育要闻

35岁替补门将,凭什么入选英格兰队?

娱乐要闻

张雪峰经抢救无效不幸去世 年仅41岁

财经要闻

管涛:中东局势如何影响人民币汇率走势?

汽车要闻

智己LS8放大招 30万内8系旗舰+全线控底盘秀实力

态度原创

亲子
本地
教育
健康
公开课

亲子要闻

2026年幼儿园定了!3大硬变化关乎每家娃,带娃的长辈早知道不亏

本地新闻

来永泰同安 赴一场春天的约会

教育要闻

高考地理中的库容量与蓄水量

转头就晕的耳石症,能开车上班吗?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版