网站首页 > 文章精选 正文
导语
容器跑起来了,怎么联网?K8s 能调度 Pod,那 Pod 能不能互相通信?Service 又是干嘛的?为什么明明 IP 能通,服务就是访问不了?
阅读本文你将收获:
- 容器网络与传统网络的核心区别
- Kubernetes 容器网络模型(CNI)及其背后逻辑
- Pod 网络、Service 网络如何配合工作
- 常见网络故障排查思路
一、从虚拟机到容器,网络复杂了吗?
在虚拟机时代,我们熟悉的网络拓扑长这样:
VM 通过 虚拟网卡 → 接入宿主机网桥 → 上外网
但到了容器世界,网络设计变复杂了 —— 容器生命周期短,IP 随时可能变,K8s 集群又要求容器之间可直接通信,还得让外部访问容器服务。
所以问题来了:
- 每个 Pod 有独立 IP 吗?
- Pod 重启后 IP 会变吗?
- 多个 Pod 如何统一暴露一个服务?
- CNI 是干什么的?
带着这些问题,往下看。
二、Pod 网络模型:每个 Pod 有独立 IP
Kubernetes 的核心网络理念是:
所有 Pod 之间都是“扁平网络”,IP 可达,不需要 NAT。
具体特点:
- 每个 Pod 在启动时会分配一个 IP(通过 CNI 插件)
- Pod 之间通信不需要端口映射
- Pod 所在的容器共享网络命名空间(同一个网卡、IP)
举例说明
kubectl get pods -o wide
输出:
NAME | IP | NODE |
nginx-1 | 10.244.1.5 | node1 |
nginx-2 | 10.244.2.7 | node2 |
两个 Pod 在不同节点,却可以直接 curl 10.244.x.x 通信,这就是“跨主机扁平网络”。
三、CNI 插件:Pod 网络的幕后英雄
Pod 的 IP 是怎么来的?答案是 —— CNI 插件(Container Network Interface)
K8s 并不自己管理网络,而是通过 CNI 调用网络插件完成如下操作:
- 分配 IP 给 Pod
- 配置网络命名空间
- 配置路由和防火墙规则
常见 CNI 插件:
插件 | 特点 |
Flannel | 简单易用,采用 overlay 网络 |
Calico | 支持 BGP,性能好,安全控制强 |
Cilium | 基于 eBPF,支持 L7 网络策略 |
推荐中小集群使用 Flannel,大规模生产集群用 Calico 或 Cilium。
四、Service:解决 Pod IP 易变的问题
Pod 重启 IP 就会变,客户端怎么访问?
Kubernetes 提供了 Service 机制,做了“虚拟 IP + 负载均衡”。
原理:
- Service 会分配一个 ClusterIP
- 会自动将流量转发到后端 Pod(通过 kube-proxy 实现)
- 默认是基于 IPtables 或 IPVS 的负载均衡
举个例子:
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
这个 Service 会自动负载到所有 label 为 app=nginx 的 Pod 上,无需关心 Pod IP。
五、几种 Kubernetes 网络类型对比
类型 | IP 来源 | 是否 NAT | 通信特征 |
Pod IP | CNI 插件分配 | 否 | 扁平互通 |
Cluster IP (Service) | kube-proxy 管理 | 是(SNAT) | 集群内访问服务 |
NodePort | 映射宿主机端口 | 是 | 外部访问集群服务 |
LoadBalancer | 云厂商分配 | 否 | 对外暴露公网入口 |
Ingress | Nginx/TCP代理 | 否 | 多路径统一入口控制 |
六、实际排查思路案例
场景:Service IP 能 ping 通,但 curl 不通
排查步骤:
- kubectl get endpoints → 查看 Service 是否正确绑定 Pod
- iptables-save | grep <svc-ip> → 确认 kube-proxy 是否配置规则
- 检查 Pod 容器端口是否监听
- 检查防火墙、CNI 是否正常工作
总结
Kubernetes 网络听起来复杂,拆解后其实很清晰:
- Pod IP:由 CNI 分配,支持跨节点直接通信
- Service IP:实现 IP 屏蔽与负载均衡
- CNI 插件:实现网络连通的幕后技术
掌握容器网络原理,是你理解 K8s 网络策略、ServiceMesh、流量治理等技术的第一步。
猜你喜欢
- 2025-07-09 别被云原生忽悠了:接地气的 K8s 生产落地长这样
- 2025-07-09 简单了解下Kubernetes网络通信(kubernetes网络模型)
- 2025-07-09 pod结构说明-运行容器的容器(容器中pod是什么意思)
- 2025-07-09 佚名运维 k8s 训练营 - 第1天(k8s运维是什么)
- 2025-07-09 k8s实践(三):pod常用操作(k8s pod service deployment)
- 2025-07-09 Kubernetes 核心概念全景图:Pod、Node、Cluster、Control Plane 等
- 2025-07-09 K8S之调度器-精细控制Pod分布(k8s pod调度过程详解)
- 2025-07-09 【超融合云计算中心】核心K8S容器实践应用指南
- 2025-07-09 Kubernetes从零到精通(01-简介)(kubernetes入门教程)
- 2025-07-09 service详解(service理解)
- 最近发表
-
- Vue3+Django4全新技术实战全栈项目|高清完结
- 工厂模式+策略模式消除 if else 实战
- 每天一个 Python 库:httpx异步请求,让接口测试飞起来
- 如何高效实现API接口的自动化测试?
- 前端工程化:从“手忙脚乱”到“从容协作”的进化记
- 使用C#创建服务端Web API(c#开发web服务器)
- SpringBoot之旅第四篇-web开发(springboot做web项目)
- 一文读懂SpringMVC(一文读懂新型政策性金融工具)
- Rust Web编程:第十二章 在 Rocket 中重新创建我们的应用程序
- Apache Druid 数据摄取——本地数据和kafka流式数据 一篇文章看懂
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)