大家好!如果您一直在运营Kubernetes集群,那么您可能曾经有过这样的疑问。
“为什么这么多Pod能够瞬间获得IP地址并相互通信?” 🤔 “特别是在大规模集群中,这些大量的IP地址是谁,又是如何管理的呢?”
这个神奇过程的核心是CNI (Container Network Interface),而今天,我们将深入探讨最热门的CNI之一——Cilium的核心,即IPAM。如果您能读完这篇文章,您将明白Pod的IP分配不再是魔法,而是一项精心设计的技术!🚀

💡 IPAM,先从名字开始了解!
IPAM是Internet Protocol Address Management的缩写。顾名思义,它表示“互联网协议地址管理”。
简单来说,这就像图书馆的图书管理员(IPAM)给进入图书馆的学生(Pod)分配空座位号(IP地址)一样。📚 正如学生需要找到座位才能开始学习一样,Pod也需要分配IP地址才能开始与其他Pod通信。
在Cilium中,IPAM正是负责这一核心职责,即为集群内的所有Pod分配唯一的IP地址,并在使用结束后回收和管理它们。
🌐 全局视图:IPAM在Cilium网络中的位置
要正确理解IPAM,需要了解其整体背景。Cilium不仅仅是一个分配IP的工具。它是一个利用强大的eBPF技术提供网络、安全和可观测性的解决方案。
- Pod创建请求 ➡️ 用户执行kubectl apply -f my-pod.yaml命令。
- 调度 ➡️ Kubernetes调度器将Pod放置到最合适的节点(Node)上。
- CNI调用 ➡️ 该节点的Kubelet调用Cilium CNI插件,请求“为这个Pod设置网络!”
- IPAM的活跃 ✨ ➡️ 就在这一步,Cilium IPAM登场了!它从节点预分配的IP段中取出一个可用的IP地址,并分配给Pod。
- 网络设置完成 ➡️ Cilium利用分配的IP和eBPF配置Pod的网络接口,并应用必要的网络策略(安全规则)。
- Pod运行中 ✅ ➡️ 现在Pod拥有了IP地址,并准备好与集群内的其他Pod通信。
因此,IPAM在Pod获得生命(网络)的过程中扮演着启动第一步的重要角色。
🔧 Cilium IPAM如何工作? (feat. IPAM Modes)
Cilium IPAM最大的特点是提供了多种“模式(Mode)”,可以针对不同环境采用最优的IP管理策略。我们来看看两种最具代表性的模式。
1. 集群池 (默认模式)
这是最常用的默认模式。它预先定义一个用于整个集群的大型IP段(cluster-pool-ipv4-cidr),然后为每个节点分配一个较小的IP段(PodCIDR)。
工作方式:
- Cilium Operator监控集群中的每个节点。
- 当新节点加入集群时,Operator会为该节点分配一个PodCIDR。例如,将10.0.1.0/24分配给node-1,将10.0.2.0/24分配给node-2。
- 部署在节点上的Cilium代理会在每次创建Pod时,从其分配的PodCIDR中分配一个IP地址。
这种方式将IP段按节点隔离,消除了IP冲突的风险,并且由于每个节点独立分配IP,因此非常快速高效,没有中央依赖性。👍
以下是通过CiliumNode资源查看IP段如何实际分配给节点的示例。
# kubectl get ciliumnodes node-1 -o yaml
apiVersion: cilium.io/v2
kind: CiliumNode
metadata:
name: node-1
spec:
ipam:
# 可以看到分配给node-1的IP段。
pod-cidrs:
- 10.0.1.0/24
# 当前正在使用的IP列表。
pool:
10.0.1.132:
owner: app-pod-1
resource: pod
10.0.1.200:
owner: app-pod-2
resource: pod
status:
ipam:
# 可用IP数量
available: 252
# 正在使用的IP数量
used: 2
2. 云提供商集成模式 (AWS ENI, Azure IPAM等)
在AWS、GCP、Azure等云环境中,有更智能的方法。那就是直接利用云提供商的网络服务!例如,在AWS环境中可以使用ipam: eni模式。
工作方式 (基于AWS ENI):
- Cilium会为节点的EC2实例额外连接一个ENI (Elastic Network Interface)。
- 每个ENI可以分配多个辅助私有IP地址。
- 当Pod创建时,Cilium会直接将分配给此ENI的IP地址分配给Pod,而无需单独的叠加网络。
这种方式的最大优点是能够100%利用云原生性能。没有叠加封装过程,减少了网络延迟,并且可以将云的VPC Flow Logs或安全组等功能直接应用于Pod级别。☁️
❌ 这不是IPAM! (常见误解)
为了明确IPAM的作用,指出IPAM不是什么也很重要。
- 服务发现 (Service Discovery) ❌
- IPAM为Pod分配10.0.1.132这样的实际IP。但我们通常不直接使用这个IP,而是通过my-service这样的服务名称访问Pod。将服务名称转换为IP地址是CoreDNS和Kubernetes Service的职责。IPAM是创建地址簿的角色,服务发现是在地址簿中查找名称的角色。🗺️
- 流量路由和策略应用 (Routing & Policy) ❌
- 如果IPAM“授予”了Pod IP,那么实际“传输”从Pod A到Pod B的数据包,并“应用”诸如“A可以与B通信但不能与C通信”之类的安全策略,则由Cilium的eBPF引擎负责。IPAM的角色是分配地址,而实际的交通管制则由eBPF完成。🚦
- 外部流量管理 (Ingress) ❌
- 决定将来自集群外部的流量发送到哪个服务是Ingress Controller或Gateway API的职责。IPAM专注于管理集群内部的IP地址。🚪
✨ 结论:管理良好的IP是集群稳定性的保障!
到目前为止,我们已经探讨了Cilium IPAM是什么,它是如何工作的,以及它在整个网络管道中扮演的角色。
为Pod分配IP地址看似简单,但在数百、数千个Pod动态创建和销毁的云原生环境中,这是一个非常复杂且关键的问题。Cilium IPAM通过解决这些复杂性,并为各种环境提供最优的IP管理策略,从而实现了稳定、可扩展、高性能的Kubernetes网络。它是一项核心技术。
现在,当您看到您的Pod获得IP地址时,不妨想想Cilium IPAM在幕后默默付出的努力吧?😉
发表回复