[pve-devel] [RFC cluster/manager/network 0/6] Add support for DHCP servers to SDN
DERUMIER, Alexandre
alexandre.derumier at groupe-cyllene.com
Tue Sep 26 15:07:18 CEST 2023
Le mardi 26 septembre 2023 à 13:20 +0200, Stefan Hanreich a écrit :
> On 9/20/23 23:48, DERUMIER, Alexandre wrote:
> > Finally, It's not so easy without writing ip on proxmox side (in vm
> > config or somewhere else), because to retrieve a reserved ip from
> > external ipam when vm start, we need to lookup maybe from mac
> > address,
> > maybe from hostname of the vm, or maybe some custom attributes, but
> > not
> > all ipams accept same attributes.
> >
> > (at least phpipam && netbox don't support all features, or not
> > easyly.
> > Netbox for example, for macaddress need to register the full vm
> > object
> > && interfaces + mac + mapping to ip, Phpipam is a single ip object
> > with mac as attribute).
>
> Yes, I think so as well. It also would make us dependent on external
> systems, which might not always be up and would create an additional
> hurdle for setting things up. Having our own solution for this seems
> preferable imo. We can still provide integrations with netbox /
> phpipam
> so they can take over from our small IPAM if they implement the
> features
> we need.
>
> I'll take a closer look at netbox, since I was under the impression
> that
> they should support this - although it's been awhile since I played
> around with it. Not sure about phpIPAM, but I wasn't too stoked on
> using
> it anyway after browsing their source code for a bit.
>
> > So I think the best way is still to write the ip into the vm
> > config,
> > this allow to inject already reserved ip in dhcp at vm
> > start/migrate
> > without need to call the ipam (also avoid start problem is ipam
> > server
> > is down).
> >
> > and this allow to use it for firewall ipfilter, I see a usecase for
> > sdn
> > vxlan too or special /32 route injection)
> >
>
> Yes, I think so as well, although we would need to take care of
> proper
> synchronization between Configs and IPAM. If this diverges for
> whatever
> reason we will run into trouble. Of course, this *should* never
> happen
> when properly implemented.
>
> Another option I thought about would be storing a VMID -> IP mapping
> in
> the (pve) IPAM itself. This would have the upside of having a
> centralized storage and single source of truth without having to
> maintain two different locations where we store the IP.
>
> Though it would also be a bit more intransparent to the user if we
> don't
> expose it somewhere in the UI.
>
> This would have the downside that starting VMs is an issue when the
> IPAM
> is down. While using the pve IPAM in a cluster (or a single node) I
> can
> see this being alright, since you need quorum to start a VM. As long
> as
> you have a quorate cluster the pve IPAM *should* be available as
> well.
>
> In the case of using phpIPAM or netbox this is an issue we would need
> to
> think about.
>
Yes, this is my main concern, as it'll be my case in production, as I
managing multiple clusters, on differents location, with subnets
sharing.
for me, it's ok if ipam is down when allocating a new ip or vm.
But for vm start/stop, I think we should have at minimum some cache
somewhere. (I'm think about a disaster recovery or big network problem,
where you want to fast restart all vms without need to call the ipam).
Maybe a way, could be to use the local pve ipam, as a local mirror of
the external ipam ? (and don't store ip in vm config, but only in
pve ipam, the source of truth)
vm with ipam=auto, external ipam is configured:
- if (ip_exist(pve_ipam)) {
return ip
} elsif (ip_exist(external_ipam)) {
return ip
} else {
ip = findnextfreeip(external_ipam)
sync_pve_ipam(ip)
return ip
}
I have see this in vmware or openstack/opennebula with external ipam,
I don't remember exactly.
> > I just need some protections for snapshot, but nothing too
> > difficult,
> > but we really need to avoid to try to manage in ipam multiple
> > version/snapshot of ip entry for a vm.
> > I had tried 2years ago, it was really painful to handle this in
> > differents ipam.
> > So maybe the best way is to forbid to change ip address when a
> > snapshot
> > already exist.
>
> Yes, it might be just the best way to check on restore if the IP is
> the
> same or at least currently available and otherwise just get a new IP
> from IPAM automatically (maybe with a warning).
>
> On the other hand, this should not be an issue when storing the VMID
> ->
> IP mapping centralized somewhere, since we then can just rely on the
> IP
> being stored there. Of course this would exclude the DHCP/IP setting
> from the snapshot which can be good or bad I'd say (depending on the
> use
> case).
>
> > I think we could implement ipam call like:
> >
> >
> > create vm or add a new nic -->
> > -----------------------------
> > qm create ... -net0
> > bridge=vnet,....,ip=(auto|192.168.0.1|dynamic),ip6=(..)
> >
> >
> > auto : search a free ip in ipam. write the ip address in net0:
> > ...,ip=
> > ip field
> >
> > 192.168.0.1: check if ip is free in ipam && register ip in ipam.
> > write
> > the ip in ip field.
> >
> >
> > dynamic: write "ephemeral" in net0: ....,ip=ephemeral (This is a
> > dynamic ip registered at vm start, and release at vm stop)
>
> Sounds good to me.
>
> >
> > vm start
> > ---------
> > - if ip=ephemeral, find && register a free ip in ipam, write it in
> > vm
> > net0: ...,ip=192.168.0.10[E] . (maybe with a special flag [E] to
> > indicate it's ephemeral)
> > - read ip from vm config && inject in dhcp
>
> Maybe we can even get away with setting the IP in the DHCP config as
> soon as we set it in the VM configuration, as long as it is not
> ephemeral, thus avoiding the need for having to do it while starting
> VMs?
>
> > vm_stop
> > -------
> > if ip is ephemeral (netX: ip=192.168.0.10[E]), delete ip from
> > ipam,
> > set ip=ephemeral in vm config
> >
> >
> > vm_destroy or nic remove/unplug
> > -------------------------
> > if netX: ...,ip=192.168.0.10 , remove ip from ipam
> >
> >
> >
> > nic update when vm is running:
> > ------------------------------
> > if ip is defined : netX: ip=192.168.0.10, we don't allow bridge
> > change
> > or ip change, as vm is not notified about theses changes, and still
> > use
> > old ip.
> >
> > We can allow nic hot-unplug && hotplug. (guest os will remove the
> > ip on
> > nic removal, and will call dhcp again on nic hotplug)
>
> Yes, I think so as well. Maybe we could give the option to change the
> IP
> together with a forced reboot and a warning like 'When changing the
> IP
> this VM will get rebooted' as a quality of life feature?
>
> >
> > nic hotplug with ip=auto:
> > -------------------------
> >
> > --> add nic in pending state ----> find ip in ipam && write it in
> > pending ---> do the hotplug in qemu.
> >
> > We need to handle the config revert to remove ip from ipam if the
> > nic
> > hotplug is blocked in pending state(I never see this case until os
> > don't have pci_hotplug module loaded, but it's better to be
> > carefull )
> >
>
> Yes - defensive programming is always good!
>
> > The ipam modules (internal pve, phpipam,netbox) are already for
> > this, I
> > think it shouldn't be too difficult.
> >
> > dnsmasq seem to have a reservation file option, where we can
> > dynamically add ip-mac without need to reload it.
> >
> > I'll try it, re-using your current dnsmasq patches.
>
> Since you want to take a shot at implementing it, is there anything I
> could help you with? I'd have some resources now for taking a shot at
> this as well.
>
I'm a bit busy currently on other stuff and I would like to finish them
first.
So if you have a little bit time to work on this, it could be great :)
I have send some patches in 2021 for ipam integration in qemu/lxc, if
you want to take some inspiration. (without the ip in the vm config, it
should be a lot easier)
> It would also be interesting to improve and add some features to our
> built-in IPAM, maybe even add the VMID -> IP mapping functionality
> I've
> touched upon earlier. It would also be interesting to be able to
> expose
> some of this information to the frontend, so users have an overview
> of
> currently leased IPs in the frontend - what do you think?
>
Yes,admin should be able to see allocated ip. (like a real ipam).
I was thinking about other stuff for later, but maybe it could be great
for an admin to be able to reserve ips and put them in a pool.
Then user could choose ip from this pool.
(Usecase is public ip addresses, where a customer could buy some of
them,
then allocated them like he want)
> Would it also make sense to set IPSet entries for VMs, so they are
> only
> allowed to use the IPs we dedicate to them? This would be a decent
> safeguard for preventing issues down the line.
>
> Additionally it would be interesting to automatically create Aliases
> for
> VNets/VMs in the Firewall configuration - what do you think? If we
> add
> VMs as Aliases, we would have to recompile the iptables on every IP
> change. For this feature it would make sense to be able to set names
> /
> comments on VNets, so we can reference them this way. What do you
> think?
a Big yes ! (as I'm already doing this manually in production ;)
>
More information about the pve-devel
mailing list