diff --git a/kayobe/plugins/filter/networks.py b/kayobe/plugins/filter/networks.py
index 178d1d7ebf75782d8723a7b2dc97319267406a27..8ccd21b7788b3ea05fb5169f27e6ce5ab82c59a2 100644
--- a/kayobe/plugins/filter/networks.py
+++ b/kayobe/plugins/filter/networks.py
@@ -595,7 +595,7 @@ def net_configdrive_network_device(context, name, inventory_hostname=None):
     bootproto = net_bootproto(context, name, inventory_hostname)
     mtu = net_mtu(context, name, inventory_hostname)
     vlan = net_vlan(context, name, inventory_hostname)
-    if vlan:
+    if vlan and '.' in device:
         backend = [device.split('.')[0]]
     else:
         backend = None
@@ -608,7 +608,7 @@ def net_configdrive_network_device(context, name, inventory_hostname=None):
         'mtu': mtu,
         'backend': backend,
     }
-    if vlan:
+    if backend:
         interface['type'] = 'vlan'
     interface = {k: v for k, v in interface.items() if v is not None}
     return interface
diff --git a/releasenotes/notes/fixes-keyerror-vlan-link-c177cf719e070df6.yaml b/releasenotes/notes/fixes-keyerror-vlan-link-c177cf719e070df6.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c90c991f074d004f8e5f43f5121c02495282fffa
--- /dev/null
+++ b/releasenotes/notes/fixes-keyerror-vlan-link-c177cf719e070df6.yaml
@@ -0,0 +1,8 @@
+---
+fixes:
+  - |
+    Fixes an issue with config drive generation for infrastructure and seed VMs
+    when using untagged interfaces. The symptom of this issue is that kayobe
+    cannot login to the instance. If you check the libvirt console log, you
+    will see ``KeyError: 'vlan_link'``. See `story 2009910
+    <https://storyboard.openstack.org/#!/story/2009910>`__ for details.