Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Navigation
Guide That Contains This Content
[+] Expand All
[-] Collapse All

Configuring Virtual Networks for Hub-and-Spoke Topology

As of Contrail Release 3.0, hub-and-spoke topology can be used to ensure that virtual machines (VMs) don’t communicate with each other directly; their communication is only allowed indirectly by means of a designated hub virtual network.

Route Targets for Virtual Networks in Hub-and-Spoke Topology

Hub-and-spoke topology can be used to ensure that virtual machines (VMs) don’t communicate with each other directly; their communication is only allowed indirectly by means of a designated hub virtual network (VN). The VMs are configured in spoke VNs.

This is useful for enabling VMs in a spoke VN to communicate by means of a policy or firewall, where the firewall exists in a hub site.

hub-and-spoke topology is implemented using two route targets (hub-rt and spoke-rt), as follows:

  • Hub route target (hub-rt):
    • The hub VN exports all routes tagged with hub-rt.
    • The spoke VN imports routes tagged with hub-rt, ensuring that the spoke VN has only routes exported by the hub VN.
    • To attract spoke traffic, the hub VN readvertises the spoke routes or advertises the default route.
  • Spoke route target (spoke-rt):
    • All spoke VNs export routes with route target spoke-rt.
    • The hub VN imports all spoke routes, ensuring that hub VN has all spoke routes.

Note: The hub VN or VRF can reside in an external gateway, such as an MX Series router, while the spoke VN resides in the Contrail controller.

Example: Configuring Hub-and-Spoke Virtual Networks

The following example uses a script to configure the hub-and-spoke virtual networks.

In the example, the “hub-vn” is configured as a hub virtual network, with the import route target of “target:1:1” and the export route target of “target:1:2”. The “spoke-vn*” is configured as a spoke virtual network, with the import route target of “target:1:2” and the export route target of “target:1:1”.

The spoke-rt is “target:1:1” and the hub-rt is “target:1:2”, consequently, the “hub-vn” imports “spoke-rt” and exports “hub-rt”, and the spoke-vn imports “hub-rt” and exports “spoke-rt”.

Using vnc-api to Configure Hub-and-Spoke Topology Example

from vnc_api.vnc_api import *
lib = VncApi("admin", "<password>", "admin", "<ip address>", "8082")
vn=lib.virtual_network_read(fq_name=["default-domain", "admin", "hub-vn"])
vn.set_import_route_target_list(RouteTargetList(["target:1:1"]))
vn.set_export_route_target_list(RouteTargetList(["target:1:2"]))
lib.virtual_network_update(vn)

vn=lib.virtual_network_read(fq_name=["default-domain", "admin", "spoke-vn1"])
vn.set_import_route_target_list(RouteTargetList(["target:1:2"]))
vn.set_export_route_target_list(RouteTargetList(["target:1:1"]))
lib.virtual_network_update(vn)

vn=lib.virtual_network_read(fq_name=["default-domain", "admin", "spoke-vn2"])
vn.set_import_route_target_list(RouteTargetList(["target:1:2"]))
vn.set_export_route_target_list(RouteTargetList(["target:1:1"]))
lib.virtual_network_update(vn)

vn=lib.virtual_network_read(fq_name=["default-domain", "admin", "spoke-vn3"])
vn.set_import_route_target_list(RouteTargetList(["target:1:2"]))
vn.set_export_route_target_list(RouteTargetList(["target:1:1"]))
lib.virtual_network_update(vn)

vn=lib.virtual_network_read(fq_name=["default-domain", "admin", "spoke-vn4"])
vn.set_import_route_target_list(RouteTargetList(["target:1:2"]))
vn.set_export_route_target_list(RouteTargetList(["target:1:1"]))
lib.virtual_network_update(vn)

Troubleshooting Hub-and-Spoke Topology

The following examples provide methods to help you troubleshoot hub-and-spoke configurations.

Example: Validating the Configuration on the Virtual Network

The following example uses the api-server HTTP get request to validate the configuration on the virtual network.

Hub VN configuration:

curl -u admin:<password> http://<host ip>/virtual-network/<hub-vn-uuid>| python -m json.tool

