Applications on different Kubernetes machines need to communicate, and some connections need to be blocked. A network plugin supplies the Pod network; policy support lets you specify which connections are allowed. You will often see these called CNI plugins, after the Container Network Interface used to configure container networking.
Cilium uses Linux eBPF technology to implement networking and security, with Hubble supplying visibility into traffic. eBPF lets small programs process events inside the Linux kernel, including decisions about network packets. Calico also provides networking and policy, including an eBPF data-plane option. This is not an eBPF-versus-non-eBPF choice. Cilium versus Calico is a choice of cluster networking implementation, not just an application add-on: an unsupported replacement can disconnect workloads.
Start with the networking your cloud service or Kubernetes distribution supports. Evaluate Cilium when you want its networking and Hubble traffic-visibility tools together, for example, to investigate which services are connecting and where traffic is dropped. Start with Calico when you already operate its routed network or need its documented BGP integration with network routers. BGP exchanges routing information so the wider network can find Pod addresses. These are starting cases, not exclusive features or proof that migration would help. The right configuration for your platform matters more than the project having the longest feature list.
Questions that change the answer
- Does the cloud or distribution prescribe a networking mode, address allocation model or supported upgrade path?
- Do you need overlay networking, routed Pod addresses, BGP integration or native cloud addresses?
- Which NetworkPolicy semantics, host policies, observability and encryption features are required?
- Will kube-proxy remain, or will a supported replacement handle Services? How is API-server reachability preserved?
- Who can troubleshoot DNS, MTU, conntrack, routing and kernel issues during an outage?
Check the exact networking mode
Cilium documentation describes eBPF-based networking and kube-proxy replacement. Calico provides networking and policy options. Select a documented mode for the exact release and platform; a project having a capability does not mean it is enabled or supported in every mode. Keep gateway functionality separate from the basic Pod-network decision.
Test the failure paths
Check Pod-to-Pod, Pod-to-Service, DNS, external egress, ingress, node restart and policy-denied traffic. Include dual-stack and network appliances if they are part of the environment. Large packets and long-lived connections expose failures that a short ping cannot. Record the kernel, Kubernetes, plugin, cloud and configuration versions with any result.
Plan migration around connectivity
Rehearse on a representative cluster and retain a path to manage nodes if cluster networking fails. A rollback can require node replacement or workload rescheduling; do not assume reverting one Helm value restores the old data plane. This comparison provides decision criteria and a test plan, not a claim that Kubedex benchmarked every CNI.
Historical Kubedex content
Original publication: 2018-11-12T06:21:44+00:00. Preserved for context. Commands, versions, prices and results below reflect the original research.
The most complicated comparison I’ve ever attempted. From a 10,000 ft perspective it should be simple. We have CNI as a common standard in Kubernetes and all these plugins need to do is assign an IP address to each pod so they can talk to each other, both on the same host, and across hosts.
As you can see from the table the devil is in the detail. In this blog we’ll examine the key differences between Flannel, Calico, Weave, Cilium, Kube Router, Romana and Contiv.

You can view and edit the Google sheet here.
Update: the Google sheet now also includes Tungsten Fabric, kopeio and amazon-vpc-cni-k8s.
Unfortunately, I wasn’t clever enough to figure out a way to compare combinations of features directly across all plugins. Depending on the plugin, and depending on your underlying network, you will configure things differently. We would need a column for each variation of settings and I think that may be overkill. What we’ll do instead is simplify by grouping plugins by type and then I’ll attempt to give my opinion on the key differentiators.
Before we do that let’s take a segway into some background information. I was interested in what each cloud Kubernetes service used, as well as defaults for the On-Prem Kubernetes distributions.
| Service / Distro | Network |
|---|---|
| GKE | Managed, Calico for network policy |
| EKS | AWS VPC CNI, Calico for network policy |
| AKS | Managed, adding Calico soon |
| OpenShift | OpenShift SDN, can use Flannel as an option. Calico also supported. |
| PKS | NSX-T or Flannel on GCP |
| Docker Enterprise | Calico |
| Rancher | Canal, Flannel, Calico |
| Kubermatic | Canal, Calico |
| CDK | Canal, Flannel, Calico, other CNI like Weave |
| Suse CaaS | Flannel |
| MetalK8s | Calico |
| Mesos | Calico |
| IBM | Calico |
| Daocloud | Calico, MacVlan, Flannel |
| Platform 9 | Calico, Weave, Flannel, OpenContrail |
| Cisco Container Platform | ACI, Contiv, Calico |
| Kops | Kubenet (limited to 50 nodes), optional CNI (see comment) |
| Kubespray | Calico, others (see comment) |
| Kubo | Flannel |
When you provision a Kubernetes cluster with GKE, EKS or AKS the network just works. Each of the cloud providers have their own CNI plugins. AWS have open sourced their plugin which is quite a friendly thing to do. You may notice that all 3 clouds are adopting Calico specifically to handle network policy.
Amongst the On-Prem distributions Calico again reigns supreme. This time for both networking and network policy. OpenShift and Cisco have their own plugins as you would expect.
Layer 2 vs Layer 3
This is something that you’ll need to decide first. Layer 3 is more desirable but often the world is not fair and there are circumstances where you will be forced to use a Layer 2 solution.
Layer 2
Let’s examine the Layer 2 solutions.

