High Level Architecture for the Networking Plugin




Networking Plugin

The Networking Plugin has the ability to create, delete, query and update virtual networks. This will implement API's like CreateVL, DeleteVL, QueryVL and UpdateVL. Networking plugin on initialization will call discovery function to find out about the type of networking plugin available. It'll load the required plugin and call init functions of the appropriate plugin.

CreateVL:

Input: Name of the Virtual Network, Subnet IP, Gateway IP

Output: Success/Failure

Create VL for OVN:

Input: Name of the Virtual Network, Subnet IP, Gateway IP

Output: Success/Failure

                      sudo ovn-nbctl --may-exist ls-add ovn-ls-24 -- set logical_switch ovn-ls-24 other-config:subnet=172.16.24.0/24 external-ids:gateway_ip=172.16.24.1/24



                   ovn-nbctl  --may-exist lr-nat-add GR_k8smaster snat 192.168.121.19 172.16.24.0/24


Multus Integration

One of the requirements for VNF's  is to support multiple virtual network interfaces and multiple IP addresses. Multus acts as a Multi plugin in Kubernetes and provides the multiple network interface support in a pod. https://github.com/intel/multus-cni. It'll be used in this project to provide a default management port based on Flannel to all VNF's. The other interfaces will all be based on ovn-kubernetes as discussed in the next section.

CNI configuration

Multus is configured to have default network as Flannel:

{

"type": "multus",
"kubeconfig": "/etc/kubernetes/admin.conf",
"delegates": [
   {
         "type": "flannel",
         "masterplugin": true,
          "delegate": {
              "isDefaultGateway": true
           }
    }
]

}

Create following network resource for OVN.

OVN network resources in Kubernetes:

apiVersion: "kubernetes.cni.cncf.io/v1"
kind: Network
metadata:
name: ovn-network
spec:
config: '{
"name": "ovn-kubernetes",
"type": "ovn-k8s-cni-overlay"
}'

With this setup a Pod can be annotated as below for OVN:

apiVersion: v1
kind: Pod
metadata:
  name: pod-ovn
  annotations:
     kubernetes.v1.cni.cncf.io/networks: '[
                { "name": "ovn-network"}
      ]'
spec: # specification of the pod's contents
containers:
     - name: pod-ovn
      image: "busybox"
      command: ["top"]
      stdin: true
      tty: true

With this setup and with above pod definition a Pod with two interfaces is created. This has a limitation though. The OVN interfaces always belongs to the subnet configured during initialization.

OPEN: To get above pod configuration to work ovn-kubernetes had to be modified and AddRoute for the Pod had to be removed. 

Ovn-kubernetes design and changes for multiple interface support

{ "name": "ovn-ls-25", "interface": "net0" },

{ "name": "ovn-ls-26", "interface": "net1", "ip_address":"172.16.26.3", "mac_address":"0a:00:00:00:00:15" }

        In this example net0 interface will be connected to a "ovn-ls-25" network and dynamic address allocation will be done for the addresses. net1 is connected to the ovn-ls-26 network and static address is used as specified.

 For example:  ovnIfaceList=[{"ip_address":"172.16.25.3", "mac_address":"0a:00:00:00:00:24", "gateway_ip": "172.16.25.1"}, {"ip_address":"172.16.26.3", "mac_address":"0a:00:00:00:00:15", "gateway_ip": "172.16.26.1"}]

Pod Specification with Multus and multiple interface support in OVN. The pod created has eth0 interface configured by flannel and one interface net1 on "ovn-ls-24" network:

apiVersion: v1
kind: Pod
metadata:
  name: pod-ovn
  annotations:
    kubernetes.v1.cni.cncf.io/networks: '[ { "name": "ovn-network"}]'
   ovnNetwork: '[
      { "name": "ovn-ls-24", "interface": "net1", "ipAddress": "172.16.24.55", "macAddress": "0A:00:00:00:00:4E" },

      {"name": "ovn-ls-24", "interface": "net2"}

]'

spec: # specification of the pod's contents
containers:
- name: pod-ovn
image: "busybox"
command: ["top"]
stdin: true
tty: true

Configuration details

ONAP Network Definition  :

apiVersion: v1
kind: onapNetwork
metadata:
name: ovn-ls-24
spec:
   config: '{

      "cnitype" : "ovn",
      "name": " ovn-ls-24",
      "subnet": " 172.16.24.0/24",
      "gateway": " 172.16.24.1"
}'

If no cnitype defined default is ovn.

Pod/Service annotation:

apiVersion: v1

kind: Pod

metadata:

  name: pod-ovn

  annotations:

      kubernetes.v1.cni.cncf.io/networks: '[{ "name": "ovn-network"}]'

      onapnetworks

{  

   "ovnNetwork":[  

      {  

         "name":"ovn-ls-26",

         "interface":"net0",

         "defaultGateway":"true"

      },

      {  

         "name":"ovn-ls-24",

         "interface":"net1",

         "defaultGateway":"false",

         "ip_address":"172.16.24.2/24",

         "mac_address":"0a:00:00:00:00:1e",

         "gateway_ip":"172.16.24.1"

      }

   ],

   "ovnNetworkRoutes":[  

      {  

         "dst":"172.16.29.1/24",

         "gw":"172.16.24.1"

      }

   ]

}

Pod Annotation for CNI (Internal to the plugin)

ovnIfaceList=[{"ip_address":"172.16.26.2/24", "mac_address":"0a:00:00:00:00:1d", "gateway_ip": "172.16.26.1","interface":"net0",  “defaultGateway”:”true”},

                             {"ip_address":"172.16.24.2/24", "mac_address":"0a:00:00:00:00:1e", "gateway_ip": "172.16.24.1","interface":"net1",  “defaultGateway”:”false”}]

ovnNetworkRoutes: [{ "dst": "172.16.29.1/24", "gw": “172.16.24.1” }]