From 359dc16285126f8bb9ecb04e6e0389d4ac556163 Mon Sep 17 00:00:00 2001 From: Abdul Halim Date: Wed, 21 Mar 2018 11:59:24 +0000 Subject: [PATCH 1/7] Update README.md Change-Id: I7b48d923def4998106f2d537a5c1f4412179f372 --- README.md | 309 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 160 insertions(+), 149 deletions(-) diff --git a/README.md b/README.md index 6adcd7a10..7667b0d32 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,43 @@ ![multus-cni Logo](https://github.com/Intel-Corp/multus-cni/blob/master/doc/images/Multus.png) -Table of Contents -================= - * [MULTUS CNI plugin](#multus-cni-plugin) - * [Multus additional plugins](#multus-additional-plugins) - * [NFV based Networking in Kubernetes](#nfv-based-networking-in-kubernetes) * [Multi-Homed pod](#multi-homed-pod) * [Build](#build) * [Work flow](#work-flow) - * [Usage with Kubernetes CRD/TPR based Network Objects](#usage-with-kubernetes-crdtpr-based-network-objects) - * [Creating “Network” third party resource in kubernetes](#creating-network-third-party-resource-in-kubernetes) - * [CRD based Network objects](#crd-based-network-objects) + * [Usage with Kubernetes CRD/TPR based network objects](#usage-with-kubernetes-crdtpr-based-network-objects) + * [Creating "Network" resources in Kubernetes](#creating-network-resources-in-kubernetes) + * [CRD based Network objects](#crd-based-network-objects) * [TPR based Network objects](#tpr-based-network-objects) - * [Creating “Custom Network objects” third party resource in kubernetes](#creating-custom-network-objects-third-party-resource-in-kubernetes) + * [Creating network resources in Kubernetes](#creating-network-resources-in-kubernetes-1) * [Configuring Multus to use the kubeconfig](#configuring-multus-to-use-the-kubeconfig) - * [Configuring Multus to use the kubeconfig and also default networks](#configuring-multus-to-use-the-kubeconfig-and-also-default-networks) - * [Configuring Pod to use the TPR Network objects](#configuring-pod-to-use-the-tpr-network-objects) - * [Verifying Pod network](#verifying-pod-network) - * [Using Multus Conf file](#using-multus-conf-file) - * [Testing the Multus CNI](#testing-the-multus-cni) - * [Multiple Flannel Network](#multiple-flannel-network) - * [docker](#docker) - * [Kubernetes](#kubernetes) + * [Configuring Multus to use kubeconfig and a default network](#configuring-multus-to-use-kubeconfig-and-a-default-network) + * [Configuring Pod to use the CRD/TPR network objects](#configuring-pod-to-use-the-crdtpr-network-objects) + * [Verifying Pod network interfaces](#verifying-pod-network-interfaces) + * [Using with Multus conf file](#using-with-multus-conf-file) + * [Testing Multus CNI](#testing-multus-cni) + * [Multiple flannel networks](#multiple-flannel-networks) + * [Configure Kubernetes with CNI](#configure-kubernetes-with-cni) * [Launching workloads in Kubernetes](#launching-workloads-in-kubernetes) + * [Multus additional plugins](#multus-additional-plugins) + * [NFV based networking in Kubernetes](#nfv-based-networking-in-kubernetes) + * [Need help](#need-help) * [Contacts](#contacts) -Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc) - # MULTUS CNI plugin - -- *Multus* is the latin word for “Multi” - -- As the name suggests, it acts as the Multi plugin in Kubernetes and provides the Multi interface support in a pod - -- Multus supports all [reference plugins](https://github.com/containernetworking/plugins) (eg. [Flannel](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel), [DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp), [Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan)) that implement the CNI specification and all 3rd party plugins (eg. [Calico](https://github.com/projectcalico/cni-plugin), [Weave](https://github.com/weaveworks/weave), [Cilium](https://github.com/cilium/cilium), [Contiv](https://github.com/contiv/netplugin)). In addition to it, Multus supports [SRIOV](https://github.com/hustcat/sriov-cni), [DPDK](https://github.com/Intel-Corp/sriov-cni), [OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) workloads in Kubernetes with both cloud native and NFV based applications in Kubernetes. - -- It is a contact between the container runtime and other plugins, and it doesn't have any of its own net configuration, it calls other plugins like flannel/calico to do the real net conf job. - -- Multus reuses the concept of invoking the delegates in flannel, it groups the multi plugins into delegates and invoke each other in sequential order, according to the JSON scheme in the cni configuration. - -- No. of plugins supported is dependent upon the number of delegates in the conf file. - -- Master plugin invokes "eth0" interface in the pod, rest of plugins(Mininon plugins eg: sriov,ipam) invoke interfaces as "net0", "net1".. "netn" - +- _Multus_ is a latin word for "Multi" +- As the name suggests, it acts as a Multi plugin in Kubernetes and provides the multiple network interface support in a pod +- Multus supports all [reference plugins](https://github.com/containernetworking/plugins) (eg. [Flannel](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel), [DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp), [Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan)) that implement the CNI specification and all 3rd party plugins (eg. [Calico](https://github.com/projectcalico/cni-plugin), [Weave](https://github.com/weaveworks/weave), [Cilium](https://github.com/cilium/cilium), [Contiv](https://github.com/contiv/netplugin)). In addition to it, Multus supports [SRIOV](https://github.com/hustcat/sriov-cni), [SRIOV-DPDK](https://github.com/Intel-Corp/sriov-cni), [OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) workloads in Kubernetes with both cloud native and NFV based applications in Kubernetes +- It is a contact between the container runtime and other plugins, and it doesn't have any of its own net configuration, it calls other plugins like flannel/calico to do the real net conf job. +- Multus reuses the concept of invoking delegates as used in flannel by grouping multiple plugins into delegates and invoking them in the sequential order of the CNI configuration file provided in json format +- Number of plugins supported is depends on the number of delegates in the configuration file. - The "masterplugin" is the only net conf option of multus cni, it identifies the primary network. The default route will point to the primary network - +- One of the plugin acts as a “Master” plugin and responsible for configuring k8s network with Pod interface “eth0” +- The “Master” plugin also responsible to set the default route for the Pod +- Any subsequent plugin gets Pod interface name as “net0”, “net1”,… “netX and so on - Multus is one of project in [Baremetal Container Experience kit](https://networkbuilders.intel.com/network-technologies/container-experience-kits). Please read [CNI](https://github.com/containernetworking/cni) for more information on container networking. -### Multus additional plugins -- [DPDK -SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) -- [Vhostuser CNI - a Dataplane network plugin - Supports OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) -- [Bond CNI - For fail-over and high availability of networking](https://github.com/Intel-Corp/bond-cni) - -### Need assistance - -- Read [Containers Experience Kits - will be updated soon](https://networkbuilders.intel.com/network-technologies/container-experience-kits). -- Try our container exp kit demo - KubeCon's workshop [Enabling NFV Features in Kubernetes](https://github.com/intel/container-experience-kits-demo-area/) -- Invite yourself to the #intel-sddsg-slack slack channel. -- Ask a question on the #general-discussion slack channel. -- Need more assistant email us -- Feel free to file an issue. - -Please fill in the Questions/feedback - [google-form](https://goo.gl/forms/upBWyGs8Wmq69IEi2)! - -### NFV based Networking in Kubernetes -* KubeCon workshop on ["Enabling NFV features in Kubernetes"](https://kccncna17.sched.com/event/Cvnw/enabling-nfv-features-in-kubernetes-hosted-by-kuralamudhan-ramakrishnan-ivan-coughlan-intel) presentation [slide deck](https://www.slideshare.net/KuralamudhanRamakris/enabling-nfv-features-in-kubernetes-83923352) -* Feature brief - * [Multiple Network Interface Support in Kubernetes ](https://builders.intel.com/docs/networkbuilders/multiple-network-interfaces-support-in-kubernetes-feature-brief.pdf) - * [Enhanced Platform Awareness in Kubernetes](https://builders.intel.com/docs/networkbuilders/enhanced-platform-awareness-feature-brief.pdf) -* Application note - * [Multiple Network Interfaces in Kubernetes and Container Bare Metal ](https://builders.intel.com/docs/networkbuilders/multiple-network-interfaces-in-kubernetes-application-note.pdf) - * [Enhanced Platform Awareness Features in Kubernetes ](https://builders.intel.com/docs/networkbuilders/enhanced-platform-awareness-in-kubernetes-application-note.pdf) -* White paper - * [Enabling New Features with Kubernetes for NFV](https://builders.intel.com/docs/networkbuilders/enabling_new_features_in_kubernetes_for_NFV.pdf) -* Multus's related project github pages - * [Multus](https://github.com/Intel-Corp/multus-cni) - * [SRIOV - DPDK CNI](https://github.com/Intel-Corp/sriov-cni) - * [Vhostuser - VPP & OVS - DPDK CNI](https://github.com/intel/vhost-user-net-plugin) - * [Bond CNI](https://github.com/Intel-Corp/bond-cni) - * [Node Feature Discovery](https://github.com/kubernetes-incubator/node-feature-discovery) - * [CPU Manager for Kubernetes](https://github.com/Intel-Corp/CPU-Manager-for-Kubernetes) - ## Multi-Homed pod

@@ -93,8 +47,7 @@ Please fill in the Questions/feedback - [google-form](https://goo.gl/forms/upBW **This plugin requires Go 1.8 to build.** -Go 1.5 users will need to set `GO15VENDOREXPERIMENT=1` to get vendored dependencies. This flag is set by default in 1.6. - +Go 1.5 users will need to set GO15VENDOREXPERIMENT=1 to get vendored dependencies. This flag is set by default in 1.6. ``` #./build ``` @@ -104,29 +57,27 @@ Go 1.5 users will need to set `GO15VENDOREXPERIMENT=1` to get vendored dependenc

## Network configuration reference -* `name` (string, required): the name of the network -* `type` (string, required): "multus" -* `kubeconfig` (string, optional): kubeconfig file for the out of cluster communication with kube-apiserver, Refer the doc -* `delegates` (([]map,required): number of delegate details in the Multus, ignored in case kubeconfig is added. -* `masterplugin` (bool,required): master plugin to report back the IP address and DNS to the container +- name (string, required): the name of the network +- type (string, required): "multus" +- kubeconfig (string, optional): kubeconfig file for the out of cluster communication with kube-apiserver. See the example [kubeconfig](https://github.com/Intel-Corp/multus-cni/blob/master/doc/node-kubeconfig.yaml) +- delegates (([]map,required): number of delegate details in the Multus, ignored in case kubeconfig is added. +- masterplugin (bool,required): master plugin to report back the IP address and DNS to the container -## Usage with Kubernetes CRD/TPR based Network Objects +## Usage with Kubernetes CRD/TPR based network objects -Kubelet is responsible for establishing the network interfaces for each pod; it does this by invoking its configured CNI plugin. When Multus is invoked, it recovers pod annotations related to Multus, in turn, then it uses these annotations to recover a Kubernetes custom resource definition (CRD), which is an object that informs which plugins to invoke and the configuration needing to be passed to them. The order of plugin invocation is important as is the identity of the primary plugin. - -Please refer the Kubernetes Network SIG - Multiple Network PoC proposal for more details refer the link - [K8s Multiple Network proposal](https://docs.google.com/document/d/1TW3P4c8auWwYy-w_5afIPDcGNLK3LZf0m14943eVfVg/edit) +Kubelet is responsible for establishing network interfaces for pods; it does this by invoking its configured CNI plugin. When Multus is invoked it retrieves network references from Pod annotation. Multus then uses these network references to get network configurations. Network configurations are defined as Kubernetes Custom Resource Object (CRD). These configurations describe which CNI plugins to invoke and what their configurations are. The order of plugin invocation is important as it identifies the primary plugin. This order is taken from network object references given in a Pod spec.

-### Creating “Network” third party resource in kubernetes +### Creating "Network" resources in Kubernetes Multus is compatible to work with both CRD/TPR. Both CRD/TPR based network object api self link is same. -#### CRD based Network objects +##### **CRD based Network objects** -1. Create a Third party resource “crdnetwork.yaml” for the network object as shown below +1. Create a Custom Resource Definition "crdnetwork.yaml" for the network object as shown below: ``` apiVersion: apiextensions.k8s.io/v1beta1 @@ -152,23 +103,19 @@ spec: shortNames: - net ``` - -2. kubectl create command for the Custom Resource Definition - +2. Run kubectl create command for the Custom Resource Definition ``` # kubectl create -f ./crdnetwork.yaml customresourcedefinition "network.kubernetes.com" created ``` - -3. kubectl get command to check the Network CRD creation - +3. Run kubectl get command to check the Network CRD creation ``` # kubectl get CustomResourceDefinition NAME KIND networks.kubernetes.com CustomResourceDefinition.v1beta1.apiextensions.k8s.io ``` -4. Save the below following YAML to flannel-network.yaml +4. Save the following YAML to flannel-network.yaml ``` apiVersion: "kubernetes.com/v1" @@ -184,7 +131,9 @@ args: '[ } ]' ``` -5. create the custom resource definition + +5. Create the custom resource definition + ``` # kubectl create -f customCRD/flannel-network.yaml network "flannel-networkobj" created @@ -194,6 +143,8 @@ network "flannel-networkobj" created NAME KIND ARGS PLUGIN flannel-networkobj Network.v1.kubernetes.com [ { "delegate": { "isDefaultGateway": true } } ] flannel ``` + + 6. Get the custom network object details ``` # kubectl get network flannel-networkobj -o yaml @@ -213,13 +164,17 @@ metadata: plugin: flannel ``` -Both TPR and CRD will have same selfLink : **/apis/kubernetes.com/v1/namespaces/default/networks/** +For Kubernetes v1.7 and above use CRD to create network object. For version older than 1.7 use TPR based objects as shown below: + +Note: Both TPR and CRD will have same selfLink : + +*/apis/kubernetes.com/v1/namespaces/default/networks/* -if you are using 1.7 or planning to use 1.8 kubernetes, you can use CRD itself. There is no need to change any thing in Multus. For Kubernetes user < 1.7 use TPR based network objects as follows #### TPR based Network objects -1. Create a Third party resource “tprnetwork.yaml” for the network object as shown below +1. Create a Third Party Resource "tprnetwork.yaml" for the network object as shown below: + ``` apiVersion: extensions/v1beta1 kind: ThirdPartyResource @@ -229,7 +184,9 @@ description: "A specification of a Network obj in the kubernetes" versions: - name: v1 ``` + 2. Run kubectl create command for the Third Party Resource + ``` # kubectl create -f ./tprnetwork.yaml thirdpartyresource "network.kubernetes.com" created @@ -240,10 +197,12 @@ thirdpartyresource "network.kubernetes.com" created NAME DESCRIPTION VERSION(S) network.kubernetes.com A specification of a Network obj in the kubernetes v1 ``` -##### Creating “Custom Network objects” third party resource in kubernetes -1. After the ThirdPartyResource object has been created you can create network objects. Network objects should contain network fields. These fields are in JSON format. In the following example, a plugin and args fields are set to the object of kind Network. The kind Network is derived from the metadata.name of the ThirdPartyResource object we created above. +### Creating network resources in Kubernetes + +1. After creating CRD/TPR network object you can create network resources in Kubernetes. These network resources may contain additional underlying CNI plugin parameters given in JSON format. In the following example shown below the args field contains parameters that will be passed into “flannel” plugin. + +2. Save the following YAML to flannel-network.yaml -2. Save the below following YAML to flannel-network.yaml ``` apiVersion: "kubernetes.com/v1" kind: Network @@ -258,18 +217,19 @@ args: '[ } ]' ``` -2. Run kubectl create command for the TPR - Network object +3. Run kubectl create command to create network object ``` # kubectl create -f ./flannel-network.yaml network "flannel-conf" created ``` -3. Manage the Network objects using kubectl. +4. Show network objects using kubectl: ``` # kubectl get network NAME KIND flannel-conf Network.v1.kubernetes.com ``` -4. You can also view the raw JSON data. Here you can see that it contains the custom plugin and args fields from the yaml you used to create it: +5. Show details of the network object: + ``` # kubectl get network flannel-conf -o yaml apiVersion: kubernetes.com/v1 @@ -284,8 +244,7 @@ metadata: uid: fdcb94a2-5c0c-11e7-bbeb-408d5c537d27 plugin: flannel ``` -4. The plugin field should be the name of the CNI plugin and args should have the flannel args, it should be in the JSON format as shown above. **User can create network objects for Calico, Weave, Romana, & Cilium and test the multus.** -5. Save the below following YAML to sriov-network.yaml. Refer [Intel - SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) or contact @kural in [Intel-Corp Slack](https://intel-corp.herokuapp.com/) for running the DPDK based workloads in Kubernetes +6. Save the following YAML to sriov-network.yaml to creating sriov network object. ( Refer to [Intel - SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) or contact @kural in [Intel-Corp Slack](https://intel-corp.herokuapp.com/) for running the DPDK based workloads in Kubernetes) ``` apiVersion: "kubernetes.com/v1" kind: Network @@ -308,7 +267,8 @@ args: '[ } ]' ``` -6. Save the below following YAML to sriov-vlanid-l2enable-network.yaml +7. Likewise save the following YAML to sriov-vlanid-l2enable-network.yaml to create another sriov based network object: + ``` apiVersion: "kubernetes.com/v1" kind: Network @@ -324,8 +284,8 @@ args: '[ } ]' ``` -7. Follows the step 2 to create the network object “sriov-vlanid-l2enable-conf” and “sriov-conf” -8. Manage the Network objects using kubectl. +8. Follow step 3 above to create "sriov-vlanid-l2enable-conf" and "sriov-conf" network objects +9. View network objects using kubectl ``` # kubectl get network NAME KIND @@ -334,7 +294,7 @@ sriov-vlanid-l2enable-conf Network.v1.kubernetes.com sriov-conf Network.v1.kubernetes.com ``` ### Configuring Multus to use the kubeconfig -1. Create Multus CNI configuration file /etc/cni/net.d/multus-cni.conf with below content on the nodes. Use only the absolute path to point to the kubeconfig file (it may change depending upon your cluster env) and make sure all CNI binary files are in `\opt\cni\bin` dir +1. Create a Mutlus CNI configuration file on each Kubernetes node. This file should be created in: /etc/cni/net.d/multus-cni.conf with the content shown below. Use only the absolute path to point to the kubeconfig file (as it may change depending upon your cluster env). We are assuming all CNI plugin binaries are default location (`\opt\cni\bin dir`) ``` { "name": "node-cni-network", @@ -342,12 +302,14 @@ sriov-conf Network.v1.kubernetes.com "kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml" } ``` -2. Restart kubelet service +2. Restart kubelet service ``` # systemctl restart kubelet ``` -### Configuring Multus to use the kubeconfig and also default networks -1. Many user want default networking feature along with Network object. Refer [#14](https://github.com/Intel-Corp/multus-cni/issues/14) & [#17](https://github.com/Intel-Corp/multus-cni/issues/17) issues for more information. In this following config, Weave act as the default network in the absence of network field in the pod metadata annotation. +### Configuring Multus to use kubeconfig and a default network + +1. Many users want Kubernetes default networking feature along with network objects. Refer to issues [#14](https://github.com/Intel-Corp/multus-cni/issues/14) & [#17](https://github.com/Intel-Corp/multus-cni/issues/17) for more information. In the following Multus configuration, Weave act as the default network in the absence of network field in the pod metadata annotation. + ``` { "name": "node-cni-network", @@ -360,14 +322,15 @@ sriov-conf Network.v1.kubernetes.com }] } ``` -2. Restart kubelet service +2. Restart kubelet service + ``` # systemctl restart kubelet ``` +### Configuring Pod to use the CRD/TPR network objects -### Configuring Pod to use the TPR Network objects -1. Save the below following YAML to pod-multi-network.yaml. In this case flannel-conf network object act as the primary network. +1. Save the following YAML to pod-multi-network.yaml. In this case flannel-conf network object acts as the primary network. ``` # cat pod-multi-network.yaml apiVersion: v1 @@ -388,19 +351,25 @@ spec: # specification of the pod's contents stdin: true tty: true ``` -3. Create Multiple network based pod from the master node + +2. Create Multiple network based pod from the master node + ``` # kubectl create -f ./pod-multi-network.yaml pod "multus-multi-net-poc" created ``` -4. Get the details of the running pod from the master + +3. Get the details of the running pod from the master + ``` # kubectl get pods NAME READY STATUS RESTARTS AGE multus-multi-net-poc 1/1 Running 0 30s ``` -### Verifying Pod network -1. Run “ifconfig” command inside the container: + +### Verifying Pod network interfaces + +1. Run "ifconfig" command in Pod: ``` # kubectl exec -it multus-multi-net-poc -- ifconfig eth0 Link encap:Ethernet HWaddr 06:21:91:2D:74:B9 @@ -438,13 +407,15 @@ north Link encap:Ethernet HWaddr BE:F2:48:42:83:12 collisions:0 txqueuelen:1000 RX bytes:95956 (93.7 KiB) TX bytes:82200 (80.2 KiB) ``` -Interface name | Description ------------- | ------------- -lo | loopback -eth0@if41 | Flannel network tap interface -net0 | VF0 of NIC 1 assigned to the container by [Intel - SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) plugin -north | VF0 of NIC 2 assigned with VLAN ID 210 to the container by SR-IOV CNI plugin -2. Check the vlan ID of the NIC 2 VFs +| Interface name | Description | +| --- | --- | +| lo | loopback | +| eth0@if41 | Flannel network tap interface | +| net0 | VF0 of NIC 1 assigned to the container by [Intel - SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) plugin | +| north | VF0 of NIC 2 assigned with VLAN ID 210 to the container by SR-IOV CNI plugin | + +2. Check the vlan ID of the NIC 2 VFs + ``` # ip link show enp2s0 20: enp2s0: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 @@ -455,7 +426,7 @@ north | VF0 of NIC 2 assigned with VLAN ID 210 to the container by SR-IOV CNI p vf 3 MAC 00:00:00:00:00:00, vlan 4095, spoof checking off, link-state auto ``` -## Using Multus Conf file +## Using with Multus conf file Given the following network configuration: @@ -503,38 +474,42 @@ Given the following network configuration: ] } EOF - ``` -## Testing the Multus CNI ## -### Multiple Flannel Network -Github user [YYGCui](https://github.com/YYGCui) has used Multiple flannel network to work with Multus CNI plugin. Please refer this [closed issue](https://github.com/Intel-Corp/multus-cni/issues/7) for Multiple overlay network support with Multus CNI. -### docker -Make sure that the multus, [sriov](https://github.com/Intel-Corp/sriov-cni), [flannel](https://github.com/containernetworking/cni/blob/master/Documentation/flannel.md), and [ptp](https://github.com/containernetworking/cni/blob/master/Documentation/ptp.md) binaries are in the `/opt/cni/bin` directories and follow the steps as mention in the [CNI](https://github.com/containernetworking/cni/#running-a-docker-container-with-network-namespace-set-up-by-cni-plugins) +## Testing Multus CNI -### Kubernetes -Refer the Kubernetes User Guide and network plugin -* [Single Node](https://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/) -* [Multi Node](https://kubernetes.io/docs/getting-started-guides/fedora/flannel_multi_node_cluster/) -* [Network Plugin](https://kubernetes.io/docs/admin/network-plugins/) +### Multiple flannel networks + +Github user [YYGCui](https://github.com/YYGCui) has used multiple flannel network to work with Multus CNI plugin. Please refer to this [closed issue](https://github.com/Intel-Corp/multus-cni/issues/7) for ,multiple overlay network support with Multus CNI. + +Make sure that the multus, [sriov](https://github.com/Intel-Corp/sriov-cni), [flannel](https://github.com/containernetworking/cni/blob/master/Documentation/flannel.md), and [ptp](https://github.com/containernetworking/cni/blob/master/Documentation/ptp.md) binaries are in the /opt/cni/bin directories and follow the steps as mentioned in the [CNI](https://github.com/containernetworking/cni/#running-a-docker-container-with-network-namespace-set-up-by-cni-plugins) + +#### Configure Kubernetes with CNI +Kubelet must be configured to run with the CNI network plugin. Edit /etc/kubernetes/kubelet file and add "--network-plugin=cni" flags in KUBELET\_OPTS as shown below: -Kubelet must be configured to run with the CNI `--network-plugin`, with the following configuration information. -Edit `/etc/default/kubelet` file and add `KUBELET_OPTS`: ``` KUBELET_OPTS="... --network-plugin-dir=/etc/cni/net.d --network-plugin=cni " ``` -Restart the kubelet +Refer to the Kubernetes User Guide and network plugin for more information. +- [Single Node](https://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/) +- [Multi Node](https://kubernetes.io/docs/getting-started-guides/fedora/flannel_multi_node_cluster/) +- [Network plugin](https://kubernetes.io/docs/admin/network-plugins/) + +Restart kubelet: ``` # systemctl restart kubelet.service ``` #### Launching workloads in Kubernetes -Launch the workload using yaml file in the kubernetes master, with above configuration in the multus CNI, each pod should have multiple interfaces. -> Note: To verify whether Multus CNI plugin is working fine create a pod containing one “busybox” container and execute “ip link” command to check if interfaces management follows configuration. -1. Create “multus-test.yaml” file containing below configuration. Created pod will consist of one “busybox” container running “top” command. +With Multus CNI configured as described in sections above each workload launched via a Kubernetes Pod will have multiple network interfacesLaunch the workload using yaml file in the kubernetes master, with above configuration in the multus CNI, each pod should have multiple interfaces. + +Note: To verify whether Multus CNI plugin is working correctly, create a pod containing one "busybox" container and execute "ip link" command to check if interfaces management follows configuration. + +1. Create "multus-test.yaml" file containing below configuration. Created pod will consist of one "busybox" container running "top" command. + ``` apiVersion: v1 kind: Pod @@ -551,11 +526,13 @@ spec: # specification of the pod's contents ``` 2. Create pod using command: + ``` # kubectl create -f multus-test.yaml pod "multus-test" created ``` -3. Run “ip link” command inside the container: +3. Run "ip link" command inside the container: + ``` # 1: lo: mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 @@ -567,13 +544,47 @@ pod "multus-test" created link/ether 76:13:b1:60:00:00 brd ff:ff:ff:ff:ff:ff ``` -Interface name | Description ------------- | ------------- -lo | loopback -eth0@if41 | Flannel network tap interface -net0 | VF assigned to the container by [SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) plugin -net1 | ptp localhost interface +| Interface name | Description | +| --- | --- | +| lo | loopback | +| eth0@if41 | Flannel network tap interface | +| net0 | VF assigned to the container by [SR-IOV CNI](https://github.com/Intel-Corp/sriov-cni) plugin | +| net1 | ptp localhost interface | +## Multus additional plugins + +- [DPDK-SRIOV CNI](https://github.com/Intel-Corp/sriov-cni) +- [Vhostuser CNI](https://github.com/intel/vhost-user-net-plugin) - a Dataplane network plugin - Supports OVS-DPDK & VPP +- [Bond CNI](https://github.com/Intel-Corp/bond-cni) - For fail-over and high availability of networking + +## NFV based networking in Kubernetes + +- KubeCon workshop on ["Enabling NFV features in Kubernetes"](https://kccncna17.sched.com/event/Cvnw/enabling-nfv-features-in-kubernetes-hosted-by-kuralamudhan-ramakrishnan-ivan-coughlan-intel) presentation [slide deck](https://www.slideshare.net/KuralamudhanRamakris/enabling-nfv-features-in-kubernetes-83923352) +- Feature brief + - [Multiple Network Interface Support in Kubernetes](https://builders.intel.com/docs/networkbuilders/multiple-network-interfaces-support-in-kubernetes-feature-brief.pdf) + - [Enhanced Platform Awareness in Kubernetes](https://builders.intel.com/docs/networkbuilders/enhanced-platform-awareness-feature-brief.pdf) +- Application note + - [Multiple Network Interfaces in Kubernetes and Container Bare Metal](https://builders.intel.com/docs/networkbuilders/multiple-network-interfaces-in-kubernetes-application-note.pdf) + - [Enhanced Platform Awareness Features in Kubernetes](https://builders.intel.com/docs/networkbuilders/enhanced-platform-awareness-in-kubernetes-application-note.pdf) +- White paper + - [Enabling New Features with Kubernetes for NFV](https://builders.intel.com/docs/networkbuilders/enabling_new_features_in_kubernetes_for_NFV.pdf) +- Multus's related project github pages + - [Multus](https://github.com/Intel-Corp/multus-cni) + - [SRIOV - DPDK CNI](https://github.com/Intel-Corp/sriov-cni) + - [Vhostuser - VPP & OVS - DPDK CNI](https://github.com/intel/vhost-user-net-plugin) + - [Bond CNI](https://github.com/Intel-Corp/bond-cni) + - [Node Feature Discovery](https://github.com/kubernetes-incubator/node-feature-discovery) + - [CPU Manager for Kubernetes](https://github.com/Intel-Corp/CPU-Manager-for-Kubernetes) + + +## Need help + +- Read [Containers Experience Kits](https://networkbuilders.intel.com/network-technologies/container-experience-kits) +- Try our container exp kit demo - KubeCon workshop on [Enabling NFV Features in Kubernetes](https://github.com/intel/container-experience-kits-demo-area/) +- Join us on [#intel-sddsg-slack](https://intel-corp.herokuapp.com/) slack channel and ask question in [#general-discussion](https://intel-corp-team.slack.com/messages/C4C5RSEER) +- You can also [email](mailto:kuralamudhan.ramakrishnan@intel.com) us +- Feel free to [submit](https://github.com/Intel-Corp/multus-cni/issues/new) an issue + +Please fill in the Questions/feedback - [google-form](https://goo.gl/forms/upBWyGs8Wmq69IEi2)! ## Contacts For any questions about Multus CNI, please reach out on github issue or feel free to contact the developer @kural in our [Intel-Corp Slack](https://intel-corp.herokuapp.com/) - From b9446232cdf4f1b6f2bea583291973cc97e963f4 Mon Sep 17 00:00:00 2001 From: Jason Murray Date: Sat, 28 Apr 2018 16:56:38 +0200 Subject: [PATCH 2/7] Fix grammar in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7667b0d32..6b5929f77 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ - One of the plugin acts as a “Master” plugin and responsible for configuring k8s network with Pod interface “eth0” - The “Master” plugin also responsible to set the default route for the Pod - Any subsequent plugin gets Pod interface name as “net0”, “net1”,… “netX and so on -- Multus is one of project in [Baremetal Container Experience kit](https://networkbuilders.intel.com/network-technologies/container-experience-kits). +- Multus is one of the projects in the [Baremetal Container Experience kit](https://networkbuilders.intel.com/network-technologies/container-experience-kits). -Please read [CNI](https://github.com/containernetworking/cni) for more information on container networking. +Please check the [CNI](https://github.com/containernetworking/cni) documentation for more information on container networking. ## Multi-Homed pod

From a2bc6f8bf1fd453c6ad75adad4b92fa5c4c7187c Mon Sep 17 00:00:00 2001 From: Kuralamudhan Ramakrishnan Date: Thu, 17 May 2018 11:59:11 +0100 Subject: [PATCH 3/7] Update Readme file Formatting the table of content --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b5929f77..f1b2e4f62 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ * [Work flow](#work-flow) * [Usage with Kubernetes CRD/TPR based network objects](#usage-with-kubernetes-crdtpr-based-network-objects) * [Creating "Network" resources in Kubernetes](#creating-network-resources-in-kubernetes) - * [CRD based Network objects](#crd-based-network-objects) - * [TPR based Network objects](#tpr-based-network-objects) + * [CRD based Network objects](#crd-based-network-objects) + * [TPR based Network objects(TPR deprecated in Kubernetes 1.7)](#tpr-based-network-objects) * [Creating network resources in Kubernetes](#creating-network-resources-in-kubernetes-1) * [Configuring Multus to use the kubeconfig](#configuring-multus-to-use-the-kubeconfig) * [Configuring Multus to use kubeconfig and a default network](#configuring-multus-to-use-kubeconfig-and-a-default-network) From ea79e126f9a99c33f5613f6db02739442d9a44e2 Mon Sep 17 00:00:00 2001 From: Kuralamudhan Ramakrishnan Date: Thu, 12 Jul 2018 18:39:39 +0100 Subject: [PATCH 4/7] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f1b2e4f62..05ed1d8dc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ![multus-cni Logo](https://github.com/Intel-Corp/multus-cni/blob/master/doc/images/Multus.png) +### Newest Multus Version v2.0(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.0 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) * [MULTUS CNI plugin](#multus-cni-plugin) * [Multi-Homed pod](#multi-homed-pod) * [Build](#build) From 3e1c6ac9bdd6a0e1789bc030bafa28ef0ce65872 Mon Sep 17 00:00:00 2001 From: Kuralamudhan Ramakrishnan Date: Tue, 17 Jul 2018 10:18:17 +0100 Subject: [PATCH 5/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05ed1d8dc..c616817d6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![multus-cni Logo](https://github.com/Intel-Corp/multus-cni/blob/master/doc/images/Multus.png) -### Newest Multus Version v2.0(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.0 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) +### Newest Multus Version v2.1(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.0 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) * [MULTUS CNI plugin](#multus-cni-plugin) * [Multi-Homed pod](#multi-homed-pod) * [Build](#build) From 61959e04775327e1fc9ebd9dabf24f8de223bc26 Mon Sep 17 00:00:00 2001 From: Kuralamudhan Ramakrishnan Date: Tue, 17 Jul 2018 10:18:46 +0100 Subject: [PATCH 6/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c616817d6..ae3475434 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![multus-cni Logo](https://github.com/Intel-Corp/multus-cni/blob/master/doc/images/Multus.png) -### Newest Multus Version v2.1(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.0 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) +### Newest Multus Version v2.1(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.1 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) * [MULTUS CNI plugin](#multus-cni-plugin) * [Multi-Homed pod](#multi-homed-pod) * [Build](#build) From be1c08bfa515ee836d6539539aeae8e3087d1b56 Mon Sep 17 00:00:00 2001 From: Kuralamudhan Ramakrishnan Date: Mon, 30 Jul 2018 13:06:57 +0100 Subject: [PATCH 7/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae3475434..f0cb7d9f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![multus-cni Logo](https://github.com/Intel-Corp/multus-cni/blob/master/doc/images/Multus.png) -### Newest Multus Version v2.1(Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v2.1 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) +### Newest Multus Version v3.0 (Kubernetes Network Plumbing working group- reference meta plugin) will be merged to master from dev branch(network-plumbing-working-group-crd-change). For more info - refer : [Multus v3.0 readme.md](https://github.com/intel/multus-cni/tree/dev/network-plumbing-working-group-crd-change#kubernetes-network-custom-resource-definition-de-facto-standard---reference-implementation) * [MULTUS CNI plugin](#multus-cni-plugin) * [Multi-Homed pod](#multi-homed-pod) * [Build](#build)