diff --git a/roles/network_plugin/calico/tasks/main.yml b/roles/network_plugin/calico/tasks/main.yml
index 3889e801cd9daccddc95f1906508e5156a7628ea..f1fdbab21e16301641d94ed3cf90a6a2cbd294a3 100644
--- a/roles/network_plugin/calico/tasks/main.yml
+++ b/roles/network_plugin/calico/tasks/main.yml
@@ -15,8 +15,8 @@
 
 - name: Calico | Write Calico cni config
   template:
-    src: "cni-calico.conf.j2"
-    dest: "/etc/cni/net.d/10-calico.conf"
+    src: "cni-calico.conflist.j2"
+    dest: "/etc/cni/net.d/10-calico.conflist"
     owner: kube
 
 - name: Calico | Create calico certs directory
diff --git a/roles/network_plugin/calico/templates/cni-calico.conf.j2 b/roles/network_plugin/calico/templates/cni-calico.conf.j2
deleted file mode 100644
index 892391d11c67a9ad71ba99f1b806cd533a139d8b..0000000000000000000000000000000000000000
--- a/roles/network_plugin/calico/templates/cni-calico.conf.j2
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "name": "calico-k8s-network",
-{% if cloud_provider is defined %}
-  "nodename": "{{ calico_kubelet_name.stdout }}",
-{% else %}
-  "nodename": "{{ ansible_hostname }}",
-{% endif %}
-  "type": "calico",
-  "etcd_endpoints": "{{ etcd_access_addresses }}",
-  "etcd_cert_file": "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}.pem",
-  "etcd_key_file": "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}-key.pem",
-  "etcd_ca_cert_file": "{{ etcd_cert_dir }}/ca.pem",
-  "log_level": "info",
-  "ipam": {
-    "type": "calico-ipam"
-  },
-{% if enable_network_policy %}
-  "policy": {
-    "type": "k8s"
-  },
-{% endif %}
-{% if calico_mtu is defined and calico_mtu is number %}
-  "mtu": {{ calico_mtu }},
-{% endif %}
-  "kubernetes": {
-    "kubeconfig": "{{ kube_config_dir }}/node-kubeconfig.yaml"
-  }
-}
diff --git a/roles/network_plugin/calico/templates/cni-calico.conflist.j2 b/roles/network_plugin/calico/templates/cni-calico.conflist.j2
new file mode 100644
index 0000000000000000000000000000000000000000..abe43f7f77bf6127ca5b33a8c8a2a347c941e848
--- /dev/null
+++ b/roles/network_plugin/calico/templates/cni-calico.conflist.j2
@@ -0,0 +1,39 @@
+{
+  "name": "cni0",
+  "cniVersion":"0.3.1",
+  "plugins":[
+    {
+    {% if cloud_provider is defined %}
+      "nodename": "{{ calico_kubelet_name.stdout }}",
+    {% else %}
+      "nodename": "{{ ansible_hostname }}",
+    {% endif %}
+      "type": "calico",
+      "etcd_endpoints": "{{ etcd_access_addresses }}",
+      "etcd_cert_file": "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}.pem",
+      "etcd_key_file": "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}-key.pem",
+      "etcd_ca_cert_file": "{{ etcd_cert_dir }}/ca.pem",
+      "log_level": "info",
+      "ipam": {
+        "type": "calico-ipam"
+      },
+    {% if enable_network_policy %}
+      "policy": {
+        "type": "k8s"
+      },
+    {% endif %}
+    {% if calico_mtu is defined and calico_mtu is number %}
+      "mtu": {{ calico_mtu }},
+    {% endif %}
+      "kubernetes": {
+        "kubeconfig": "{{ kube_config_dir }}/node-kubeconfig.yaml"
+      }
+    },
+    {
+      "type":"portmap",
+      "capabilities":{
+        "portMappings":true
+      }
+    }
+  ]
+}
diff --git a/roles/network_plugin/canal/tasks/main.yml b/roles/network_plugin/canal/tasks/main.yml
index 6d062cc15465c33ba6aa6eabd667eae6e7e62231..aaa7c2a169ad5bb1c995e298e014fdc49d76b7cc 100644
--- a/roles/network_plugin/canal/tasks/main.yml
+++ b/roles/network_plugin/canal/tasks/main.yml
@@ -1,8 +1,8 @@
 ---
 - name: Canal | Write Canal cni config
   template:
-    src: "cni-canal.conf.j2"
-    dest: "/etc/cni/net.d/10-canal.conf"
+    src: "cni-canal.conflist.j2"
+    dest: "/etc/cni/net.d/10-canal.conflist"
     owner: kube
 
 - name: Canal | Create canal certs directory
diff --git a/roles/network_plugin/canal/templates/cni-canal.conf.j2 b/roles/network_plugin/canal/templates/cni-canal.conf.j2
deleted file mode 100644
index b47d7f9dd1ce025afd3981716ac13d500b3458dc..0000000000000000000000000000000000000000
--- a/roles/network_plugin/canal/templates/cni-canal.conf.j2
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "canal-k8s-network",
-  "type": "flannel",
-  "delegate": {
-    "type": "calico",
-    "etcd_endpoints": "{{ etcd_access_addresses }}",
-    "log_level": "info",
-    "policy": {
-      "type": "k8s"
-    },
-    "kubernetes": {
-      "kubeconfig": "{{ kube_config_dir }}/node-kubeconfig.yaml"
-    }
-  }
-}
diff --git a/roles/network_plugin/canal/templates/cni-canal.conflist.j2 b/roles/network_plugin/canal/templates/cni-canal.conflist.j2
new file mode 100644
index 0000000000000000000000000000000000000000..04a88c5b9def1a1f631fa207823e2fb2476853c1
--- /dev/null
+++ b/roles/network_plugin/canal/templates/cni-canal.conflist.j2
@@ -0,0 +1,26 @@
+{
+  "name": "cni0",
+  "cniVersion":"0.3.1",
+  "plugins":[
+    {
+      "type": "flannel",
+      "delegate": {
+        "type": "calico",
+        "etcd_endpoints": "{{ etcd_access_addresses }}",
+        "log_level": "info",
+        "policy": {
+          "type": "k8s"
+        },
+        "kubernetes": {
+          "kubeconfig": "{{ kube_config_dir }}/node-kubeconfig.yaml"
+        }
+      }
+    },
+    {
+      "type":"portmap",
+      "capabilities":{
+        "portMappings":true
+      }
+    }
+  ]
+}
diff --git a/roles/network_plugin/flannel/templates/cni-flannel.yml.j2 b/roles/network_plugin/flannel/templates/cni-flannel.yml.j2
index 165395c24f617788edf7abc80eeda70c8120bce0..d26f04349e909304c90df215b1db5fcea2273770 100644
--- a/roles/network_plugin/flannel/templates/cni-flannel.yml.j2
+++ b/roles/network_plugin/flannel/templates/cni-flannel.yml.j2
@@ -10,7 +10,7 @@ metadata:
 data:
   cni-conf.json: |
     {
-      "name":"cbr0",
+      "name":"cni0",
       "cniVersion":"0.3.1",
       "plugins":[
         {