When a container network is created and attached to a VRF, the container network interface on the host fails to generate an IPv6 Link-Local address for itself:
6: pod-SERVICES: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master SERVICE state UP group default qlen 1000 link/ether 8a:61:51:a0:21:09 brd ff:ff:ff:ff:ff:ff inet 169.254.1.1/24 brd 169.254.1.255 scope global pod-SERVICES valid_lft forever preferred_lft forever inet6 fd00:169:254:1::1/64 scope global valid_lft forever preferred_lft forever
There is no fe80::/10 address shown above.
It appears the EUI64 address is generated before assigning the interface to the VRF. This causes the address to be lost when the VRF is changed in the next line:
/src/conf_mode/container.py#L476:
if interface_exists(network_name): tmp = Interface(network_name) tmp.add_ipv6_eui64_address('fe80::/64') tmp.set_vrf(network_config.get('vrf', ''))
Swapping lines 476 and 477 resolved this issue:
6: pod-SERVICES: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master SERVICE state UP group default qlen 1000 link/ether 8a:61:51:a0:21:09 brd ff:ff:ff:ff:ff:ff inet 169.254.1.1/24 brd 169.254.1.255 scope global pod-SERVICES valid_lft forever preferred_lft forever inet6 fd00:169:254:1::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::8861:51ff:fea0:2109/64 scope link valid_lft forever preferred_lft forever
Link-local address now present (fe80::8861:51ff:fea0:2109/64)