CloudStack 代码阅读(七)—— 网络体系(NetworkGuru、NetworkElement、VR 服务链)
CloudStack 的网络模块是整个系统中最复杂的子系统之一。与一般 IaaS 架构不同,CloudStack 采用 NetworkGuru → NetworkElement → VirtualRouter 的三层结构,并通过 NetworkOrchestrator 串联网络生命周期,从 NIC 分配、VLAN 构建、流量隔离到虚拟路由器服务链(DHCP/DNS/LB/ACL/SourceNat)。
- NetworkOffering
- NetworkGuru(网络架构师)
- NetworkElement(网络功能组件)
- NetworkOrchestrator(网络编排者)
- NIC 生命周期
- VR 服务链(DHCP/DNS/LB/ACL/SNAT)
- 广播域、隔离方式、流量类型
1. 网络模块源码结构总览
CloudStack 网络层主要包含以下路径:
server/src/com/cloud/network/
├── NetworkOrchestrator.java
├── NetworkManagerImpl.java
├── element/
│ ├── VirtualRouterElement.java
│ ├── NiciraNvpElement.java
│ ├── OvsElement.java
│ └── InternalLoadBalancerElement.java
├── guru/
│ ├── PodBasedNetworkGuru.java
│ ├── OvsGuestNetworkGuru.java
│ ├── BridgeNetworkGuru.java
│ └── ExternalGuestNetworkGuru.java
└── dao/
network/src/org/apache/cloudstack/network/
├── NetworkModelImpl.java
└── NetworkService.java
plugins/network/
├── virtualrouter/
├── nicira-nvp/
└── midonet/
网络模块是一个极端插件化的体系,其中 Guru/Element 的组合决定了最终网络拓扑。
2. NetworkOffering:网络能力定义
NetworkOffering 决定了一个 Guest Network 拥有哪些能力,典型能力包括:
- DHCP
- DNS
- LB
- SourceNat
- StaticNat
- Port Forwarding
- Firewall
- VPN
源码路径:
com.cloud.offerings.NetworkOfferingVO
常见字段:
private boolean isRedundantRouter;
private boolean isSharedSourceNat;
private boolean supportsDhcp;
private boolean supportsDns;
private TrafficType trafficType;
private GuestType guestType;
CloudStack 首先根据用户创建网络时选择的 NetworkOffering,在网络准备阶段决定:
- 使用哪个 NetworkGuru
- 哪些 NetworkElement 会参与
- 是否需要虚拟路由器(VR)
- 该网络属于 Isolated / Shared 类型
3. NetworkGuru:决定网络如何“定义”的核心
NetworkGuru 的作用是:
- 为 Guest Network 选择广播域(BroadcastDomain)
- 分配 VLAN
- 决定 NIC 的隔离方式
- 决定是否需要 VR
接口定义:
public interface NetworkGuru {
Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpec);
Network implement(Network network, NetworkOffering offering, DeployDestination dest);
NicProfile allocate(NicProfile nic, Network network);
boolean trash(Network network);
}
CloudStack 4.2.2 中常见 Guru:
| Guru | 用途 |
|---|---|
| PodBasedNetworkGuru | 基于 Pod 的隔离网络 |
| BridgeNetworkGuru | Linux bridge 网络(KVM) |
| OvsGuestNetworkGuru | Open vSwitch 网络 |
| ExternalGuestNetworkGuru | 外部网络设备 |
以 BridgeNetworkGuru 为例(KVM 默认):
源码片段:
@Override
public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) {
if (offering.getTrafficType() != TrafficType.Guest) return null;
NetworkVO network = new NetworkVO();
network.setBroadcastDomainType(BroadcastDomainType.Vlan);
network.setNetworkOfferingId(offering.getId());
return network;
}
3.1 Guru 的地位
Guru 决定了网络结构本身:
- 是 VLAN?VXLAN?GRE?
- VLAN ID 如何选择?
- NIC 接入哪个 bridge?
- 是否需要 VR?
Guru 是 CloudStack 网络体系的最核心模块。
4. NetworkElement:负责具体网络功能的插件体系
NetworkElement 是“网络功能插件”,每个 Element 负责一部分功能,例如:
| Element | 功能 |
|---|---|
| VirtualRouterElement | DHCP/DNS/LB/ACL/SNAT |
| NiciraNvpElement | OpenFlow/VXLAN/SDN |
| OvsElement | OVS 网络支持 |
| InternalLoadBalancerElement | LB 功能 |
| VpnElement | Site-to-Site VPN |
接口定义:
public interface NetworkElement {
boolean implement(Network network, NetworkOffering offering);
boolean prepare(Network network, NicProfile nic);
boolean release(Network network, NicProfile nic);
}
关键逻辑:
- NetworkGuru 负责“架构”
- NetworkElement 负责“功能”
例如 VirtualRouterElement 实现 DHCP/DNS:
@Override
public boolean implement(Network network, NetworkOffering offering) {
deployVirtualRouter(network);
return true;
}
5. NetworkOrchestrator:网络生命周期调度者
网络操作都经过:
NetworkOrchestrator
关键流程:
allocateNetwork()
implementNetwork()
allocateNIC()
prepareNTWK()
releaseNTWK()
关键代码:
public Network implementNetwork(long networkId, DeployDestination dest) {
NetworkVO network = _networkDao.findById(networkId);
NetworkGuru guru = _networkGurus.get(network.getGuruName());
guru.implement(network, offering, dest);
for (NetworkElement element : networkElements) {
if (element.isEnabledFor(network)) {
element.implement(network, offering);
}
}
return network;
}
NetworkOrchestrator 的意义:
- 从多个 Guru / Element 选择适合网络
- 按顺序执行网络构建流程
- 管理 NIC 生命周期
- 填装 VR、LB、ACL 等组件
6. NIC 生命周期(分配、实现、清理)
NIC 是 Network → VM 的绑定对象,定义在:
com.cloud.vm.NicVO
NIC 的分配流程:
allocate(network)
→ assign IP
→ create NicVO
→ allocateNicProfile
NIC 创建流程:
NicVO nic = new NicVO(networkId, vmId, broadcastUri, isolationUri);
nic.setReservationId(UUID.randomUUID().toString());
_nicDao.persist(nic);
NIC 启动准备:
在 VM 启动前:
NetworkOrchestrator.prepareNic()
→ Guru.allocate()
→ Element.prepare()
7. 广播域(BroadcastDomain)与隔离方式(IsolationMethod)
BroadcastDomainType 代表网络底层结构:
- VLAN:
vlan://123 - VXLAN:
vxlan://5001 - GRE:
gre://100 - Native:裸网
- LinkLocal:VR 专用网络
定义在:
BroadcastDomainType.java
Sample:
if (uri.getScheme().equals("vlan")) return BroadcastDomainType.Vlan;
隔离方式定义 VM/NIC 在链路中如何隔离:
- VLAN
- VXLAN
- GRE
- STT
- L3 隔离(NICIRA)
Guru 根据 offering 选择隔离方式。
8. Virtual Router(VR)在网络体系中的角色:服务链核心
VR 是 CloudStack Guest Network 中最重要的组件,提供:
- DHCP
- DNS
- LB
- Source NAT
- Port Forwarding
- VPN
- ACL / Firewall
VR 在网络编排中的角色:
NetworkGuru 决定是否需要 VR
→ NetworkOrchestrator 调用 VirtualRouterElement
→ RouterManager.deployRouter()
源码位置:
plugins/network/virtualrouter/
VR 部署流程:
public DomainRouterVO deployRouter(Network guestNetwork) {
DomainRouterVO router = new DomainRouterVO(...);
routerDao.persist(router);
startRouter(router);
return router;
}
9. VR 服务链源码解剖:DHCP / DNS / LB / SNAT
VR 内部脚本位于:
/opt/cloud/bin/
VR 服务启停通过 ConfigDrive 或脚本完成。
VirtualRouterElement:
@Override
public boolean implement(Network network, NetworkOffering offering) {
Commands cmds = new Commands(new SetDhcpCofigCommand(...));
sendCommandsToVR(router, cmds);
return true;
}
LB 功能:
ApplyLoadBalancerRulesCommand cmd = new ApplyLoadBalancerRulesCommand(rules);
_commands.addCommand(cmd);
SNAT:
SetSourceNatCommand cmd = new SetSourceNatCommand(ip, true);
VR 通过 AgentCommand 实际配置 iptables/dnsmasq/haproxy。
10. 网络准备与 VM 启动的联动关系
VM 启动前必须完成:
NetworkGuru.allocateNIC
→ NetworkElement.prepare
→ VR ready
→ create NicProfile
→ attach NIC to VM
VMStart 时序:
orchestrateDeployVM
|
+--> NetworkOrchestrator.prepare()
| |
| +--> allocateNIC()
| +--> implementNetwork()
| +--> prepareNic()
|
+--> VolumeManager.prepare()
|
+--> Guru.finalizeDeployment()
|
+--> agentMgr.send(StartCommand)
11. 常见网络失败点(源码级)
11.1 VLAN 分配失败
Guru 抛出:
Unable to find free VLAN
详见:
VlanDaoImpl.acquireVlan()
11.2 VR 启动失败
日志关键:
RouterManagerImpl.startRouter
11.3 NIC 创建失败
NetworkOrchestrator:
Unable to allocate nic profile
通常是 IP 池已满。
12. 小结
网络模块是 CloudStack 最强大的部分。
其设计理念为:
- Guru 决定网络拓扑
- Element 决定功能
- NetworkOrchestrator 决定生命周期
- VR 决定服务链