From d12442e4a47365a7215972d7ab11d8bdffd3c9c3 Mon Sep 17 00:00:00 2001 From: Danil Golov Date: Wed, 18 Oct 2017 16:28:08 +0300 Subject: [PATCH] Add VIF-Handler And Drivers Design approach The purpose of this document is to present the approach of implementation of cooperation design for VIF-handler and drivers used by it in Kuryr-Kubernetes Controller. Change-Id: I78609c2ede1b2f01b76053fc4f93c49235060a4c Signed-off-by: Danil Golov --- doc/images/vif_handler_drivers_design.png | Bin 0 -> 34900 bytes doc/source/devref/index.rst | 1 + .../devref/vif_handler_drivers_design.rst | 141 ++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 doc/images/vif_handler_drivers_design.png create mode 100644 doc/source/devref/vif_handler_drivers_design.rst diff --git a/doc/images/vif_handler_drivers_design.png b/doc/images/vif_handler_drivers_design.png new file mode 100644 index 0000000000000000000000000000000000000000..b94673583de6be26cc4050dbfbbb57e9337c26b1 GIT binary patch literal 34900 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 literal 0 HcmV?d00001 diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst index c4b4369bc..7478157ab 100644 --- a/doc/source/devref/index.rst +++ b/doc/source/devref/index.rst @@ -38,6 +38,7 @@ Design documents kuryr_kubernetes_design service_support port_manager + vif_handler_drivers_design Indices and tables diff --git a/doc/source/devref/vif_handler_drivers_design.rst b/doc/source/devref/vif_handler_drivers_design.rst new file mode 100644 index 000000000..c2b5f177a --- /dev/null +++ b/doc/source/devref/vif_handler_drivers_design.rst @@ -0,0 +1,141 @@ +.. + This work is licensed under a Creative Commons Attribution 3.0 Unported + License. + + http://creativecommons.org/licenses/by/3.0/legalcode + + Convention for heading levels in Neutron devref: + ======= Heading 0 (reserved for the title in a document) + ------- Heading 1 + ~~~~~~~ Heading 2 + +++++++ Heading 3 + ''''''' Heading 4 + (Avoid deeper levels because they do not render well.) + +================================== +VIF-Handler And Vif Drivers Design +================================== + +Purpose +------- +The purpose of this document is to present an approach for implementing +design of interaction between VIF-handler and the drivers it uses in +Kuryr-Kubernetes Controller. + +VIF-Handler +----------- +VIF-handler is intended to handle VIFs. The main aim of VIF-handler is to get +the pod object, send it to Multi-vif driver and get vif objects from it. After +that VIF-handler is able to activate, release or update vifs. Also VIF-Handler +is always authorized to get main vif for pod from generic driver. +VIF-handler should stay clean whereas parsing of specific pod information +should be moved to Multi-vif driver. + +Multi-vif driver +~~~~~~~~~~~~~~~~~ +The main driver that is authorized to call other drivers. The main aim of +this driver is to get list of enabled drivers, parse pod annotations, pass +pod object to enabled drivers and get vif objects from them to pass these +objects to VIF-handler finally. The list of parsed annotations by Multi-vif +driver includes sriov requests, additional subnets requests and specific ports. +If the pod object doesn't have annotation which is required by some of the +drivers then this driver is not called or driver can just return. +Diagram describing VifHandler - Drivers flow is giver below: + +.. image:: ../../images/vif_handler_drivers_design.png + :alt: vif handler drivers design + :align: center + :width: 100% + +Config Options +~~~~~~~~~~~~~~ +Add new config option "enabled_vif_drivers" (list) to config file that shows +what drivers should be used in Multi-vif driver to collect vif objects. This +means that Multi-vif driver will pass pod object only to specified drivers +(generic driver is always used by default and it's not necessary to specify +it) and get vifs from them. +Option in config file might look like this: + +.. code-block:: ini + + [kubernetes] + + enabled_vif_drivers = sriov, additional_subnets + + +Additional Subnets Driver +~~~~~~~~~~~~~~~~~~~~~~~~~ +Since it is possible to request additional subnets for the pod through the pod +annotations it is necessary to have new driver. According to parsed information +(requested subnets) by Multi-vif driver it has to return dictionary containing +the mapping 'subnet_id' -> 'network' for all requested subnets in unified format +specified in PodSubnetsDriver class. +Here's how a Pod Spec with additional subnets requests might look like: + +.. code-block:: yaml + + spec: + replicas: 1 + template: + metadata: + name: some-name + labels: + app: some-name + annotations: + openstack.org/kuryr-additional-subnets: '[ + "id_of_neutron_subnet_created_previously" + ]' + + +SRIOV Driver +~~~~~~~~~~~~ +SRIOV driver gets pod object from Multi-vif driver, according to parsed +information (sriov requests) by Multi-vif driver. It should return a list of +created vif objects. Method request_vif() has unified interface with +PodVIFDriver as a base class. +Here's how a Pod Spec with sriov requests might look like: + +.. code-block:: yaml + + spec: + containers: + - name: vf-container + image: vf-image + resources: + requests: + pod.alpha.kubernetes.io/opaque-int-resource-sriov-vf-physnet2: 1 + + +Specific ports support +---------------------- +Specific ports support is enabled by default and will be a part of the drivers +to implement it. It is possile to have manually precreated specific ports in +neutron and specify them in pod annotations as preferably used. This means that +drivers will use specific ports if it is specified in pod annotations, otherwise +it will create new ports by default. It is important that specific ports can have +vnic_type both direct and normal, so it is necessary to provide processing +support for specific ports in both SRIOV and generic driver. +Pod annotation with requested specific ports might look like this: + +.. code-block:: yaml + + spec: + replicas: 1 + template: + metadata: + name: some-name + labels: + app: some-name + annotations: + spec-ports: '[ + "id_of_direct_precreated_port". + "id_of_normal_precreated_port" + ]' + +Pod spec above should be interpreted the following way: +Multi-vif driver parses pod annotations and gets ids of specific ports. +If vnic_type is "normal" and such ports exist, it calls generic driver to create vif +objects for these ports. Else if vnic_type is "direct" and such ports exist, it calls +sriov driver to create vif objects for these ports. If certain ports are not +requested in annotations then driver doesn't return additional vifs to Multi-vif +driver.