Spec for coe-netvirt integration 50/63250/14
authorFaseela K <faseela.k@ericsson.com>
Mon, 18 Sep 2017 21:00:13 +0000 (02:30 +0530)
committerSam Hague <shague@redhat.com>
Mon, 11 Dec 2017 17:28:52 +0000 (17:28 +0000)
Change-Id: Ic2e739feaa6dbf3be8a69c7082046f47ae7eb1f9
Signed-off-by: Faseela K <faseela.k@ericsson.com>
docs/specs/coe-integration.rst [new file with mode: 0644]
docs/specs/images/coe-netvirt-integration-components.PNG [new file with mode: 0644]
docs/specs/index.rst

diff --git a/docs/specs/coe-integration.rst b/docs/specs/coe-integration.rst
new file mode 100644 (file)
index 0000000..f664235
--- /dev/null
@@ -0,0 +1,366 @@
+.. contents:: Table of Contents
+      :depth: 5
+
+=======================
+Netvirt COE Integration
+=======================
+
+https://git.opendaylight.org/gerrit/#/q/topic:coe_integration
+
+This spec proposes how to integrate COE and Netvirt projects for enabling
+networking(L2 and L3 support) for containers.
+
+COE(Container Orchestration Engine) project aims at developing a framework for integrating
+Container Orchestration Engine (like Kubernetes) and OpenDaylight. Netvirt will serve as
+the backend for COE, as Netvirt provides generic enough constructs which will work
+for VMs as well as Containers.
+
+Problem Description
+===================
+
+Current Netvirt project does not have a driver that will work with Kubernetes baremetal cluster.
+COE project aims at enabling the same, and will require a plugin in Netvirt project
+to convert the events from Kubernetes to the required constructs in Netvirt.
+
+Network Requirements
+====================
+k8s imposes some fundamental requirements on the networking implementation:
+
+* All containers can communicate without NAT.
+
+* All nodes can communicate with containers without NAT.
+
+* The IP the container sees itself is the same IP that others see.
+
+The Kubernetes model is for each pod to have an IP in a flat shared namespace
+that allows full communication with physical computers and containers across
+the network.
+
+High-Level Components:
+======================
+
+The high level view of the end to end solution is given in the below picture :
+
+.. image:: images/coe-netvirt-integration-components.PNG
+
+
+Proposed change
+===============
+
+A new module called `coe` will be added in Netvirt which will serve as the watcher
+for all the container orchestration related events. This module will be responsible for
+converting the COE related constructs to Netvirt constructs.
+
+Netvirt Changes
+---------------
+
+DHCP Module
+^^^^^^^^^^^
+
+COE will be using DHCP dynamic allocation feature in Netvirt, which has some missing parts
+for the integration to work. DHCP module's bind service logic so far works only for neutron ports.
+This has to be enhanced to work for k8s pods as well.
+
+ARP Responder
+^^^^^^^^^^^^^
+
+ARP responder logic of Netvirt works only for neutron ports, this needs enhancements to work with
+k8s ports, so that ARP responses can be sent from OVS directly, without the need for sending the same
+to ODL.
+
+Genius changes
+--------------
+
+InterfaceManager
+^^^^^^^^^^^^^^^^
+
+IntefaceManager currently treats only nova port patterns(tap/vhu) as well as tunnel port patterns as
+unique. For any other portnames datapath-node-id will be prefixed to the port-name. CNI plugin
+creates unique ports which starts with "veth" prefix, and this needs to be added to the set of unique
+port patterns in Genius.
+
+Use Cases
+---------
+
+Use Case 1:
+^^^^^^^^^^^
+This will enable default Kubernetes behavior to allow all
+traffic from all sources inside or outside the cluster to all pods within the
+cluster. This use case does not add multi-tenancy support.
+
+Use Case 2:
+^^^^^^^^^^^
+Network isolation policy will impose limitations on the connectivity from an optional set of
+traffic sources to an optional set of destination TCP/UDP ports.
+Regardless of network policy, pods should be accessible by the host on which
+they are running to allow local health checks. This use case does not address
+multi-tenancy.
+
+More enhanced use cases can be added in the future, that will allow to add
+extra functionality
+
+
+Model Mapping
+-------------
+
+In order to support Kubernetes networking via Netvirt, we should define how
+COE model maps into Netvirt model.
+
+
++-----------------+-------------------+---------------------------------------+
+| **COE entity**  | **Netvirt entity**| **notes**                             |
++=================+===================+=======================================+
+|node + namespace | elan-instance     |  Whenever the first pod under         |
+|                 |                   |  a namespace in a node is created,an  |
+|                 |                   |  elan-instance has to be created.     |
++-----------------+-------------------+---------------------------------------+
+|namespace        | vpn-instance      |  Whenever the first pod under a       |
+|                 |                   |  namespace is created, a vpn-instance |
+|                 |                   |  has to be created.                   |
++-----------------+-------------------+---------------------------------------+
+|pod              | elan-interface    | For each pod created, an              |
+|                 |                   | elan-interface has to be created,     |
+|                 |                   | based on its node and namespace       |
++-----------------+-------------------+---------------------------------------+
+|pod              | vpn-interface     | For each pod created, a               |
+|                 |                   | vpn-interface has to be created,      |
+|                 |                   | based on its namespace                |
++-----------------+-------------------+---------------------------------------+
+
+Pipeline Changes
+----------------
+
+No pipeline changes will be introduced as part of this feature.
+
+Workflow
+--------
+
+Configure DHCP Pool(Optional)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+#. netvirt/dhcpmanager: For an immediate solution, a flat dhcp pool will be precreated
+   manually, and IPs will be allocated for PODs from this pool.
+#. netvirt/dhcpmanager: For an immediate solution, a flat service pool will be precreated
+   manually, and IPs will be allocated for SERVICEs from this pool.
+
+Create Pod
+^^^^^^^^^^
+#. coe/coe-northbound: User created a POD
+#. netvirt/coe: When the first POD is created under a namespace in a node, coe module in Netvirt will
+   create an elan-instance with node-ip:namespace as the name. Also, for each POD, an ietf-interface
+   as well as an elan-interface objects will be created in the MD-SAL datastore, with name
+   set as "namespace:pod-name".
+#. netvirt/coe: When the first POD is created under a namespace, coe module in Netvirt will
+   create a vpn-instance with namespace as the name. Also, for each POD, a vpn-interface object
+   will be created in the MD-SAL datastore with name set as "namespace:pod-name".
+#. coe/cni-plugin:  The cni plugin in k8s will create the tap port on the OVS with external-id
+   set to the "namespace:pod-name".
+#. genius/interfacemanager: Whenever the tapport is created, interfacemanager will take care of
+   programming table0(Lport Ingress Table) and table220(Egress Dispatcher Table) programming,
+   and population of interface-state.
+#. netvirt/elanmanager: Whenever interface-state is created, elanmanager will take care of
+   populating all L2 related flows in OVS.
+#. netvirt/vpnmanager: Whenever interface-state is created, vpnmanager will take care of
+   populating all L3 related flows in OVS.
+
+Create Service
+^^^^^^^^^^^^^^
+
+#. netvirt/coe: When a pod is attached to a service, floating-ip-info has to be populated
+#. netvirt/natmanager: Listens on floating-ip-changes and do the NATing as it is done currently.
+
+Delete Service
+^^^^^^^^^^^^^^
+
+#. netvirt/coe: When a pod is removed from a service, corresponding floating-ip-info will be removed.
+#. netvirt/natmanager: Listens on floating-ip-changes and remove the NAT rules approporiately.
+
+Delete Pod
+^^^^^^^^^^
+
+#. coe/coe-northbound: User deleted a POD
+#. netvirt/coe: When the last POD is deleted under a namespace in a node, coe module in Netvirt will
+   delete the elan-instance with namespace as the name. Also, for each POD, the corresponding ietf-interface
+   as well as an elan-interface and vpn-interface objects will be deleted in the MD-SAL datastore.
+#. coe/cni-plugin:  The cni plugin in k8s will delete the tap port on the OVS.
+#. genius/interfacemanager: Whenever the tapport is deleted, interfacemanager will take care of
+   deleting table0(Lport Ingress Table) and table220(Egress Dispatcher Table)
+   flows on OVS, and deletion of interface-state.
+#. netvirt/elanmanager: Whenever interface-state is deleted, elanmanager will take care of
+   removing all L2 related flows in OVS.
+#. netvirt/vpnmanager: Whenever interface-state is deleted, vpnmanager will take care of
+   removing all L3 related flows in OVS.
+
+Assumptions
+-----------
+
+
+Reboot Scenarios
+----------------
+This feature support all the following Reboot Scenarios for EVPN:
+    *  Entire Cluster Reboot
+    *  Leader PL reboot
+    *  Candidate PL reboot
+    *  OVS Datapath reboots
+    *  Multiple PL reboots
+    *  Multiple Cluster reboots
+    *  Multiple reboots of the same OVS Datapath.
+    *  Openstack Controller reboots
+
+Clustering considerations
+-------------------------
+The feature should operate in ODL Clustered environment reliably.
+
+Other Infra considerations
+--------------------------
+N.A.
+
+Security considerations
+-----------------------
+N.A.
+
+Scale and Performance Impact
+----------------------------
+Not covered by this Design Document.
+
+Targeted Release
+----------------
+Oxygen
+
+Alternatives
+------------
+An alternative for container networking is to use kuryr-kubernetes which will
+work with ODL as backend. However the same will not work in an environement where Openstack
+is not present. There are scenarios where Baremetal Kubernetes clusters have to work without
+Openstack, and this feature comes into picture there.
+
+Usage
+=====
+
+Features to Install
+-------------------
+This feature add the below new feature :
+
+    * odl-netvirt-coe
+
+REST API
+--------
+
+Creating DHCP Pool
+^^^^^^^^^^^^^^^^^^
+
+**URL:** restconf/config/dhcp_allocation_pool:dhcp_allocation_pool/
+
+**Sample JSON data**
+
+.. code-block:: json
+
+  {
+    "dhcp_allocation_pool:network": [
+     {
+        "dhcp_allocation_pool:allocation-pool": [
+          {
+            "dhcp_allocation_pool:subnet": "192.168.10.0/24",
+            "dhcp_allocation_pool:allocate-to": "192.168.10.50",
+            "dhcp_allocation_pool:gateway": "192.168.10.2",
+            "dhcp_allocation_pool:allocate-from": "192.168.10.3"
+           }
+        ],
+        "dhcp_allocation_pool:network-id": "pod-namespace"
+      }
+    ]
+  }
+
+Creating POD directly in COE
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**URL:** restconf/config/pod:coe
+
+**Sample JSON data**
+
+.. code-block:: json
+
+  {
+    "pod:pods": [
+      {
+        "pod:version": "Some version",
+        "pod:uid": "AC092D9B-E9Eb-BAE2-eEd8-74Aca2B7Fa9C",
+        "pod:interface": [
+          {
+            "pod:uid": "7bA91A3A-f17E-2eBB-eDec-3BBBEa27DCa7",
+            "pod:ip-address": "0.147.0.7",
+            "pod:network-id": "fBAD80df-B0B4-0580-8D14-11FcaCED2ac6",
+            "pod:network-type": "FLAT",
+            "pod:segmentation-id": "0"
+          }
+        ]
+      }
+    ]
+  }
+
+Creating SERVICE directly in COE
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**URL:** restconf/config/service:service-information
+
+**Sample JSON data**
+
+.. code-block:: json
+
+  {
+    "service:service-information": {
+      "service:services": [
+        {
+          "service:uid": "EeafFFB7-D9Fc-aAeD-FBc9-8Af8BFaacDD9",
+          "service:cluster-ip-address": "5.21.5.0",
+          "service:endpoints": [
+            "AFbcF0EB-Fc3f-acea-A438-5CFDfCEfbcb0"
+          ]
+        }
+      ]
+    }
+  }
+
+Assignee(s)
+-----------
+
+Primary assignee:
+  Faseela K <faseela.k@ericsson.com>
+
+Other contributors:
+   Frederick Kautz <fkautz@redhat.com>
+
+   Mohamed El-serngawy <m.elserngawy@gmail.com>
+
+Work Items
+----------
+
+Dependencies
+============
+
+Testing
+=======
+
+Junits
+------
+
+This feature will support following use cases:
+
+* TC 1: Create a POD within a node under a namespace
+* TC 2: Attach a POD to service
+* TC 3: Remove a POD from service
+* TC 4: Delete a POD from a namespace
+
+CSIT
+----
+CSIT will be enhanced to cover this feature by providing new CSIT tests.
+
+Documentation Impact
+====================
+This will require changes to User Guide and Developer Guide.
+
+References
+==========
+
+* OpenStack Spec  - https://review.openstack.org/#/c/453160
+* kuryr k8s integration - https://review.openstack.org/#/c/281132/14/doc/source/specs/mitaka/kuryr_k8s_integration.rst
+* cni plugin proposal - https://docs.google.com/presentation/d/1LrHPkoLPo6Rgc_DjpqOvUucKPFswaEcfNwO3Z2A3_TA/edit#slide=id.p
\ No newline at end of file
diff --git a/docs/specs/images/coe-netvirt-integration-components.PNG b/docs/specs/images/coe-netvirt-integration-components.PNG
new file mode 100644 (file)
index 0000000..e190825
Binary files /dev/null and b/docs/specs/images/coe-netvirt-integration-components.PNG differ
index ed566a6eaa14759407af5d1dafd1381c9a7f01d1..dada1d45be8c3b9c91c81f8e7c2b4d13a8ad0d95 100644 (file)
@@ -14,6 +14,7 @@ Contents:
    ACLs - Remote ACL - Indirection Table to Improve Scale <remote_acl_indirection>
    ACLs - ACL reflection on existing traffic <acl-reflection-on-existing-traffic>
    ACLs - Support for protocols that are not supported by conntrack <acl-non-conntrack>
+   Coe Netvirt Integration <coe-integration.rst>
    Conntrack Based SNAT <conntrack-based-snat>
    Cross site connectivity with Federation service <federation-plugin>
    DHCP Server with Dynamic Allocation Pool <dhcp-dynamic-allocation-pool>