Flannel, Weave, Cilium and Contiv can all run in Layer 2 mode which means they create a VXLAN that encapsulates all traffic between hosts. Encapsulation adds a cost in terms of performance. However, most modern network cards will offload this so perhaps it’s not an issue.
You’ll often use a Layer 2 solution to cover over deficiencies in the underlying network. For example maybe you have address space limitations. In the case of Weave, Cilium and Contiv they additionally provide Layer 3 functionality as an all in one solution.
This is where it gets tricky. You can mix and match plugins and use combinations together. Technically you could run Flannel as a Layer 2 network under many of the Layer 3 options in this comparison. Let’s assume that you want to use the fewest number of plugins for the sake of sanity.
Flannel is the oldest and arguably most mature plugin but it has the fewest features. It’s really common for people to combine Flannel and Calico together into what used to be called ‘Canal’. It seems the Canal project has died and both Flannel and Calico develop separately but maintain good documentation for combining together.
Weave has an encryption library baked in and has some unique fast data path features. The other stand-out feature for Weave is the support for partially connected networks. All Weave nodes operate as a mesh and so you only need a route between one other connected segment to achieve full connectivity. It’s also the only plugin with built in name resolution which can be used for load balancing services. The fact that Weave operates as a full mesh is both a massive strength and a weakness. Past a few hundred nodes the overhead of distributing routes becomes a bottleneck and you then need to disable auto-discovery and start to manually manage connections.
Cilium differentiates itself by providing Layer 7 policies and using BPF to process the rules inside the kernel which should scale a lot better than iptables rules. The only down side is it requires quite a new kernel version. I quite like Cilium and I’ve received a number of comments from people who are using it happily in production.
Contiv has many of the same features as the other options but also has some funky stuff that allows overlapping IP’s, for if you need multiple pods to share the same IP address. If you have a significant On-Prem Cisco investment then this is probably one to trial.
Layer 3
Let’s say you don’t need Layer 2 functionality at all and you’d prefer a pure Layer 3 plugin. For many this will absolutely be the case. Layer 2 VXLAN’s are a bit of a black box when trying to debug. Layer 3 plugins on the other hand allow you to quickly print a routing table on an instance to view what’s going on.
The pure Layer 3 plugins are Calico, Kube Router and Romana. Although, remember, you can also make Cilium and Contiv Layer 3 only by changing settings but we’ve covered those already.

Calico is the oldest and most mature. I don’t have any hard facts to substantiate this assumption, but, I think Calico is probably the most popular plugin overall. The guys from Tigera on the Sig-Network channel on Kubernetes Slack are awesomely responsive and left me feeling that paid support would be worth every penny.
Kube Router is a relatively new project. It’s simple and uses the IPVS/LVS kernel feature to speed up load balancing and routing. It also has direct server return which is supposed to decrease latency.
Romana aims to achieve host level network performance by working without any encapsulation at all. Calico and Kube Router both encapsulate traffic at Layer 3 (usually with IPIP) in order to route traffic between subnets which comes at a slight performance cost. The only negative thing I saw with Romana is lack of community.
Recommendations
Let’s start with the simplest first. If you’re using a cloud service like GKE, EKS or AKS you are covered already and should simply use their Calico integration for network policy.
For OpenShift, PKS or Cisco use their built in SDN.
What about custom cloud? For example Rancher, Kops or just Kubeadm on AWS. Here’s my thought process: start with Calico and only deviate if you need something that it does not provide.
Custom On-Prem is where things get trickier. Here’s a quick table that shows how I think each options deviate.

