In the context of Ubuntu images which still use ifupdown by default (Xenial); they also include resolvconf which is what manages resolv.conf.
As you note, newer Ubuntu uses systemd-resolved as replacement for resolvconf; cloud-init on Ubuntu does not directly render contents into /etc/resolv.conf for these reasons.
@Adam,
In the context of Ubuntu images which still use ifupdown by default (Xenial); they also include resolvconf which is what manages resolv.conf.
As you note, newer Ubuntu uses systemd-resolved as replacement for resolvconf; cloud-init on Ubuntu does not directly render contents into /etc/resolv.conf for these reasons.