兄弟们,今天咱们来聊点硬核的。

有没有人跟我一样,刚学K8s的时候,觉得这玩意儿的网络简直是个玄学?🤯

一堆Pod、Service、Ingress…它们之间到底是怎么通信的?为啥我ping不通?为啥我的服务老是找不到对方?别急,今天这篇,带你彻底搞懂K8s网络那点事儿!


1. 先来打个比方:小区里的快递柜📦

想象一下,你住在一个超级大小区(K8s集群)里。

  • 每个住户就是一个Pod,有自己唯一的门牌号(IP地址)。

  • 但小区经常有人搬家(Pod重启)、新住户入住(扩容)、老住户搬走(缩容),门牌号总变,你怎么收快递?

这时候,小区建了个菜鸟驿站(Service)

你不用记邻居门牌号,只需要把快递寄到驿站,驿站负责帮你找到当前的门牌号。完美!


2. 核心基础:Pod网络是基石

首先,记住K8s网络的第一性原则:

所有Pod都必须可以不经过NAT,直接与其他Pod通信!

无论Pod在哪个节点(Node)上,它们看到的对方IP就是真实的IP。这就需要一个强大的容器网络插件(CNI) 来搞定底层网络,比如Calico、Flannel、Weave等。

👉 这就好比,小区所有住户的门牌号必须是唯一的,且快递车能直接开到你家楼下。


3. Service:服务的“永久VIP”名片🎫

Pod是短暂的,IP老是变。所以K8s发明了Service

  • Service有一个固定的IP(VIP) 和端口,像一个永不变化的电话号码。

  • 它背后通过标签选择器(Label Selector) 绑定了一组Pod(比如所有“前端”Pod)。

  • 流量打到Service上,它负责负载均衡,转发给后端健康的Pod。

Service主要有3种类型:

  1. ClusterIP(默认):只在集群内部用的VIP,小区内部的公共电话。

  2. NodePort:在所有节点上开个端口,让小区外的人也能通过节点IP:端口访问进来。

  3. LoadBalancer:云厂商提供的负载均衡器,给你一个公网IP,相当于小区的豪华大门!


4. Ingress:小区的“智能门卫”🚪

NodePort和LoadBalancer都是暴露4层端口的。那想用域名访问不同的服务(7层HTTP流量)怎么办?

比如,a.com去前台,b.com去后台。

这就需要Ingress!它不是一个服务,而是一个路由规则集合,是一个智能门卫。

  • 你告诉门卫规则:“看到拿a.com快递的,带他去前台;拿b.com的,带去后台。”

  • 门卫本身需要一个大门口才能站岗,所以Ingress需要和一个LoadBalancerNodePort类型的Service配合使用。

常见的“门卫”实现是Nginx Ingress ControllerTraefik


5. DNS:集群内部的“114查号台”📞

在小区里,你记不住驿站电话怎么办?打114查啊!

K8s集群内置了CoreDNS服务。它会为Service和Pod提供DNS记录。

  • 比如,你有个Service叫user-service,在同一个命名空间里,你直接通过user-service这个域名就能访问到它!

  • 不同命名空间?user-service.default.svc.cluster.local。是不是像内部电话分机号?


总结一下核心思想:

  1. Pod间通信:靠CNI插件实现的扁平网络,直接IP对IP。

  2. 服务发现:靠Service的固定IP和DNS,避免直接记易变的Pod IP。

  3. 对外暴露:ClusterIP(对内)、NodePort(简易对外)、LoadBalancer(云上豪华对外)。

  4. HTTP路由:靠Ingress这个“智能门卫”根据域名和路径转发流量。

  5. DNS:集群内部的电话簿,让你用名字而不是IP来访问服务。


💡 最后留个思考题:

如果你在Pod里curl另一个服务的Service IP,是谁最终把流量转发到目标Pod的?

是Service吗?🤔

(答案:不是!Service的IP只是一个虚拟IP,真正干活的是每个节点上的kube-proxy组件,它通过iptables或IPVS规则,拦截到Service IP的流量,然后做DNAT转发到真实的Pod IP上!惊不惊喜!)


觉得有用的兄弟,点赞收藏转发三连!下次咱们再深挖CNI插件是怎么实现这套网络的!告辞!👋

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