Again, I’d start with Calico as the default choice and work out if you need any other features. If you are extremely performance sensitive I’d benchmark Calico vs Kube Router and Romana. Each of those have features that should reduce latency, or at least remove plugin performance overhead.
I think Calico has become the default choice for many because of the way it uses BGP. Networks can be extremely difficult to troubleshoot and calico makes it relatively easy. Lots of people look at the choices and say ‘oh I can peer it into my normal network easily’. They rarely do, but thats’s still a big plus when you’re evaluating something.
If security is your main concern than I’d trial Calico vs Cilium. I also read a blog that showed Cilium may be a very good choice for networking pods across Kubernetes clusters without the pain of complicated BGP configuration.
If you need something to cover over your On-Prem network deficiencies then Weave is probably a good choice.
To summarise my recommendation is Calico 9 times out of 10. It’s simple, fast, has lots of features and a good company behind it.
As ever, if I have made an error please let me know and I’ll update this post. I’m interested to get feedback on what network plugins you are using and what made you choose it.
The post Kubernetes Network Plugins appeared first on kubedex.com.
Historical workbook values; blanks mean unknown, not No. Prices, versions, maturity labels and feature claims are not current recommendations.
Historical workbook values; blanks mean unknown, not No. Prices, versions, maturity labels and feature claims are not current recommendations.
Kubernetes Networks / Comparison (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| . | Antrea | Flannel | Weave Net | Calico | Cilium | Unknown (damaged historical cell) | Romana | Contiv | Tungsten Fabric | kopeio |
|---|---|---|---|---|---|---|---|---|---|---|
| Company | VMware | Red Hat | WeaveWorks | Tigera Inc | Isovalent | Unknown | Pani Networks Inc | Cisco | Juniper | Kopeio |
| Latest Stable Version | 0.11.1 | 0.11.0 | 2.6.0 | 3.10.1 => 3.16.6 | 1.9.3 | Unknown (damaged historical cell) | 2.0.2 | 1.2 | 5.0,1 | experimental |
| Last Release date | 2020-12-01 00:00:00 | 2019-01-28 00:00:00 | Unknown | 2019-11-07 00:00:00 | 2021-01-22 00:00:00 | Unknown | Unknown | Unknown | Unknown | Unknown |
| Start Date | 2019-10-01 00:00:00 | 2014-07-01 00:00:00 | 2014-08-01 00:00:00 | 2014-07-01 00:00:00 | 2015-12-01 00:00:00 | 2017-04-01 00:00:00 | 2015-11-01 00:00:00 | 2014-12-01 00:00:00 | 2012.0 | 2016-05-01 00:00:00 |
| Language | Go | Go | Go | Go | Go | Go | Unknown | Go | C / C++ | Go |
| Minimum OS Version | kernel version >= 4.4 is required | kernel version >= 3.12 | Linux Kernel > 3.8 | RHEL 7, Centos 7, Ubuntu 16.04, Debian 8 | Linux Kernel >= 4.9 | - | - | CentOS 7, Ubuntu 16.04 | Linux Kernel > 2.6 | - |
| Minimum Kubernetes Version | 1.16 | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 | 1.8 | 1.8 | 1.8 | 1.8 |
| IP Version | Unknown (damaged historical cell) | ipv4 | ipv4 | ipv4, ipv6 | ipv4, ipv6 | ipv4 | ipv4 | ipv4, ipv6 | ipv4, ipv6 | ipv4 |
| Open Source | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Encryption | IPsec ESP or WireGuard. | Experimental | NaCl library | Wireguard (since 3.14) | Yes, IPSec and Wireguard | No | No | No | No | Experimental |
| Network policy | Yes, Ingress, Egress, | Unknown | Ingress, Egress | Ingress, Egress | Ingress, Egress | Ingress, Egress | Ingress, Egress | Ingress, Egress | Ingress, Egress | No |
| Network policy auditing | Unknown | No | No | Paid | Yes (via Cilium's Hubble) | No | No | No | No | No |
| Recommended Max Nodes | 500+ | Unknown | 500.0 | 5000.0 | 5000+ | Unknown | Unknown | Unknown | Unknown | Unknown |
| Default Network Model | Unknown | Layer 2 VXLAN | Layer 2 VXLAN | Layer 3 | Layer 3 (L2 avaliable with chaining) | Layer 3 | Unknown (damaged historical cell) | Layer 2, Layer 3 or ACI options | Unknown | Layer 2, VXLAN or IPSEC |
| Layer 2 Encapsulation | VXLAN, GENEVE, GRE, STT | VXLAN | VXLan | - | Unknown | - | - | VXLAN | VXLAN | VXLAN |
| Layer 3 Routing | NSX | iptables | iptables, kubeproxy | iptables, kubeproxy | BPF, kubeproxy | IPVS, iptables, ipsets | iptables | iptables | TF VRouter | ip route |
| Layer 3 Encapsulation | VXLAN, GENEVE, GRE, STT | - | Sleeve (fallback) | IPIP or VXLan (optional) | VXLan or Geneve (optional) | IPVS/LVS DR mode, GRE/IPIP | - | VLAN | MPLSoUDP, MPLSoGRE, VXLAN | - |
| Layer 4 Route Distribution | API | - | - | BGP | CRD, kvstore, BGP | BGP | BGP, OSPF | BGP | BGP | -- |
| vnic per container | yes | no | yes | yes | yes | yes | no | yes | Unknown | no |
| Multicast Support | yes | no | yes | no | no | no | no | yes | Unknown | no |
| Subnet Per | Host, namespace | Host | Cluster | One or more of Cluster / Host / Namespace / Deployment | Host, Cluster or Custom (via CRD) | Host | Host | Overlapping IP pools | VRFs | Host |
| Isolation | label, cidr, advanced | cidr | cidr, network | label, host, cidr, network sets | label, services, AWS metadata, entities (host, cluster, world), cidr, dns, L7 (http, kafka, cassandra, memcached, ...) | cidr | cidr | label, cidr | Unknown | no |
| Load Balancing | yes, can replace kube-proxy | no | yes | yes | Yes, can replace kube-proxy | yes | yes | yes | Unknown | No |
| Multi Cluster Routing | yes thru NSX | no | yes | yes | yes | yes | yes | yes | Unknown | no |
| Partially Connected Networks | - | no | yes | no | no | no | no | no | Unknown | no |
| IP Overlap Support | Unknown | no | no | no | no | no | no | yes | Unknown | no |
| Name Service | no | no | yes | no | no | no | no | no | Unknown | no |
| Datastore | CRD | kubernetes CRDs or etcdv3 | file inside pods | kubernetes CRDs, or etcdv3 | CRD, etcd3, consul | kubernetes etcd | kubernetes etcd | kubernetes etcd, etcd or consul | Unknown | kubernetes etcd |
| Paid Support | Yes | No | Yes | Yes | Yes | no | Yes | No | Unknown | No |
| Docs | https://github.com/vmware-tanzu/antrea/tree/master/docs | https://coreos.com/flannel/docs/latest/ | https://www.weave.works/docs/net/latest/overview/ | https://docs.projectcalico.org/v3.3/introduction/ | http://docs.cilium.io/en/stable/ | https://github.com/cloudnativelabs/kube-router | https://romana.readthedocs.io/en/latest/ | http://contiv.github.io/documents/ | https://github.com/tungstenfabric https://github.com/Juniper/contrail-controller | https://github.com/kopeio/networking |
| Integrations | NSX, TMC, TSM, Octant | Flannel + Calico | - | Flannel + Calico | Cilium + Kube Router | Cilium + Kube Router | - | Unknown | Unknown | Unknown |
| Platforms | Linux, Windows | Linux, Windows | Linux | Linux, Windows | Linux | Linux | Linux | Linux | Linux | Linux |
| Why? | Global and Enchanced Network Policy, many integrations | Layer 2 solution. Simple and mature. Overlays are useful when network address space is limited. Overlays also mostly auto-configure. | Combines Layer 2 overlay networking with network policies and other features. Best solution for partially connected networks. | Layer 3 solution. Good network policy support. Default on most Kubernetes distributions. Easy to debug on hosts by looking at route table. BGP allows for access both inside and outside the cluster. | Security and observability focused. Uses BPF which is faster than iptables to enforce identity based policies. Policies also operate at Layer 7 allowing for application specific enforcement. The cluster mesh feature is simpler than BGP to confgure. | Single Go binary built from the ground up for Kubernetes. Uses new IPVS/LVS kernel features to improve service load balancing performance. Also does direct server return to improve latency. | Aims for performance by using native Linux routing, iptables and no encapsulation. | Integrates with On-Prem Cisco ACI. Has a cool bandwidth network policy. | Unknown | Really simple. Uses the default Kubernetes network and sets up layer 3 routes between pods using ip route. |
| Scenario | On-prem, Public cloud - AKS, EKS, BareMetal | On-Prem or custom cloud where native routing isn't possible | Small to medium size On-Prem or custom cloud | On-Prem with native routing or cloud Kubernetes services | On-Prem (direct routing), cloud integrated, security focused | On-Prem or custom cloud latency focussed | Large scale On-Prem or AWS | On-Prem with ACI investment | Unknown | Unknown |
| Why Not? | Unknown | Native routing is faster and easier to debug. You need to also use Calico if you want network policies. | Some people are scared of overlay networks because they aren't as easy to debug as native routing. It's a full mesh so very large clusters will require custom config with autodiscovery disabled. | IPIP mode is needed when routing between subnets (AWS AZ's) which negates some of the performance benefits vs an overlay. BGP is slighly scary to some people. | Overlay can be disabled if direct routing is preferred. | Similar to Calico in that it uses IPIP by default to encapsulate traffic between subnets. Quite a new project and although it's in use in production at some companies it's still not v1. | Community not very large | No defaults make the recommended setup confusing. | Unknown | Still in experimental or Alpha stage. |
| References | Unknown | Unknown | Unknown | Unknown | [0] https://cilium.io/blog/2019/04/24/cilium-15 | Unknown | Unknown | Unknown | Unknown | Unknown |
36 rows
Kubernetes Networks / Layer 2 (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| Feature / source label | Flannel | Weave Net | Contiv | openshift-sdn |
|---|---|---|---|---|
| Company | Red Hat | WeaveWorks | Cisco | Red Hat |
| Latest Stable Version | 0.10.0 | 2.5.0 | 1.2 | 3.11 |
| Start Date | 2014-07-01 00:00:00 | 2014-08-01 00:00:00 | 2014-12-01 00:00:00 | 2015-01-01 00:00:00 |
| Language | Go | Go | Go | Go |
| Minimum OS Version | Unknown | Linux Kernel > 3.8 | CentOS 7, Ubuntu 16.04 | CentOS 7 |
| Minimum Kubernetes Version | 1.6 | 1.6 | 1.8 | 1.9 |
| IP Version | ipv4 | ipv4 | ipv4, ipv6 | ipv4 |
| Open Source | Yes | Yes | Yes | Yes |
| Encryption | Experimental | NaCl library | No | IPSec |
| Network policy | No | Ingress, Egress | Ingress, Egress | Ingress, Egress |
| Recommended Max Nodes | Unknown | 500.0 | Unknown | Unknown |
| Default Network Model | Layer 2 VXLAN | Layer 2 VXLAN | Layer 2, Layer 3 or ACI options | Layer 2 VXLAN |
| Layer 2 Encapsulation | VXLAN | VXLan | VXLAN | VXLAN |
| Layer 3 Routing | iptables | iptables, kubeproxy | iptables | iptables, kube-proxy |
| Layer 3 Encapsulation | - | Sleeve (fallback) | VLAN | - |
| Layer 4 Route Distribution | - | - | BGP | - |
| vnic per container | no | yes | yes | yes |
| Multicast Suport | no | yes | yes | yes |
| Subnet Per | Host | Cluster | Overlapping IP pools | Host |
| Isolation | cidr | cidr, network | label, cidr | Namespace |
| Load Balancing | no | yes | yes | yes |
| Multi Cluster Routing | no | yes | yes | no |
| Partially Connected Networks | no | yes | no | no |
| IP Overlap Support | no | no | yes | no |
| Name Service | no | yes | no | no |
| Datastore | kubernetes CRDs or etcdv3 | file inside pods | kubernetes etcd, etcd or consul | kubernetes CRD (soon) |
| Paid Support | No | Yes | No | yes |
| Docs | https://coreos.com/flannel/docs/latest/ | https://www.weave.works/docs/net/latest/overview/ | http://contiv.github.io/documents/ | https://docs.okd.io/latest/architecture/networking/sdn.html |
| Platforms | Linux, Windows | Linux | Linux | Linux |
| Unknown | Flannel | Weave Net | Contiv | Unknown |
| Why? | Layer 2 solution. Simple and mature. Overlays are useful when network address space is limited. Overlays also mostly auto-configure. | Combines Layer 2 overlay networking with network policies and other features. Best solution for partially connected networks. | Integrates with On-Prem Cisco ACI. Has a cool bandwidth network policy. | Unknown |
| Scenario | On-Prem or custom cloud where native routing isn't possible | Small to medium size On-Prem or custom cloud | On-Prem with ACI investment | Unknown |
| Why Not? | Native routing is faster and easier to debug. You need to also use Calico if you want network policies. | Some people are scared of overlay networks because they aren't as easy to debug as native routing. It's a full mesh so very large clusters will require custom config with autodiscovery disabled. | No defaults make the recommended setup confusing. | Unknown |
| Integrations | Flannel + Calico | - | Unknown | Unknown |
| Unknown | Sources | Unknown | Unknown | Unknown |
| Unknown | https://medium.com/@jain.sm/flannel-vs-calico-a-battle-of-l2-vs-l3-based-networking-5a30cd0a3ebd | Unknown | Unknown | Unknown |
| Unknown | http://chunqi.li/2015/11/15/Battlefield-Calico-Flannel-Weave-and-Docker-Overlay-Network/ | Unknown | Unknown | Unknown |
| Unknown | https://docs.google.com/spreadsheets/d/1polIS2pvjOxCZ7hpXbra68CluwOZybsP1IYfr-HrAXc/edit#gid=0 | Unknown | Unknown | Unknown |
| Unknown | https://www.objectif-libre.com/en/blog/2018/07/05/k8s-network-solutions-comparison/ | Unknown | Unknown | Unknown |
| Unknown | http://machinezone.github.io/research/networking-solutions-for-kubernetes/ | Unknown | Unknown | Unknown |
| Unknown | https://chrislovecnm.com/kubernetes/cni/choosing-a-cni-provider/ | Unknown | Unknown | Unknown |
| Unknown | https://news.ycombinator.com/item?id=11132574 | Unknown | Unknown | Unknown |
| Unknown | https://medium.com/@olemarkus/kubernetes-clustermesh-with-cilium-and-kops-7a8670551725 | Unknown | Unknown | Unknown |
43 rows
Kubernetes Networks / Layer 3 (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| Feature / source label | Calico | Cilium | Kube Router | Romana |
|---|---|---|---|---|
| Company | Tigera Inc | Covalent | CloudNative Labs | Pani Networks Inc |
| Latest Stable Version | 3.3.1 | 1.9.5 | 0.2.1 | 2.0.2 |
| Start Date | 2014-07-01 00:00:00 | 2015-12-01 00:00:00 | 2017-04-01 00:00:00 | 2015-11-01 00:00:00 |
| Language | Go | Go | Go | Bash |
| Minimum OS Version | RHEL 7, Centos 7, Ubuntu 16.04, Debian 8 | Linux Kernel > 4.9 | Unknown | Unknown |
| Minimum Kubernetes Version | 1.6 | 1.6 | 1.6 | 1.8 |
| IP Version | ipv4, ipv6 | ipv4, ipv6 | ipv4 | ipv4 |
| Open Source | Yes | Yes | Yes | Yes |
| Encryption | No | Yes | No | No |
| Network policy | Ingress, Egress | Ingress, Egress | Ingress, Egress | Ingress, Egress |
| Recommended Max Nodes | 5000.0 | Unknown | Unknown | Unknown |
| Default Network Model | Layer 3 | Layer 3 | Layer 3 | Layer 3 |
| Layer 2 Encapsulation | - | Unknown | - | - |
| Layer 3 Routing | iptables, kubeproxy | BPF, kubeproxy | IPVS, iptables, ipsets | iptables |
| Layer 3 Encapsulation | IPIP (optional) | VXLan, Geneve | IPVS/LVS DR mode, GRE/IPIP | - |
| Layer 4 Route Distribution | BGP | BGP | BGP | BGP, OSPF |
| vnic per container | yes | yes | yes | no |
| Multicast Suport | no | no | no | no |
| Subnet Per | One or more of Cluster / Host / Namespace / Deployment | Host | Host | Host |
| Isolation | label, host, cidr, network sets | label, host, services, entities, cidr, dns, service accounts, namespaces | cidr | cidr |
| Load Balancing | yes | yes | yes | yes |
| Multi Cluster Routing | yes | yes (see comment) | yes | yes |
| Partially Connected Networks | no | no | no | no |
| IP Overlap Support | no | no | no | no |
| Name Service | no | no | no | no |
| Datastore | kubernetes CRDs, or etcdv3 | kubernetes, etcd, consul | kubernetes etcd | kubernetes etcd |
| Paid Support | Yes | Yes (https://isovalent.com) | no | Yes |
| Docs | https://docs.projectcalico.org/v3.3/introduction/ | http://docs.cilium.io/en/ | https://github.com/cloudnativelabs/kube-router | https://romana.readthedocs.io/en/latest/ |
| Platforms | Linux, Windows | Linux | Linux | Linux |
| Unknown | Calico | Cilium | Kube Router | Romana |
| Why? | Layer 3 solution. Good network policy support. Default on most Kubernetes distributions. Easy to debug on hosts by looking at route table. BGP allows for access both inside and outside the cluster. | Security focussed. Uses BPF which is faster than iptables to enforce identity based policies. Policies also operate at Layer 7 allowing for application specific enforcement. The cluster mesh feature is simpler than BGP to confgure. | Single Go binary built from the ground up for Kubernetes. Uses new IPVS/LVS kernel features to improve service load balancing performance. Also does direct server return to improve latency. | Aims for performance by using native Linux routing, iptables and no encapsulation. |
| Scenario | On-Prem with native routing or cloud Kubernetes services | On-Prem or custom cloud security focussed | On-Prem or custom cloud latency focussed | Large scale On-Prem or AWS |
| Why Not? | IPIP mode is needed when routing between subnets (AWS AZ's) which negates some of the performance benefits vs an overlay. BGP is slighly scary to some people. | Requires later Kernel version. Overlay can be disabled if direct routing is preferred. | Similar to Calico in that it uses IPIP by default to encapsulate traffic between subnets. Quite a new project and although it's in use in production at some companies it's till not v1. | Community not very large |
| Integrations | Flannel + Calico | Kubernetes, Envoy, Prometheus, Other CNIs, Kube Router, Metallb, Bird, FRR | Cilium + Kube Router | - |
34 rows
Kubernetes Networks / Defaults (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| Feature / source label | Network |
|---|---|
| GKE | Unknown |
| EKS | AWS VPC CNI, Calico orr Antrea for network policy |
| AKS | Managed, adding Calico soon, Antrea is supported |
| DigitalOcean | Cilium |
| OpenShift | OpenShift SDN, can use Flannel as an option. Calico also supported. Antrea supported |
| PKS | NSX-T or Flannel on GCP. Antrea is suppoted |
| Docker Enterprise | Calico |
| Rancher | Canal, Flannel, Calico |
| Kubermatic | Canal, Calico |
| CDK | Canal, Flannel, Calico, other CNI like Weave |
| Suse CaaS | Cilium |
| MetalK8s | Calico |
| Mesos | Calico |
| IBM | Calico |
| Daocloud | Calico, MacVlan, Flannel |
| Platform 9 | Calico, Weave, Flannel, OpenContrail |
| Cisco Container Platform | ACI, Contiv, Calico |
| Kops | Kubenet (limited to 50 nodes), optional CNI (see comment) |
| Kubespray | User choice, others (see comment) |
| Kubo | Flannel |
20 rows
Kubernetes Networks / Sources (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| Blog: | https://kubedex.com/kubernetes-network-plugins/ | Column 3 (unnamed) | Column 4 (unnamed) |
|---|---|---|---|
| Sources: | Unknown | Unknown | Unknown |
| https://medium.com/@jain.sm/flannel-vs-calico-a-battle-of-l2-vs-l3-based-networking-5a30cd0a3ebd | Unknown | Unknown | Unknown |
| http://chunqi.li/2015/11/15/Battlefield-Calico-Flannel-Weave-and-Docker-Overlay-Network/ | Unknown | Unknown | Unknown |
| https://docs.google.com/spreadsheets/d/1polIS2pvjOxCZ7hpXbra68CluwOZybsP1IYfr-HrAXc/edit#gid=0 | Unknown | Unknown | Unknown |
| https://www.objectif-libre.com/en/blog/2018/07/05/k8s-network-solutions-comparison/ | Unknown | Unknown | Unknown |
| http://machinezone.github.io/research/networking-solutions-for-kubernetes/ | Unknown | Unknown | Unknown |
| https://chrislovecnm.com/kubernetes/cni/choosing-a-cni-provider/ | Unknown | Unknown | Unknown |
| https://news.ycombinator.com/item?id=11132574 | Unknown | Unknown | Unknown |
| https://medium.com/@olemarkus/kubernetes-clustermesh-with-cilium-and-kops-7a8670551725 | Unknown | Unknown | Unknown |
| Unknown | Unknown | Unknown | d |
10 rows
Container-Native Networking - Comparison / Networking (historical)
Historical snapshotRecovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.
Choose columns
| Feature | Docker Overlay Network | Calico | Flannel | Weave Net | Canal (Calico + Flannel) | Romana | Aporeto/Trireme | Cisco Contiv | Covalent Cilium | Kube-Router | OVS/OVN | NSX-T | Midokura | Nuage | Open Contrail |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Open Source | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes/No | No | Yes |
| Network Model [Data Path Technique] | VXLAN overlay | L3 with BGP Peering or IPIP Encapsulation | VXLAN or UDP overlay | VXLAN or UDP overlay; IP routed for AWS VPC | VXLAN or UDP overlay | Layer 3 | Layer 3 with TLS | Layer 2, Layer 3 (BGP) & VxLAN overlay | L3 with optional encapsulation | BGP Based | VxLAN | GENEVE | Unknown | Unknown | Unknown |
| Network Policy API Support | Unknown | Unknown | No | Unknown | Yes | Unknown | Unknown | Uses a custom mechanism for applying policy. | Unknown | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Application Isolation | CIDR Schema | Policy Schema based on labels, cidrs, ports and profiles | CIDR Schema | CIDR Schema, Network Policy API | Policy Schema based on labels, cidrs, ports and profiles | CIDR Schema | TLS-based | Both Label based as well as CIDR Schema | Policy based on labels | Unknown | Unknown | CIDR | Unknown | Unknown | Unknown |
| Isolation from Host Network NS | YES | Yes | Unknown | Yes | Unknown | Unknown | Unknown | Yes | Unknown | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Ingress Policy | Yes | Yes | Unknown | Yes | Unknown | Yes | Unknown | Yes* | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Egress policy | Unknown | Yes | No | No | Yes | Yes | Unknown | Unknown | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Protocol Support | ALL except multicast | ALL | ALL | ALL | ALL | ALL | TCP only | All | Artifically limited to IPv4/IPv6 & TCP/UDP/ICMP[v6] | Unknown | Unknown | All IPv4 and IPv6. Multicast not supported | Unknown | Unknown | Unknown |
| Built-in Name Service | YES | No | No | Yes | No | No | No | Yes | No | Unknown | Unknown | No | Unknown | Unknown | Unknown |
| Built-in Service Load Balancer | YES | No | No | No | No | No | Unknown | Yes | Yes | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Cluster Store Requirements | None | etcd/k8s API | etcd/k8s API | None | etcd/k8s API | etcd/Consul Zookeeper | None | etcd/Consul | Yes (consul or etcd) | Unknown | Unknown | Zookeeper | Unknown | Unknown | Unknown |
| Encryption | YES | No | No | NaCl Library | No | No | TLS | No | Yes (IPSec) | Unknown | Unknown | TLS | Unknown | Unknown | Unknown |
| Separate vNIC for Container | YES | Yes | No | Yes | No | No | No | Yes | Yes (shared logical routing table) | Unknown | Unknown | NA | Unknown | Unknown | Unknown |
| IP Overlap Support | YES | No | No | No | No | No | No | Yes, multiple VRFs | No | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Container Subnet Restriction | YES | No | No | Yes, configurable after start | No | No | No | No restriction | No | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Multicast support | NO | No | No | Yes | No | No | No | Yes | No | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Pods routable from outside cluster | N/A | Yes | No | Yes | Unknown | No | Unknown | Yes | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Container Networking Interface | N/A | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Container Networking Model | YES | Yes | No | Yes | No | No | ? | Yes | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| OpenStack Support | N/A | Yes | No | No | No | Yes | Unknown | Yes | No | Unknown | Yes | Yes | Yes | Yes | Yes |
| Kubernetes CNI | N/A | Yes | Yes | Yes | Yes | Yes | Unknown | Yes | Yes | Unknown | Unknown | Yes | Yes | Unknown | Unknown |
| Mesos Support | N/A | Yes | Yes | Yes | Yes | No | Unknown | Unknown | Yes | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Docker Support | Yes | Yes | No | Yes | Unknown | No | Unknown | Yes | Yes | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| rkt Support | N/A | Yes | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | No | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Cloud Foundry Support | NO | ? | Yes | ? | ? | No | Unknown | Unknown | No | Unknown | Unknown | Yes | Unknown | Unknown | Unknown |
| Nomad Support | N/A | No | No | No | No | No | Unknown | Yes | No | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| URL to Networking Architecture | Unknown | Calico Reference Architecture | Flannel | Introducing Weave | tigera/canal | Romana Basics | Trireme Architecture | contiv.io | https://github.com/cilium/cilium | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| URL to Reference Architecture | Designing Scalable, Portable Docker Container Networks | Unknown | Unknown | Unknown | Unknown | Romana Details | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| URL to Demo | Unknown | Calico Demo | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Cilium | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Troubleshooting | Unknown | Calico | Unknown | Weave | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Please use N/A if support isn't applicable | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Kubernetes Cluster Backup - Comparison | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
32 rows
Sources & further reading
Spotted something that needs another look?
Help improve this page →