{
    "virtual-network": {
        "display_name": "hub-vn",
        "fq_name": [
            "default-domain",
            "admin",
            "hub-vn"
        ],
        "export_route_target_list": {
            "route_target": [
                "target:1:2"
            ]
        },
        "import_route_target_list": {
            "route_target": [
                "target:1:1"
            ]
        },
    }
}

Spoke VN configuration:

curl -u admin:<password> http://<host ip>:8095/virtual-network/<spoke-vn-uuid> | python -m json.tool

{
{
    "virtual-network": {
        "display_name": "spoke-vn1",
        "fq_name": [
            "default-domain",
            "admin",
            "spoke-vn1"
        ],
        "export_route_target_list": {
            "route_target": [
                "target:1:1"
            ]
        },
        "import_route_target_list": {
            "route_target": [
                "target:1:2"
            ]
        },
    }
}

Example: Validate the Configuration on the Routing Instance

The following example uses api-server HTTP get request to validate the configuration on the routing instance.

Spoke VRF configuration (with a system-created VRF by schema transformer):

user@node:/opt/contrail/utils# curl -u admin:<password> http://<host ip>:8095/routing-instance/<spoke-vrf-uuid>| python -m json.tool

{
    "routing-instance": {
        "display_name": "spoke-vn1",
        "fq_name": [
            "default-domain",
            "admin",
            "spoke-vn1",
            "spoke-vn1"
        ],
        "route_target_refs": [
            {
                "attr": {
                    "import_export": "export"
                },
                "href": "http://<host ip>:8095/route-target/446a3bbe-f263-4b58-a537-8333878dd7c3",
                "to": [
                    "target:1:1"
                ],
                "uuid": "446a3bbe-f263-4b58-a537-8333878dd7c3"
            },
            {
                "attr": {
                    "import_export": null
                },
                "href": "http://<host ip>:8095/route-target/7668088d-e403-414f-8f5d-649ed80e0689",
                "to": [
                    "target:64512:8000012"
                ],
                "uuid": "7668088d-e403-414f-8f5d-649ed80e0689"
            },
            {
                "attr": {
                    "import_export": "import"
                },
                "href": "http://<host ip>:8095/route-target/8f216064-8488-4486-8fce-b4afb87266bb",
                "to": [
                    "target:1:2"
                ],
                "uuid": "8f216064-8488-4486-8fce-b4afb87266bb"
            }
        ],
        "routing_instance_is_default": true,
    }
}

Hub VRF configuration:

curl -u admin:<password> http://<host ip>:8095/routing-instance/<hub-vrf-uuid> | python -m json.tool

{
    "routing-instance": {
        "display_name": "hub-vn",
        "fq_name": [
            "default-domain",
            "admin",
            "hub-vn",
            "hub-vn"
        ],
        "route_target_refs": [
            {
                "attr": {
                    "import_export": "import"
                },
                "href": "http://<host ip>:8095/route-target/446a3bbe-f263-4b58-a537-8333878dd7c3",
                "to": [
                    "target:1:1"
                ],
                "uuid": "446a3bbe-f263-4b58-a537-8333878dd7c3"
            },
            {
                "attr": {
                    "import_export": "export"
                },
                "href": "http://<host ip>:8095/route-target/8f216064-8488-4486-8fce-b4afb87266bb",
                "to": [
                    "target:1:2"
                ],
                "uuid": "8f216064-8488-4486-8fce-b4afb87266bb"
            },
            {
                "attr": {
                    "import_export": null
                },
                "href": "http://<host ip>:8095/route-target/a85fec19-eed2-430c-af23-9919aca1dd12",
                "to": [
                    "target:64512:8000016"
                ],
                "uuid": "a85fec19-eed2-430c-af23-9919aca1dd12"
            }
        ],
        "routing_instance_is_default": true,
    }
}

Example: Using Contrail Control Introspect

Figure 1 shows the import and export targets for hub-vn and spoke-vns, by invoking contrail-control-introspect.

Figure 1: Contrail Introspect

Contrail Introspect

Modified: 2016-07-27

Modified: 2016-07-27