Merge "introducint TScP and PROXY_GROUP extension"
This commit is contained in:
commit
0460baf43c
268
specs/kilo/gbp-traffic-stitching-plumber.rst
Normal file
268
specs/kilo/gbp-traffic-stitching-plumber.rst
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==========================================
|
||||||
|
Traffic Stitching Plumber
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
As part of the service chain refactor effort [0] GBP now supports the ability to provision
|
||||||
|
"node centric" service chains that are composed of interoperable multi-vendor service
|
||||||
|
nodes linked by a Plumber, which takes care of placing the services in the underlying
|
||||||
|
infrastructure in a way that complies with the user intent.
|
||||||
|
Each Node Driver will expose a set of networking requirements via the get_plumbing_info
|
||||||
|
API, that will be used by the plumber to ensure that the traffic flows correctly.
|
||||||
|
As for today, the only plumber implementation we have (obviously intended as a placeholder
|
||||||
|
for testing) just blindly add Policy Targets to the provider and the consumer
|
||||||
|
groups, making the chain ordering useless and traffic flowing incorrect.
|
||||||
|
|
||||||
|
This document will address the design of a Plumber that will guarantee traffic
|
||||||
|
to flow as expected throughout the chain, in the order specified by the SCS.
|
||||||
|
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
The proposal of this blueprint is to implement a Traffic Stitching Plumber (TScP)
|
||||||
|
that uses the GBP underlying constructs in order to guarantee a correct traffic flow
|
||||||
|
across services from their provider to the consumer and vice versa.
|
||||||
|
As discussed in [0] the output of the plumbing operations will be either the creation or
|
||||||
|
deletion of a set of Service Targets, which effectively result in creation of Policy Targets exposed
|
||||||
|
to the specific Node Driver for its own use. In addition to that, TScP will create a set of L2Ps
|
||||||
|
and/or PTGs that are "stitched" together and host the actual service PTs.
|
||||||
|
|
||||||
|
|
||||||
|
The creation of said plumber, will be divided in three macro steps:
|
||||||
|
|
||||||
|
1. Introduction of the PROXY_GROUP driver extension, an extension of the base
|
||||||
|
GBP API that introduces a way to "proxy" a PTG with another that "eats" all
|
||||||
|
the incoming and outgoing traffic from the original PTG;
|
||||||
|
|
||||||
|
2. Make RMD compliant with the PROXY_GROUP extension;
|
||||||
|
|
||||||
|
3. Implement the TScP, that will exclusively make use of existing GBP constructs
|
||||||
|
(and proxy_group extension) in order to deploy the chain. This will guarantee
|
||||||
|
interoperability across multiple backend solutions.
|
||||||
|
|
||||||
|
|
||||||
|
PROXY_GROUP driver extension.
|
||||||
|
The main functionality exposed by this extension is the ability to put a PTG
|
||||||
|
"in front" of an existing one (in a linked list fashion). Whenever a PTG
|
||||||
|
proxies another, all the traffic going to the original PTG will have to go
|
||||||
|
through the proxy fist. Traffic from the Proxy through the original group will
|
||||||
|
go through a special PT that has the proxy_gateway flag set to True.
|
||||||
|
In addition to the above, a new "group_default_gateway" attribute is introduced
|
||||||
|
for PTs, that indicates a special PT that will take the default gateway address
|
||||||
|
for a given group (typically enforced by reserving the corresponding Neutron
|
||||||
|
Subnet address). The flow representation below describes how traffic flows
|
||||||
|
from a L3P (for simplicity) to a PTG proxied by another:
|
||||||
|
|
||||||
|
asciiflow::
|
||||||
|
|
||||||
|
+---+ +-------+
|
||||||
|
| | | | +-------+
|
||||||
|
| | +--------------+ +-----------+ | |
|
||||||
|
|PTG<-----> proxy_gateway| PROXY | group dgw <-----> L3P |
|
||||||
|
| | +--------------+ +-----------+ | |
|
||||||
|
| | | | +-------+
|
||||||
|
+---+ +-------+
|
||||||
|
|
||||||
|
|
||||||
|
There are two types of Proxies: L2 and L3 proxy. A L2 proxy will share the
|
||||||
|
same subnets as the original group (at least at the CIDR level, may be different
|
||||||
|
Neutron's subnets). In a L2 Proxy traffic is supposed to go through the proxy
|
||||||
|
without being routed. A L3 proxy will route traffic to the original group,
|
||||||
|
and will have its own subnet coming from a proxy_ip_pool, new attribute that
|
||||||
|
extends the L3P.
|
||||||
|
|
||||||
|
Note that this extension will be exclusively for *internal* use! Meaning that
|
||||||
|
the TScP is likely the only entity that will even make use of this API.
|
||||||
|
|
||||||
|
|
||||||
|
RMD compliance with PROXY_GROUP extension.
|
||||||
|
The RMD will use existing Neutron constructs for implementing the PROXY_GROUP
|
||||||
|
extension using the semantic described above. More specifically, whenever a
|
||||||
|
Proxy is put in front of a PTG, the latter will be detached from the L3P router and
|
||||||
|
replaced by the Proxy. Is then expected that a proxy_gateway PT is created and
|
||||||
|
a proper function (depending from the proxy type) is created for ensuring traffic
|
||||||
|
flow.
|
||||||
|
|
||||||
|
In case of L3 proxies, the subnet allocation will happen just like it does for
|
||||||
|
normal PTGs, but from a different Pool (proxy_ip_pool). Also, routes need
|
||||||
|
to be updated properly across the Neutron subnets/routers when a L3 Proxy
|
||||||
|
is used.
|
||||||
|
|
||||||
|
TScP implementation.
|
||||||
|
The last step of the implementation is the TScP itself. By using the new
|
||||||
|
PROXY_GROUP constructs, the TScP plumber will take care of setting up the
|
||||||
|
Service Chain datapath.
|
||||||
|
Depending on the plumbing type used (defined in a different blueprint) the
|
||||||
|
TScP will create the correct proxy type and PTs to be provided to the node
|
||||||
|
driver for the actual service plugging to happen. Support for a management
|
||||||
|
PTG will also be implemented.
|
||||||
|
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
A number of tables are created for the PROXY_GROUP extension to work:
|
||||||
|
|
||||||
|
GroupProxyMapping (gp_group_proxy_mappings):
|
||||||
|
* policy_target_group_id - proxy PTG UUID;
|
||||||
|
* proxied_group_id - UUID of the proxied PTG
|
||||||
|
* proxy_group_id - UUID of the current PTG's proxy
|
||||||
|
* proxy_type - ENUM (L2/L3)
|
||||||
|
|
||||||
|
|
||||||
|
ProxyGatewayMapping(gp_proxy_gateway_mappings):
|
||||||
|
* policy_target_id - PT UUID
|
||||||
|
* proxy_gateway - Bool indicating whether this PT is a gateway to proxy
|
||||||
|
* group_default_gateway - Bool indicating whether this PT is the DG for its PTG
|
||||||
|
|
||||||
|
|
||||||
|
ProxyIPPoolMapping(gp_proxy_ip_pool_mapping):
|
||||||
|
* l3_policy_id - L3P UUID
|
||||||
|
* proxy_ip_pool - IP pool (address/cidr) to be used for L3 proxies
|
||||||
|
* proxy_subnet_prefix_length - Iterger value, prefix len for the proxy subnets
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The REST API changes look like follows (note that they only ally if the PROXY_GROUP
|
||||||
|
extension is configured)::
|
||||||
|
|
||||||
|
EXTENDED_ATTRIBUTES_2_0 = {
|
||||||
|
gp.POLICY_TARGET_GROUPS: {
|
||||||
|
'proxied_group_id': {
|
||||||
|
'allow_post': True, 'allow_put': False,
|
||||||
|
'validate': {'type:uuid_or_none': None}, 'is_visible': True,
|
||||||
|
'default': attr.ATTR_NOT_SPECIFIED,
|
||||||
|
'enforce_policy': True},
|
||||||
|
'proxy_type': {
|
||||||
|
'allow_post': True, 'allow_put': False,
|
||||||
|
'validate': {'type:values': ['l2', 'l3', None]},
|
||||||
|
'is_visible': True, 'default': attr.ATTR_NOT_SPECIFIED,
|
||||||
|
'enforce_policy': True},
|
||||||
|
'proxy_group_id': {
|
||||||
|
'allow_post': False, 'allow_put': False,
|
||||||
|
'validate': {'type:uuid_or_none': None}, 'is_visible': True,
|
||||||
|
'enforce_policy': True},
|
||||||
|
# TODO(ivar): The APIs should allow the creation of a group with a
|
||||||
|
# custom subnet prefix length. It may be useful for both the proxy
|
||||||
|
# groups and traditional ones.
|
||||||
|
},
|
||||||
|
gp.L3_POLICIES: {
|
||||||
|
'proxy_ip_pool': {'allow_post': True, 'allow_put': False,
|
||||||
|
'validate': {'type:subnet': None},
|
||||||
|
'default': '192.168.0.0/16', 'is_visible': True},
|
||||||
|
'proxy_subnet_prefix_length': {'allow_post': True, 'allow_put': True,
|
||||||
|
'convert_to': attr.convert_to_int,
|
||||||
|
# for ipv4 legal values are 2 to 30
|
||||||
|
# for ipv6 legal values are 2 to 127
|
||||||
|
'default': 29, 'is_visible': True},
|
||||||
|
# Proxy IP version is the same as the standard L3 pool ip version
|
||||||
|
},
|
||||||
|
gp.POLICY_TARGETS: {
|
||||||
|
# This policy target will be used to reach the -proxied- PTG
|
||||||
|
'proxy_gateway': {
|
||||||
|
'allow_post': True, 'allow_put': False, 'default': False,
|
||||||
|
'convert_to': attr.convert_to_boolean,
|
||||||
|
'is_visible': True, 'required_by_policy': True,
|
||||||
|
'enforce_policy': True},
|
||||||
|
# This policy target is the default gateway for the -current- PTG
|
||||||
|
# Only for internal use.
|
||||||
|
'group_default_gateway': {
|
||||||
|
'allow_post': True, 'allow_put': False, 'default': False,
|
||||||
|
'convert_to': attr.convert_to_boolean,
|
||||||
|
'is_visible': True, 'required_by_policy': True,
|
||||||
|
'enforce_policy': True},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
|
||||||
|
Performance impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
Community impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* Ivar Lazzaro (mmaleckk)
|
||||||
|
|
||||||
|
Work items
|
||||||
|
----------
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Tempest tests
|
||||||
|
-------------
|
||||||
|
|
||||||
|
|
||||||
|
Functional tests
|
||||||
|
----------------
|
||||||
|
|
||||||
|
|
||||||
|
API tests
|
||||||
|
---------
|
||||||
|
|
||||||
|
|
||||||
|
Documentation impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
User documentation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
|
||||||
|
Developer documentation
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
[0] https://github.com/stackforge/group-based-policy-specs/blob/master/specs/kilo/gbp-service-chain-
|
||||||
|
driver-refactor.rst
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user