api dhcp agent テナントごとにプロセス作成 metadata proxy (tenant A) metadata proxy (tenant B) qemu (tenant A) (Neutron: OpenStack のネットワークサービス) dnsmasq (tenant A) qemu (tenant B) dnsmasq (tenant B)
metadata api テナントごとにプロセス作成 metadata proxy (tenant A) qemu (tenant A) dhcp agent metadata proxy (tenant B) dnsmasq (tenant A) qemu (tenant B) dnsmasq (tenant B)
metadata api テナントごとにプロセス作成 metadata proxy (tenant A) qemu (tenant A) dhcp agent metadata proxy (tenant B) dnsmasq (tenant A) qemu (tenant B) dnsmasq (tenant B)
api dhcp agent テナントごとにプロセス作成 Control Plane が 全テナントに疎通する 必要がある! metadata proxy (tenant A) qemu (tenant A) metadata proxy (tenant B) dnsmasq (tenant A) qemu (tenant B) dnsmasq (tenant B)
FF:FF:FF:FF:FF:FF src hwaddr <VM hwaddr> dest ipaddr 255.255.255.255 DHCP Discover/Request (UDP) src ipaddr 0.0.0.0 dest port 67 src port 68 dhcp gw dhcp api ovs bond Tenant network DHCP Message
hwaddr FF:FF:FF:FF:FF:FF ovs bond ovs bridge src hwaddr <VM hwaddr> dest ipaddr 255.255.255.255 DHCP Discover/Request (UDP) src ipaddr 0.0.0.0 dhcp api DHCP のみ tap へ曲げる actions=output:<dhcp-gw tap> VM dhcp gw dest port 67 src port 68 DHCP Message Tenant network
dhcp api ovs bond Tenant network actions=output:<VM port> ovs bridge VM dest hwaddr <VM hwaddr> src hwaddr <tap hwaddr> DHCP Offer/Ack (UDP) dest ipaddr <VM ipaddr> src ipaddr x.x.x.2 dest port 68 src port 67 DHCP Message
show metadata gw metadata proxy ovs bond Tenant network 169.254.169.254 dev enp1s0 proto dhcp scope link ovs bridge VM vlan id <tenant vlan_id> dest ipaddr 169.254.169.254 HTTP Request src ipaddr <VM ipaddr> veth dest port 80 src port * HTTP Body
tcp,nw_dst=169.254.169.254,tcp_dst=80, actions=resubmit(,20) ovs bridge VM vlan id <tenant vlan_id> dest ipaddr 169.254.169.254 HTTP Request src ipaddr <VM ipaddr> metadata proxy 169.254.169.254 当ての HTTP Request だけ曲げる veth dest port 80 metadata gw ovs bond src port * HTTP Body Tenant network
move:vlan_vid[0..11]->NXM_NX_REG2[0..11], <Learn TCP>, resubmit(,25) ovs bridge VM vlan id <tenant vlan_id> dest ipaddr 169.254.169.254 HTTP Request src ipaddr <VM ipaddr> metadata proxy 帰りのパケット用に 一時的なフローを作成 veth dest port 80 metadata gw ovs bond src port * HTTP Body Tenant network
table metadata veth 30000: from 169.254.169.254 lookup metadata proto static ovs bridge dest ipaddr <VM ipaddr> src ipaddr 169.254.169.254 HTTP Response dest port * src port 80 metadata proxy Linux の Source Routing により metadata-gw からの帰りのパケット を veth に曲げる $ ip route show table metadata default dev veth-meta-br proto static scope link VM metadata gw veth HTTP Body ovs bond Tenant network
actions=resubmit(,10) ovs bridge VM dest ipaddr <VM ipaddr> src ipaddr 169.254.169.254 HTTP Response dest port * src port 80 veth HTTP Body metadata gw metadata proxy ovs bond Tenant network
vlan id VLAN Header を復元 dest ipaddr <VM ipaddr> HTTP Response src ipaddr 169.254.169.254 ovs bridge veth dest port * src port 80 HTTP Body metadata gw metadata proxy ovs bond Tenant network
tcp_dst=<VM ephemeral port>, load:<tenant vlan_id>->vlan_vid[0..11], output:<VM port> VM vlan id 先ほど学習したフローで VLAN ID を復元 <tenant vlan_id> dest ipaddr <VM ipaddr> HTTP Response src ipaddr 169.254.169.254 ovs bridge veth dest port * src port 80 HTTP Body metadata gw metadata proxy ovs bond Tenant network