From 9a8b45fc53ad3a6dff012cb109d2c22e13a935d2 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Thu, 30 Aug 2018 15:31:39 -0700 Subject: [PATCH] network: Remove CNI docs We need to update the network docs to reflect CNM and CNI are handled much the same way. Start off by removing the incorrect CNI docs first. Fixes #678 Signed-off-by: Archana Shinde --- virtcontainers/README.md | 18 ------------------ .../documentation/network/CNI_diagram.png | Bin 23162 -> 0 bytes 2 files changed, 18 deletions(-) delete mode 100644 virtcontainers/documentation/network/CNI_diagram.png diff --git a/virtcontainers/README.md b/virtcontainers/README.md index 468b925a3..491d56b3e 100644 --- a/virtcontainers/README.md +++ b/virtcontainers/README.md @@ -16,7 +16,6 @@ Table of Contents * [Container API](#container-api) * [Networking](#networking) * [CNM](#cnm) - * [CNI](#cni) * [Storage](#storage) * [How to check if container uses devicemapper block device as its rootfs](#how-to-check-if-container-uses-devicemapper-block-device-as-its-rootfs) * [Devices](#devices) @@ -218,23 +217,6 @@ There are three drawbacks about using CNM instead of CNI: * Implicit way to designate the network namespace: Instead of explicitely giving the netns to dockerd, we give it the PID of our runtime so that it can find the netns from this PID. This means we have to make sure being in the right netns while calling the hook, otherwise the veth pair will be created with the wrong netns. * No results are back from the hook: We have to scan the network interfaces to discover which one has been created inside the netns. This introduces more latency in the code because it forces us to scan the network in the CreateSandbox path, which is critical for starting the VM as quick as possible. - -## CNI - -![CNI Diagram](documentation/network/CNI_diagram.png) - -__Runtime network setup with CNI__ - -1. Create the network namespace ([code](https://github.com/containers/virtcontainers/blob/0.5.0/cni.go#L64-L76)) - -2. Get CNI plugin information ([code](https://github.com/containers/virtcontainers/blob/0.5.0/cni.go#L29-L32)) - -3. Start the plugin (providing previously created netns) to add a network described into /etc/cni/net.d/ directory. At that time, the CNI plugin will create the cni0 network interface and a veth pair between the host and the created netns. It links cni0 to the veth pair before to exit. ([code](https://github.com/containers/virtcontainers/blob/0.5.0/cni.go#L34-L45)) - -4. Create bridge, TAP, and link all together with network interface previously created ([code](https://github.com/containers/virtcontainers/blob/0.5.0/network.go#L123-L205)) - -5. Start VM inside the netns and start the container ([code](https://github.com/containers/virtcontainers/blob/0.5.0/api.go#L66-L70)) - # Storage Container workloads are shared with the virtualized environment through 9pfs. diff --git a/virtcontainers/documentation/network/CNI_diagram.png b/virtcontainers/documentation/network/CNI_diagram.png deleted file mode 100644 index 2c569b02290efa2cd5a5f246206a5795eac09e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23162 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