Support IPv6 in control plane

Registered by Maciej Kucia

IPv6 control plane support is a community goal for the Train cycle [1].
Kolla ansible does not yet support IPv6 for control plane access.
This blueprint is aiming to change this.

LATE EDIT: It turned out the goal is not for deployment projects.

[1] https://governance.openstack.org/tc/goals/train/ipv6-support-and-testing.html

Blueprint information

Status:
Complete
Approver:
Jeffrey Zhang
Priority:
Medium
Drafter:
Radosław Piliszek
Direction:
Approved
Assignee:
Radosław Piliszek
Definition:
Approved
Series goal:
Accepted for train
Implementation:
Implemented
Milestone target:
milestone icon 9.0.0
Started by
Radosław Piliszek
Completed by
Radosław Piliszek

Related branches

Sprints

Whiteboard

Addressed by: https://review.openstack.org/575994 (abandoned)
    WIP When IPv4 address is not available, return IPv6

Gerrit topic: https://review.opendev.org/#/q/topic:bp/ipv6-control-plane

Loose thought: Whatever support is added should be consistent between OpenStack projects and ideally other deployment tools (e.g. OSA, Tripleo).

WIP yoctozepto ideas:

Multiple addresses

The main difference from IPv4 (in ansible and k-a context) is that it is normal for IPv6 to have several addresses per interface. The main reason is that for normal operation IPv6 establishes a link-local address. In case of unicast, link-local and global are the only available scopes so the only scopes we care about. This invalidates our approach of using the first address.

Link-local is a fine candidate for unroutable networks because it frees the network designer from subnetting, yet it introduces an obstacle for networked apps because they are forced to specify the output interface as there is no routing involved.
DONE: check whether OpenStack services can work with link-local addresses at all
Services seem to support the addr%interface notation when binding and targetting servers. I wonder whether all but that will come out during proper tests. Interesting to see whether CI (Zuul) will like addresses like this or will they be filtered out.

The other scope addresses, global addresses, behave like "normal" unicast IPv4 addresses, they are routable using analogical roules. Again, an interface may have multiple global addresses, unlike in IPv4 where it is less common and "the other" addresses are referred to as secondary (in IPv6 they are all "equals"). Still, they might be used for whatever purpose (e.g. testing subnetting without VLAN support).

To better accommodate both existing IPv4 and upcoming IPv6 support, it might be wise to support choice of subnet address along with interface name. This way we could also provision relevant sanity checks (incl. for subnet length).

Co-existence with IPv4

We should ideally support three modes of operation:
- IPv4 only
- IPv6 only
- dual-stack
possibly elasticly enough so that a deployment may use a mix of these modes.
Hence network type should be declared (possibly implicitly but explicitly allows for sounder sanity checks).

Proposed solution uses explicit version specification so that IPv6 support works like IPv4 support (first global address is considered there) when choosing IPv6 (IPv4 remains default). It applies address contexts (raw, url, memcache) where applicable.

Addressed by: https://review.opendev.org/679919
    subjectAltName using DNS for IPv6

Addressed by: https://review.opendev.org/681573
    Implement IPv6 support in the control plane

Addressed by: https://review.opendev.org/670690
    CI: Use VXLAN overlay network

Addressed by: https://review.opendev.org/689083
    Refactor NSS database var

Addressed by: https://review.opendev.org/689086
    Fix OpenSSL template

Addressed by: https://review.opendev.org/689657
    Add IPv6 control plane feature release note

Addressed by: https://review.opendev.org/689693
    Docs: Add IPv6 control plane (address families)

(?)

Work Items

Work items:
Configurable IP version = support IPv6 the way we support IPv4 (take first address): DONE
Format IPv6 address according to its context (raw/url/memcache): DONE

This blueprint contains Public information 
Everyone can see this information.