Nova 虚机获取固定IP (Fixed IP)主要分为两个步骤:
(1)在创建虚机过程中,Neutron 随机生成 MAC 和 从配置数据中分配一个固定IP 地址,并保存到 Dnsmasq 的 hosts 文件中,让 Dnsmasq 做好准备。
(2)虚机在启动时向 Dnsmasq 获取 IP 地址
本文将分析该过程。整个过程涉及不同节点的几个模块:
下面将具体分析该过程。
1. 创建虚机时的数据流
Nova-compute 在创建虚机时,需要 Neutron 所做的主要事情之一就是分配一个 MAC 和 一个或者多个固定 IP 地址,该过程从 Nova-compute 向 Neutron 申请 Port 开始:
REQ: curl -i http://controller:9696/v2.0/ports.json -X POST -H "X-Auth-Token: ...=" -H "User-Agent: python-neutronclient" -d '{"port": {"binding:host_id": "compute1", "admin_state_up": true, "network_id": "0a4cd030-d951-401a-8202-937b788bea43", "tenant_id": "43f66bb82e684bbe9eb9ef6892bd7fd6", "device_owner": "compute:nova", "security_groups": ["8c0dc337-0a6d-4ad7-94bf-a400ee32b2ac"], "device_id": "8671c14e-9ee4-4338-bcc5-8a5f0ea6e1d5"}}'
Controller 节点上的 Neutron Server 接到该请求后,会开始下面的过程:
步骤 2 ~ 6:Neutron Server 生成 MAC 和 IP。 其中 MAC 是由任意数组成的;Fixed IP 是从保存在数据库中的管理员配置的网络和地址数据生成的。
步骤 7 ~ 10: 调用 L3 Agent 和 OVS 执行一些操作。
步骤 12 ~ 14:通过 AMQP 的 cast 消息给 Neutron 节点上的 DHCP Agent,告诉它 Port 创建结束以及 新分配的 Port 的数据。
步骤 13:返回Port 给 nova-compute,数据示例如下:
{"port": {"status": "DOWN", "binding:host_id": "compute1", "allowed_address_pairs": [], "extra_dhcp_opts": [], "device_owner": "compute:nova", "binding:profile": {}, "fixed_ips": [{"subnet_id": "5598bdf9-2de4-4a4e-9054-2070102e0f1f", "ip_address": "10.0.0.132"}], "id": "a9ab8ebf-a0b4-4599-867c-95518f069a10", "security_groups": ["8c0dc337-0a6d-4ad7-94bf-a400ee32b2ac"], "device_id": "8671c14e-9ee4-4338-bcc5-8a5f0ea6e1d5", "name": "", "admin_state_up": true, "network_id": "0a4cd030-d951-401a-8202-937b788bea43", "tenant_id": "43f66bb82e684bbe9eb9ef6892bd7fd6", "binding:vif_details": {"port_filter": true, "ovs_hybrid_plug": true}, "binding:vnic_type": "normal", "binding:vif_type": "ovs", "mac_address": "fa:16:3e:f2:e0:23"}
步骤 15:Neturon 节点上的 DHCP Agent 根据接收到的 Port 创建完成通知,重新生成 Dnsmasq 的 hosts 文件,然后让 Dnsmasq 重新加载该文件。该 hosts 文件的示例如下:
root@network:/home/s1# cat /var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/host fa:16:3e:f2:e0:23,host-10-0-0-132.openstacklocal,10.0.0.132 #刚创建的 Port 对应的项,包括 MAC 地址、host FQDN、IP 地址 fa:16:3e:9d:e9:11,host-10-0-0-135.openstacklocal,10.0.0.135fa:16:3e:45:14:34,host-10-0-0-1.openstacklocal,10.0.0.1 fa:16:3e:9d:e9:17,host-10-0-0-141.openstacklocal,10.0.0.141 fa:16:3e:9d:e9:18,host-10-0-0-142.openstacklocal,10.0.0.142
Nova 拿到 Port 的数据后,会写入虚机的 libvirt.xml 文件。下面的虚机配了两块 NIC,所有它有两个 interface 块:
<devices> <disk type="file" device="disk"> <driver name="qemu" type="qcow2" cache="none"/> <source file="/var/lib/nova/instances/199f9e78-96aa-4d31-b250-6626b88723f5/disk"/> <target bus="virtio" dev="vda"/> </disk> <interface type="bridge"> <mac address="fa:16:3e:0f:13:7e"/> <model type="virtio"/> <driver name="qemu"/> <source bridge="qbrf3aeba46-04"/> <target dev="tapf3aeba46-04"/> </interface> <interface type="bridge"> <mac address="fa:16:3e:a2:47:46"/> <model type="virtio"/> <driver name="qemu"/> <source bridge="qbr04ab89a9-10"/> <target dev="tap04ab89a9-10"/> </interface> </devices>
关于该过程,详细的代码说明可以看 这里。
2. Neutron 中的网络概念和 DHCP Agent
2.1 Neutron 网络概念
- Network:一个具有 tenant 隔离性的虚拟 2 层网络,它使用一个虚拟交换机。除了用于与外网连接的网络外,其它的 network 都只属于创建它的 tenant。 虚机在创建时必须选择至少一个 network,也可以选择使用多块网卡和多个 network 连接。
- Subnet:表示一个 IPv4 或者 IPv6 地址区间,该区间内的地址可以被分配给虚机。 一个 Subnet 可以使用一个 DHCP Server 用于分配指定区间内的 IP 地址给虚机。
- Port:表示给定 network 上的一个虚拟交换端口,一个 Port 和虚机的一个网卡直接连接。
- Router: 在 subnet IP 段之间转发 IP 包,使用一个 external gate 和外网连接,以及连接若干个 subnet。
关系:
(1)tenant ---- 1:n ----- network ------- 1:n ------- subnet (一个 tenant 可以拥有多个 network,一个 network 可以包含多个 subnet)
(2)network ------- 1: n ------- port ------ 1:1 --- subnet(一个network 可以有多个 port, 每个 port 连接一个 subnet)(若创建虚机时指定的是 net-id,那么虚机将随机地从该 network 包含的 subnet 中分配 IP)
(3)VM ----- 1 : n ---- NIC ----- 1:1 --- port(一个 VM 可以有多个 NIC,每个 NIC 连接一个 port)(可以在创建虚机时指定一个或者多个 port)
(4)Tenant ----- 1 : n ---- Router ----- 1 : n ------ subnet/ext-network (一个 tenant 可以拥有多个 router,每个 router 在 Neutron network 节点上使用一个 Linux network namespace,其 ID 就是 neutron router-list 得到的 router 的 ID; 一个 router 连接一个通向外网的 gateway 和多个该 tenant 的 subnet)
(5)network ---- 1 : 1 ---- Dnamasq ----- 1: n ----- subnet (一个 network 有一个 Dnsmasq 进程,该进程为多个启动了 DHCP 的 subnet 服务,分配它们拥有的 IP 给虚机)
示例:
综上:
Neutron 向 OpenStack 提供一个虚拟的大二层网络。在使用 Open vSwitch 时,它类似于一个跨 Neutron 节点和 Nova-compute 节点的虚拟交换机。Neutron 中的 network 是这个大二层网络中使用 VLAN Tag 分割的子网,而 Subnet 是 network 中一段 IP 地址的集合,Port 是 OVS 交换机上的一个端口(上图中步骤7、9、10就是在 OVS 上配置 Port),它连接虚机的 NIC,使用来自 subnet 的 IP 地址。network 具有租户隔离性,它包含一个自己的 DHCP Agent 来将它所包含的 subnet 的 IP 分给虚机的NIC;它还拥有一个自己的 L3 Agent 来提供 subnet 之间的 IP 包路由以及 subnet 和 external network 之间 IP 包的路由。可以参考我的另一篇文章中的示意图。
2.2 Neutron DHCP Agent
该 Agent 用户提供 DHCP 服务。它:
(1)在其所在的节点上的 /var/lib/neutron/dhcp/ 目录下,为每个 network 创建了一个子目录,目录名即 network id;每个子目录下,包含若干文件,比如 host 文件。比如:
root@network:/var/lib/neutron/dhcp# ls 0a4cd030-d951-401a-8202-937b788bea43 d04a0a06-7206-4d05-9432-3443843bc199 c359d42b-2a75-4764-bba9-be76b45f64d8 d24963da-5221-481e-adf5-fe033d6e0b4e
(2)为每个 network 启动一个 Dnsmasq 进程,该进程为该 network 中启动了 DHCP 的 subnet 提供服务。每一个 subnet 对应于一个 dhcp-range, 从 tag0 开始,一次 tag1,tag2....
nobody 7087 1 0 22:57 ? 00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap6356d532-32 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/host --addn-hosts=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/opts --leasefile-ro --dhcp-range=set:tag0,10.0.0.0,static,86400s --dhcp-range=set:tag1,10.0.50.0,static,86400s --dhcp-lease-max=512 --conf-file=/etc/neutron/dnsmasq.conf --domain=openstacklocal
关于 set::tag<#>,官方的解释是 The optional set:<tag> sets an alphanumeric label which marks this network so that dhcp options may be specified on a per-network basis. When it is prefixed with 'tag:' instead, then its meaning changes from setting a tag to matching it. Only one tag may be set, but more than one tag may be matched. 不过还不理解它的意思.....
(3)在 Port 或者 Subnet 有变化时,该 Dnsmasq 进程会重新读取新的配置,包括新的 host 文件,新的 dhcp-range 等。
3. 关于 Dnsmasq
3.1 Dnsmasq 进程
Dnsmasq 是被 Neutron 用来提供 DHCP 和 DNS 服务的一个开源程序。它提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于主机较少的网络。这里是它的 man page。这里是中文wiki page。
Neutron 为每个 network 启动一个 Dnsmasq 进程,比如:
root@network:/home/s1# ps -ef | grep dnsmasq nobody 1198 1 0 18:51 ? 00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap8dfd0bd8-45 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/d04a0a06-7206-4d05-9432-3443843bc199/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/d04a0a06-7206-4d05-9432-3443843bc199/host --addn-hosts=/var/lib/neutron/dhcp/d04a0a06-7206-4d05-9432-3443843bc199/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/d04a0a06-7206-4d05-9432-3443843bc199/opts --leasefile-ro --dhcp-range=set:tag0,10.0.11.0,static,86400s --dhcp-lease-max=256 --conf-file=/etc/neutron/dnsmasq.conf --domain=openstacklocal nobody 1201 1 0 18:51 ? 00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap6356d532-32 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/host --addn-hosts=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/opts --leasefile-ro --dhcp-range=set:tag0,10.0.0.0,static,86400s --dhcp-lease-max=256 --conf-file=/etc/neutron/dnsmasq.conf --domain=openstacklocal
用到的几个参数的意义如下:
--no-hosts: Don't read the hostnames in /etc/hosts.
--bind-interfaces: Setting this option also enables multiple instances of dnsmasq which provide DHCP service to run in the same machine.
--interface: Listen only on the specified interface(s). 在指定的 interface 上监听 DHCP 请求。
--dhcp-hostsfile: Read DHCP host information from the specified file. The advantage of storing DHCP host information in this file is that it can be changed without re-starting dnsmasq: the file will be re-read when dnsmasq receives SIGHUP. DHCP host 文件,dnsmasq 收到 SIGHUP 后会重新读入。没看到 Neutron code 发出该信息,而似乎每次都重启dnsmasq 进程。
--addn-hosts: Additional hosts file. The file will be re-read when dnsmasq receives SIGHUP.
--dhcp-optsfile: Read DHCP option information from the specified file when dnsmasq receiving SIGHUP.
--dhcp-range: Enable the DHCP server. This option may be repeated, with different addresses, to enable DHCP service to more than one network. dnsmasq 默认关闭DHCP功能,该选项开启该功能。每个开启了 DHCP 的 subnet 拥有一个该项。
--dhcp-lease-max: Limits dnsmasq to the specified maximum number of DHCP leases to prevent DoS attacks from hosts.
--domain: Specifies DNS domains for the DHCP server.
这些数据皆由数据库中数据计算得出。
3.2 Dnsmasq log
dnsmasq 默认地将日志写到 /var/log/syslog 中。可以在 Neutron 节点上做如下配置,使得它使用别的log 文件以便调试:
(1)创建文件 /etc/neutron/dnsmasq.conf,在其中添加
log-facility = /var/log/neutron/dnsmasq.log log-dhcp
(2)添加下面行到 /etc/neutron/dhcp_agent.ini:
dnsmasq_config_file = /etc/neutron/dnsmasq.conf
(3)运行下面命令重启 Neutron DHCP agent:
sudo service neutron-dhcp-agent restart
4. 虚机启动时向 Dnsmasq 申请固定 IP
经过以上步骤,Dnsmasq 准备好相应虚机的IP 申请请求了,它:准备好了 host 文件,里面有每个虚机的 MAC 地址 和 IP 对照表;绑定了 interface,可以收到请求;启动好了进程,可以为指定的 subnet 服务。
获取 IP 的过程如下:
(1)虚机 VM_1 开机,发出 DHCPDISCOVER 广播,该广播消息在整个 network 中都可以被收到。
(2)广播到达 tap6356d532-32,Dnsmasq 在它上面监听。它检查其 host 文件,发现有对应项,它以 DHCPOFFER 消息将 IP 和 gateway IP 发回到 VM_1。如果有其他DHCP Server的话,它们也可能会发回IP 地址。
(3)VM_1 发回 DHCPREQUEST 消息确认只接受第二步发的 DHCPOFFER,别的 DHCP Server 给的 IP 可以自行收回了。
(4)Dnsmasq 发回确认消息 DHCPACK,整个过程结束。
参考创建一个虚机在 dnsmasq 的日志的整个过程:
Apr 11 23:42:14 dnsmasq[7087]: read /var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/addn_hosts - 14 addresses #读取更新后的文件 Apr 11 23:42:14 dnsmasq-dhcp[7087]: read /var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/host Apr 11 23:42:14 dnsmasq-dhcp[7087]: read /var/lib/neutron/dhcp/0a4cd030-d951-401a-8202-937b788bea43/opts Apr 11 23:42:15 dnsmasq[7092]: read /var/lib/neutron/dhcp/c359d42b-2a75-4764-bba9-be76b45f64d8/addn_hosts - 3 addresses #读取更新后的文件 Apr 11 23:42:15 dnsmasq-dhcp[7092]: read /var/lib/neutron/dhcp/c359d42b-2a75-4764-bba9-be76b45f64d8/host Apr 11 23:42:15 dnsmasq-dhcp[7092]: read /var/lib/neutron/dhcp/c359d42b-2a75-4764-bba9-be76b45f64d8/opts Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 available DHCP subnet: 10.0.50.0/255.255.255.0 #第一个 subnet Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 available DHCP subnet: 10.0.0.0/255.255.255.0 #第二个 subnet Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 vendor class: udhcp 1.20.1 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 DHCPDISCOVER(tap6356d532-32) fa:16:3e:0f:13:7e #收到虚机的 DHCPDISCOVER 消息 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 tags: tag0, known, tap6356d532-32 #从 10.0.0.0/255.255.255.0 中分配地址 (为什么只是 tag0 呢?) Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 DHCPOFFER(tap6356d532-32) 10.0.0.143 fa:16:3e:0f:13:7e #发回IP地址 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 15:domain-name, 28:broadcast, 42:ntp-server, Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 121:classless-static-route Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 next server: 10.0.0.116 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 1 option: 53 message-type 2 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 54 server-identifier 10.0.0.116 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 51 lease-time 1d Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 58 T1 12h Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 59 T2 21h Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 1 netmask 255.255.255.0 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 28 broadcast 10.0.0.255 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 14 option: 15 domain-name openstacklocal Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 15 option: 12 hostname host-10-0-0-143 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 3 router 10.0.0.1 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 6 dns-server 192.168.1.1 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 available DHCP subnet: 10.0.50.0/255.255.255.0 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 available DHCP subnet: 10.0.0.0/255.255.255.0 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 vendor class: udhcp 1.20.1 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 DHCPREQUEST(tap6356d532-32) 10.0.0.143 fa:16:3e:0f:13:7e #确认虚机只接受该IP。别的 DHCP Service 可以收回它们废品的 IP 地址了。 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 tags: tag0, known, tap6356d532-32 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 DHCPACK(tap6356d532-32) 10.0.0.143 fa:16:3e:0f:13:7e host-10-0-0-143 #Dnsmasq 确认该 OFFER,以及发回其它info,整个过程结束。 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 15:domain-name, 28:broadcast, 42:ntp-server, Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 requested options: 121:classless-static-route Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 next server: 10.0.0.116 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 1 option: 53 message-type 5 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 54 server-identifier 10.0.0.116 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 51 lease-time 1d Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 58 T1 12h Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 59 T2 21h Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 1 netmask 255.255.255.0 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 28 broadcast 10.0.0.255 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 14 option: 15 domain-name openstacklocal Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 15 option: 12 hostname host-10-0-0-143 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 3 router 10.0.0.1 Apr 11 23:42:41 dnsmasq-dhcp[7087]: 116908156 sent size: 4 option: 6 dns-server 192.168.1.1
5. DHCP Agent 的性能和可靠性
一方面,DHCP Agent 在一个 network 内使用一个 Dnsmasq 提供 DHCP 服务,在 network 很大的时候,可能会有性能问题,比如虚机无法及时获取IP 地址,这时候就需要做性能优化的工作了。而且它依赖于 Neutron Server 发来的 notification,在 AMQP 遇到性能问题的时候,它由可能无法及时收到通知,导致无法提供服务。Marintas 有篇文章谈这个问题 Improving DHCP Performance In OpenStack | Mirantis。
另一方面,DHCP Agent 可能因为一些不可预测的原因不能提供服务,那会造成虚机就无法获取IP 地址。DHCP 协议天然就支持多个使用多个 DHCP Server。这一块,以后在 OpenStack 高可靠性(HA)分析部分会进行分析。
原文中提到,在步骤 13:返回Port 给 nova-compute,数据示例如下:{。。。。},其中FIX IP 信息已经给计算节点,
在后面为什么还有一次DHCP,请求IP过程???
原因:
步骤13 只是 neutron 基于 DB 中的数据向虚机分配一个 port,包括 IP 和 MAC 地址。
nova 通过Port API 拿到的 IP 其实是不用的,通过 libvirt 启动虚机需要的是 MAC 地址。细节你可以看nova 代码,但是总体流程应该就是我说的这样子。
虚机收到后去构建虚机的 libvirt xml 文件,把 port plug 到 OVS 的 br-int 上,再启动虚机。
另一边,neutron 会通过 RPC 通知 DHCP Agent 把 IP-MAC 的映射关系保持到 dnsmasq 的配置文件并使其生效。
这样,当虚机启动时,它会发出 DHCP 请求,向 DHCP Server 申请其 fixed ip。你去看你的 nova 虚机,IP 地址是 DHCP 分配的,而不是static的。
另外,DHCP 分配的 IP 有一定的租期,过了这个期限,即使之前分配过,也是需要重新分配的。
posted on 2015-04-13 08:27 SammyLiu 阅读(21307) 评论(26) 编辑 收藏
评论:#1楼 2015-07-30 17:16 | ren511
原文中提到,在步骤 13:返回Port 给 nova-compute,数据示例如下:{。。。。},其中FIX IP 信息已经给计算节点,
在后面为什么还有一次DHCP,请求IP过程???
支持(0) 反对(0)
回复 引用#2楼 [楼主] 2015-07-30 17:21 | SammyLiu
@ ren511
没看出来你说的的后面那次的 DHCP 过程是指哪次,是指虚机启动时的那次吗?步骤13 只是 neutron 基于 DB 中的数据向虚机分配一个 port,包括 IP 和 MAC 地址。虚机收到后去构建虚机的 libvirt xml 文件,把 port plug 到 OVS 的 br-int 上,再启动虚机。另一边,neutron 会通过 RPC 通知 DHCP Agent 把 IP-MAC 的映射关系保持到 dnsmasq 的配置文件并使其生效。这样,当虚机启动时,它会发出 DHCP 请求,向 DHCP Server 申请其 fixed ip。你去看你的 nova 虚机,IP 地址是 DHCP 分配的,而不是static的。
支持(0) 反对(0)
回复 引用#3楼 2015-07-30 17:34 | ren511
我的疑问是步骤13中,返回给nova-compute的IP和MAC作用是什么?
支持(0) 反对(0)
回复 引用#4楼 [楼主] 2015-07-30 17:38 | SammyLiu
@ ren511
OK. 我认为这时候 nova 必须拿到的是该 port 对应的虚机一网卡的 MAC地址,这个地址在虚机启动的时候需要。然后启动时到 DHCP Server 去拿与该 MAC 地址匹配的 IP 地址。
支持(0) 反对(0)
回复 引用#5楼 2015-07-31 09:04 | ren511
疑问在于根据文中步骤13中返回消息,nova-compute已经拿到"mac_address": "fa:16:3e:f2:e0:23"对应端口的"ip_address": "10.0.0.132",而后面虚机启动过程再发动DHCP请求,去拿"mac_address": "fa:16:3e:f2:e0:23"对应的IP,感觉流程上说不通!!!
支持(0) 反对(0)
回复 引用#6楼 [楼主] 2015-07-31 09:21 | SammyLiu
@ ren511
我前面说过了,虚机使用的是DHCP 分配IP 地址的方式。nova 通过Port API 拿到的 IP 其实是不用的,通过 libvirt 启动虚机需要的是 MAC 地址。细节你可以看nova 代码,但是总体流程应该就是我说的这样子。另外,DHCP 分配的 IP 有一定的租期,过了这个期限,即使之前分配过,也是需要重新分配的。
支持(0) 反对(0)
回复 引用#7楼 2015-07-31 09:31 | ren511
多谢回复!!!我再理一下流程细节。
支持(0) 反对(0)
回复 引用#8楼 [楼主] 2015-07-31 09:40 | SammyLiu
@ ren511
不客气,也欢迎你来更新你的梳理结果。
支持(0) 反对(0)
回复 引用#9楼 2015-09-27 21:51 | magicccc
hi,@sammyliu兄,
nova delete 删掉虚机以后,port不会自动回收,tap可以被删除,但是qvo.qbr.qvb都不会被自动删除。
按理说nova delete以后,应该发出一个消息,给消息队列,让port 自动回收,然后相应的接口也应该自动删除,不然port不删除,占着ip不放,这样ip资源很快就会被耗尽,并且ip add也会看见很多没用的qbr,qvo,qvb等接口,不知道sammyliu兄有遇到这种情况么?谢谢
不好意思,这个问题已经解决,是由于我的nova设置了软删除了,所以不是真正的底层删除,port没有自动回收,关掉软删除即可,或者软删除到期,会自动回收port。
支持(0) 反对(0)
回复 引用#10楼 [楼主] 2015-10-13 15:15 | SammyLiu
@ magicccc
谢谢更新。最近比较忙,抱歉没有及时回复。
支持(0) 反对(0)
回复 引用#11楼 2016-01-05 23:12 | gokd35
您好!博客内容非常精彩,对于我这样想要学习neutron的人可以说是帮助极大的!
这里我想请问一个问题:neutron server是通过哪个函数为虚拟机分配IP的呢?
我看了相关的源代码,neutron server在neutronv2.api.allocate_for_instance()函数中,最开始会为instance随机分配一个可用的MAC地址,而instance的IP地址要看传进来的参数fixed_ip,而向前回溯这个参数应该是从nova.compute.manager.ComputeVirtAPI._allocate_network_async()传过来的。
如果该参数是空的,按您“Neutron Server 生成 MAC 和 IP”的说法,应该是由neutron server与DB沟通获得一个可用的IP后,再与neutron-agent通信的。不过我在neutronv2.api.allocate_for_instance()函数及其后续调用中,并没有发现与DB沟通获得IP的动作,而是直接调用到neutronclient.v2_0.create()向neutron-agent发送REST API了。
请您不吝指教,万分感谢!
支持(0) 反对(0)
回复 引用#12楼 [楼主] 2016-01-06 09:23 | SammyLiu
@ gokd35
你看看 def _allocate_fixed_ips(self, context, fixed_ips, mac_address) 这个函数以及它所在文件中的其它相关函数。neutron 中,mac 地址是随机生成的,而 fixed ip 是从数据库中分配的。
支持(0) 反对(0)
回复 引用#13楼 2016-01-06 18:44 | gokd35
@ SammyLiu
您说的这个函数中确实有从pool拿IP的动作,调用过程是:nova.network.api.allocate_for_instance() -> nova.network.manager.allocate_for_instance() -> nova.network._allocate_fixed_ips()。
不过据我观察,在neutron2.x版本中,nova.network.neutronv2.api里包括了nova.network.api和nova.network.manager两个文件的方法,而nova.network.neutronv2.api中没有从pool拿IP的动作,而是在判断fixed_ip参数为空后直接送REST API了。
我最近准备在SDN控制器上开发DHCP,并需要与neutron的DHCP做对接,所以十分关注IP到底是与instance绑定的,还是多个DHCP server竞争分配的。
支持(0) 反对(0)
回复 引用#14楼 [楼主] 2016-01-06 19:02 | SammyLiu
@ gokd35
代码没有细看,依我的理解,是从DB层面按照虚机的需要来分配 fixed ip的,这样会保证不会重复分配的。
支持(0) 反对(0)
回复 引用#15楼 2016-05-09 17:20 | 胡朔豪
你好,请问你研究过使用neutron网络去创建虚机,实例ip却没有释放。
支持(0) 反对(0)
回复 引用#16楼 [楼主] 2016-05-09 19:50 | SammyLiu
@ 胡朔豪
你好,你能把你的场景描述得更详细一些吗?
支持(0) 反对(0)
回复 引用#17楼 2016-05-09 20:05 | 胡朔豪
@ SammyLiu
你好,是这样,我的环境是neutron 的vlan模式,租户网络是vxlan ,就是在我每次创建完机器,删除后不能被二次获取
支持(0) 反对(0)
回复 引用#18楼 [楼主] 2016-05-10 11:18 | SammyLiu
@ 胡朔豪
在我的印象中,neutron应该是顺序分配fixed ip的,所以你删除一个虚机后它的IP不会马上被下一个新虚机获取/使用。你得查一下代码了。
支持(0) 反对(0)
回复 引用#19楼 2016-05-10 13:12 | 胡朔豪
@ SammyLiu
确实是这样,中午已经查明原因了,谢谢
支持(0) 反对(0)
回复 引用#20楼 2016-05-13 17:23 | 金陵马小马
你好,我想请问 DHCPREQUEST “确认虚机只接受该IP。别的 DHCP Service 可以收回它们废品的 IP 地址了。” 虚拟机是按什么规则将其他的DHCP service的IP剔除的
支持(0) 反对(0)
回复 引用#21楼 [楼主] 2016-05-16 13:07 | SammyLiu
@ 金陵马小马
这需要去研究DHCP协议了,我还没怎么研究过。
支持(0) 反对(0)
回复 引用#22楼 2017-08-12 22:52 | wuchuwei
请问每个网络的创建是否都会自动创建一个以网络id为名的目录。在这个目录存放与该网络相关的子网信息?
我看到下面的信息后。在我的devstack环境dhcp发现只有一个目录。但是在web页面下的admin->network下看到有两个网络。一个是demo项目所有一个是admin项目所有。demo项目所有的网络就有在dhcp下看到。但是admin项目下的网络就没有在dhcp目录下看到。然后我在admin项目下创建的虚拟机无法获取ip。而且在实例表示上有显示分配一个ip(进系统指定其它ip网络是不通的只有上面分配的才行)
(1)在其所在的节点上的 /var/lib/neutron/dhcp/ 目录下,为每个 network 创建了一个子目录,目录名即 network id;每个子目录下,包含若干文件,比如 host 文件
支持(0) 反对(0)
回复 引用#23楼 [楼主] 2017-08-13 09:41 | SammyLiu
@ wuchuwei
你的admin项目下的网络没有 dhcp 目录应该是因为它的所有 subnet 都没有enable dhcp。
支持(0) 反对(0)
回复 引用#24楼 2017-08-13 23:50 | wuchuwei
@ SammyLiu
谢谢。要确实看到public这个默认的subnet没有开启dhcp。但是我发现这个public无法编辑。这个public是我安装devstack自动生成的。请问这个自动生成的无法进行修改吗?只有重新创建的才可以编辑。
还有一个问题就是vm的ip是不是在创建后就固定的无法修改?因为public没有开dhcp所以我试着用ifconfig eth0 172.24.4.2 netmask 255.255.255.0和route add default gw 172.24.4.1 dev eth0后网络是通的。但如果我给eth0 分配一个172.24.4.3或是4这样的ip,route命令不变后网络就不能了。
还有我听说如果network启用share后vm可能直接使用物理网络的ip。但是试了一下不行(物理网络也没有使用dhcp。也是手动指定的。)是因为上面的ip绑定问题才这样的吗?
我是一个新手。还请多多指教。
支持(0) 反对(0)
回复 引用#25楼 2018-02-11 11:44 | 云菜鸟
请教一个问题:
openstack突然断电。重新启动openstack后,对应vxlan网络的云主机,不能获得ip地址了。
这是怎么回事呢。
十分感谢你的指导。
支持(0) 反对(0)
回复 引用#26楼 [楼主] 2018-02-22 09:00 | SammyLiu
@ 云菜鸟
建议做如下检查:1. 检查 neutron 各服务是否都运行正常 2. 通过抓包,确保虚机发出的dhcp 包以及 dnsmasq 返回的包都正常。
支持(0) 反对(0)
回复 引用
发表评论
编辑预览