(v1.2) Kubernetes Network Custom Resource Definition De-Facto Standard
(v1.2) Kubernetes Network Custom Resource Definition De-Facto Standard
Version 1.2
0. Document Versioning
This document shall be versioned in the MAJOR.MINOR format with an optional “-dev” suffix.
The “-dev” suffix denotes that the document of the given version is under modification and those
changes from the previous version have not yet been ratified by the Group. It is not
recommended to rely on a document version with the “-dev” suffix as it may change.
For example, a version of “1.2-dev” means that changes are being made to the document and
the next official version of the document will be 1.2. A version of “1.2” means that the any
changes since the previous version have been ratified by the Group and the document is ready
for implementations to rely upon. Ratified versions are always tagged in Google Docs and also
stored in the Group’s github repository:
https://github.com/k8snetworkplumbingwg/multi-net-spec
1. Goals
This document proposes a specification of the requirements and procedures for attaching
Kubernetes pods to one or more logical or physical networks, including requirements for plugins
using the Container Network Interface (CNI) to attach pod networks.
2. Definitions
2.1 Implementation
The Kubernetes network plugin that implements this specification; as of Kubernetes 1.11 this is
defined to be a plugin conforming to the Container Network Interface (CNI) specification v0.1.0
or later. Kubernetes should be configured to call the implementation for all pod network
operations, and the implementation then determines which additional operations to perform
based on the pod’s annotations and the Custom Resources defined in this specification.
This specification places CNI Delegating Plugin specific requirements and recommendations
under sections marked as such. If the implementation is not a CNI Delegating Plugin, it is free
to ignore the requirements and recommendations in such marked sections, and any subsections
of them.
3. NetworkAttachmentDefinition Object
This specification defines a NetworkAttachmentDefinition Custom Resource object
which describes how to attach a pod to the logical or physical network referenced by the object.
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: network-attachment-definitions.k8s.cni.cncf.io
spec:
group: k8s.cni.cncf.io
version: v1
scope: Namespaced
names:
plural: network-attachment-definitions
singular: network-attachment-definition
kind: NetworkAttachmentDefinition
shortNames:
- net-attach-def
validation:
openAPIV3Schema:
properties:
spec:
properties:
config:
type: string
Plugins which are not CNI Delegating Plugins may not use the Spec.Config field to store
arbitrary configuration. Instead they should store their non-standard configuration in
annotations on the NetworkAttachmentDefinition or pod objects.
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: another-bridge-network
spec:
config: '{
"cniVersion": "0.3.0",
"name": "another-bridge-network",
"plugins": [
{
"type": "bridge",
"bridge": "br0",
"ipam": {
"type": "host-local",
"subnet": "192.168.5.0/24"
}
},
{
"type": "port-forwarding"
},
{
"type": "tuning",
"sysctl": {
"net.ipv4.conf.all.log_martians": "1"
}
}
]
}'
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: a-bridge-network
spec:
config: '{
"cniVersion": "0.3.0",
"type": "awesome-plugin"
}'
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: a-bridge-network
"DNS-1123 label must consist of lower case alphanumeric characters or '-', and must
start and end with an alphanumeric character"
- Kubernetes Error Message
[a-z0-9]([-a-z0-9]*[a-z0-9])?
3.3.1 Examples
example-namespace/attachment-name
attachment-name
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: a-bridge-network
spec:
config: '{
"cniVersion": "0.3.0",
"type": "awesome-plugin"
}'
The CNI Delegating Plugin would send the following CNI JSON Configuration to the
'awesome-plugin' binary, generated by injecting a 'name' field with the
NetworkAttachmentDefinition object name as its data:
{
"cniVersion": "0.3.0",
"name": "a-bridge-network",
"type": "awesome-plugin"
}
While strongly recommended, this matching is not required as it may place Kubernetes API
object naming requirements on externally-defined resources. Naming is ultimately left up to the
cluster administrator to decide.
The Network Attachment Selection Annotation may be used to select additional attachments to
the cluster-wide default network, above and beyond the required initial cluster-wide default
network attachment.
Note that even though the objects the annotation references are
NetworkAttachmentDefinition objects, the annotation's name is
"k8s.v1.cni.cncf.io/networks". This is intentional.
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/networks: net-a,net-b,other-ns/net-c
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{"name":"net-a"},
{
"name":"net-b",
"ips": ["1.2.3.4"],
"mac": "aa:bb:cc:dd:ee:ff"
},
{
"name":"net-c",
"namespace":"other-ns"
}
]
4.1.2.1.1 "name"
This required key with value of type string is the name of a
NetworkAttachmentDefinition object, either in the Pod’s namespace (if the "namespace"
key is missing or empty) or another namespace specified by the "namespace" key.
4.1.2.1.2 "namespace"
This optional key with value of type string is the namespace of the
NetworkAttachmentDefinition object named by the "name" key.
4.1.2.1.3 "ips"
This optional key with value of type string-array requires the plugin handling this network
attachment to assign the given IP addresses to the pod. This key’s value must contain at least
one array element and each element must be a valid IPv4 or IPv6 address with an optional
network prefix length (eg “/24”). If the value is invalid, the Network Attachment Selection
Annotation shall be invalid and ignored by the implementation. Plugins are allowed to fail the
attachment request if they require a network prefix length but the request does not contain a
network prefix length. Plugins are also allowed to fail the attachment request if the specified
network prefix length is unacceptable to the plugin.
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{
"name":"net-b",
"ips": ["10.2.2.42/24", "2001:db8::5/64"]
}
]
The CNI Delegating Plugin must verify that at least one plugin in the attachment list supports the
“ips” capability by inspecting each plugin's JSON configuration "capabilities" key. If no plugin
has the "ips" capability set to true the entire attachment request must fail.
Given the immediately preceding Network Attachment Selection Annotation example, the CNI
Delegating Plugin would transform the data into the following CNI JSON config snippet passed
to each plugin in the CNI invocation for "net-b":
{
…
"runtimeConfig":{
"ips": ["10.2.2.42/24", "2001:db8::5/64"]
}
…
}
4.1.2.1.4 "mac"
This optional key with value type string requires the plugin handling this network attachment to
assign the given MAC address to the pod. This key’s value must contain a valid 6-byte Ethernet
MAC address. If the value is invalid, the Network Attachment Selection Annotation shall be
invalid and ignored by the implementation.
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{
"name":"net-b",
"mac": "02:23:45:67:89:01"
}
]
The CNI Delegating Plugin must verify that at least one plugin in the attachment list supports the
“mac” capability by inspecting each plugin's JSON configuration "capability" key. If no plugin has
the "mac" capability set to true the entire attachment request must fail.
Given the immediately preceding Network Attachment Selection Annotation example, the CNI
Delegating Plugin would transform the data into the following CNI JSON config snippet passed
to each plugin in the CNI invocation for "net-b":
{
…
"runtimeConfig":{
"mac": "02:23:45:67:89:01"
}
…
}
4.1.2.1.5 "interface"
This optional key with value of type string requires the implementation to use the given name for
the pod interface resulting from this network attachment. This key’s value must be a valid Linux
kernel interface name. If the value is invalid, the Network Attachment Selection Annotation shall
be invalid and ignored by the implementation.
If the requested interface name is already used by a previous network attachment, the
implementation must fail the current network attachment.
4.1.2.1.6 "cni-args"
This optional key with value of type dict requires CNI delegating plugins to pass the value
through to the child plugin. CNI Delegating Plugins must implement the “cni-args” key as
described below, however, other implementations may ignore this key.
4.1.2.1.7 "portMappings"
This optional key with value of type dict-array requires the implementation to configure traffic
redirection from a IP port bound to the host’s IP address on this network attachment’s network
to a container IP port bound to the pod interface resulting from this network attachment. If the
value is invalid, the Network Attachment Selection Annotation shall be invalid and ignored by
the implementation.
This key’s value must contain at least one array element and each element must be a valid dict
containing two or more of the following keys:
● “hostPort”: this required key of type integer must contain a value between 1 and 65535
inclusive. It specifies the port number on the host on which to accept traffic and redirect
that traffic to the container port.
● “containerPort”: this required key of type integer must contain a value between 1 and
65535 inclusive. It specifies the port on which the container expects to accept traffic that
is redirected from the host port.
● “protocol”: this optional, case-insensitive key of type string must contain one of “UDP”,
“TCP”, or “SCTP”. It specifies the protocol of traffic to redirect. If not specified, this value
defaults to "TCP".
If the underlying network does not support port mappings (for example, because the underlying
network is not available from the host) the attachment request must fail.
The CNI Delegating Plugin must verify that at least one plugin in the attachment list supports
port mapping by inspecting each plugin's JSON configuration "capabilities" key. If no plugin has
the "portMappings" capability set to true the entire attachment request must fail.
4.1.2.1.8 "bandwidth"
This optional key with value of type dict requires the implementation to configure bandwidth
management on this network attachment. If the value is invalid, the Network Attachment
Selection Annotation shall be invalid and ignored by the implementation. Implementations may
choose any bandwidth management mechanism that allows ingress and egress bandwidth
limiting, and are free to use a different mechanism for ingress and egress.
This key’s value must contain at least one dict element and each element must be one of the
following key/value pairs:
● “ingressRate”: this optional key of type integer must contain a non-zero value that
specifies the maximum ingress bandwidth rate in bits-per-second.
● "ingressBurst": this optional key of type integer must contain a non-zero-value that
specifies the maximum allowed burst in bits. If "ingressBurst" is present, "ingressRate"
must also be present for ingress bandwidth management to be valid.
● “egressRate”: this optional key of type integer must contain a non-zero value that
specifies the maximum egress bandwidth rate in bits-per-second.
● "egressBurst": this optional key of type integer must contain a non-zero value that
specifies the maximum allowed burst in bits. If "egressBurst" is present, then
"egressRate" must also be present for egress bandwidth management to be valid.
If the underlying network does not support bandwidth management the attachment request must
fail.
The CNI Delegating Plugin must verify that at least one plugin in the attachment list supports
traffic shaping by inspecting each plugin's JSON configuration "capabilities" key. If no plugin has
the "bandwidth" capability set to true the entire attachment request must fail.
This optional key with value of type string-array is used to explicitly select which attachment will
receive the default route. The value of items in the “default-route” array are intended to be
gateways, e.g. an IP address to which packets that do not match any other routes are sent. This
key must only be set on one item in the Network Attachment Selection Annotation. This list may
be empty.
Typically, it’s assumed that the attachment for the default network will have the default route,
however, in some cases one may desire to specify which attachment will have the default route.
When “default-route” is set for an attachment other than the cluster-wide default network
attachment, it should be noted that the default route and gateway will be cleared from the
cluster-wide default network attachment.
Only one network attachment may specify the “default-route” key. If more than one attachment
specifies the key, the Network Attachment Selection Annotation shall be invalid and ignored by
the implementation.
It is the responsibility of the implementation to determine how routing will be manipulated. For
example, a CNI Delegating Plugin might inject a CNI IPAM plugin which can manipulate routes,
and will flush the default route from the default network attachment and any attachments that do
not have the “default-route” key set, and then it will set the default route.
When multiple items appear in the gateway list, order of those items may matter. An
implementation may choose to assign a metric to each gateway in the list using that ordering.
In this example, the default route will be set on “net-b” and traffic routed to the gateway as
specified in the “default-route” key.
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{ "name":"net-a" },
{
"name":"net-b",
"default-route": ["10.0.0.1"]
}
]
4.1.2.1.10 "infiniband-guid"
This optional key, “infiniband-guid”, with value type string requires the plugin handling this
network attachment to assign the given Infiniband GUID address to the pod. This key’s value
must contain a valid 8-byte Infiniband GUID address which constitutes the lower 8 bytes of the
20 bytes IP-over-Infiniband hardware address (as described in RFC4391 section 9.1.1 and
Infiniband Specifications Volume1). If the value is invalid, the Network Attachment Selection
Annotation shall be invalid and ignored by the implementation.
A "infiniband-guid" key requires the CNI Delegating Plugin to add a "infinibandGUID" key to
the CNI "runtimeConfig" data and to set its value to a transformation of the "infinibandGUID"
key's value as described in CNI’s CONVENTIONS.md.
The CNI Delegating Plugin must verify that at least one plugin in the attachment list supports the
“infinibandGUID” capability by inspecting each plugin's JSON configuration "capability" key. If no
plugin has the "infinibandGUID" capability set to true the entire attachment request must fail.
Given the immediately preceding Network Attachment Selection Annotation example, the CNI
Delegating Plugin would transform the data into the following CNI JSON config snippet passed
to each plugin in the CNI invocation for "net-b":
{
…
"runtimeConfig":{
"infinibandGUID": "24:8a:07:03:00:8d:ae:2f"
}
…
}
4.2.2 Example
annotations:
k8s.v1.cni.cncf.io/networks: net-a,net-a
In this example the implementation must attach "net-a" twice and each attachment would result
in a separate entry in the Network Attachment Status Annotation list.
5.3.1 "name"
This required key’s value (type string) shall contain either a
NetworkAttachmentDefinition object name from the pod’s Network Attachment
Selection Annotation, or the name of the cluster-wide default network. The "name" should
contain a namespace reference as defined in Section 4.1.1. [ref 2018-02-01 meeting @22:30]
5.3.2 "interface"
This optional key’s value (type string) shall contain the network interface name in the pod’s
network namespace corresponding to the network attachment.
For a CNI Result version earlier than 0.3.0, the implementation may populate the field from the
CNI_IFNAME environment variable it set for the network attachment operation, or leave the field
blank.
5.3.3 "ips"
This optional key’s value (type string array) shall contain an array of IPv4 and/or IPv6 addresses
assigned to the pod as a result of the attachment operation.
1. The "ips" key should be taken from the element of the CNI Result object’s "ips" list where
the "interface" index refers to the first element in the CNI Result object’s "interfaces" list
with a valid "sandbox" key.
2. If there are no elements in the CNI Result object’s "interfaces" list, or none of the
interfaces in the CNI Result object’s "interfaces" list have valid "sandbox" properties, the
"ips" key should be taken from the first element of the CNI Result object’s "ips" list which
does not have an "interface" property or where the "interface" property is less than zero.
The object of these requirements is to ensure that the IP address included in the status map is
the same IP address assigned to the attachment’s interface inside the pod, not the address of
non-sandbox interfaces which are sometimes reported by CNI plugins.
For a CNI Result of a version earlier than 0.3.0, the "ips" key should be sourced from a
combination of the CNI Result's "ip4" and "ip6" properties.
5.3.4 "mac"
This optional key’s value (type string) shall contain the hardware address of the network
interface named by the "interface" key. If the "mac" key is present, "interface" must also be
present.
For a CNI Result version earlier than 0.3.0, the implementation may populate the field by an
implementation-specific mechanism, or leave the field blank.
5.3.5 "default"
This required key’s value (type boolean) shall indicate that this attachment is the result of the
cluster-wide default network. Only one element in the Network Attachment Status Annotation list
may have the "default" key set to true.
5.3.6 "dns"
This optional key’s value (type map) shall contain DNS information that is gathered as a result
of the network attachment. The map may contain the following keys.
5.3.6.1 "nameservers"
This optional key’s value (type string array) shall contain an array of IPv4 and/or IPv6 addresses
of DNS servers.
5.3.6.2 "domain"
This optional key’s value (type string) shall contain the local domain name for the network
attachment.
5.3.6.3 "search"
This optional key’s value (type string array) shall contain the array of DNS search names for the
network attachment.
5.3.6.4 “default-route”
This optional key’s value (type string array) shall be set to the default gateway (or default
gateways in the case of IPv6 with multiple default routes) for the network attachment, if the
attachment had a “default-route” key in the Network Attachment Selection Annotation.
5.3.7 “device-info”
This optional key’s value (type map) shall contain device information gathered as a result of the
network attachment. Such a map must contain the keys described in the Device Information
Specification.
The device information may be gathered by the implementation following the procedure
described in the Device Information Specification”.
5.4 Example
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/network-status: |
[
{
"name": "namespace-a/cluster-wide-default",
"interface": "eth5",
"ips": [ "192.0.2.2/24", "2001:db8::2230/32" ],
"mac": "02:11:22:33:44:54",
"default-route": ["192.0.2.1”],
"default": true
},
{
"name": "namespace-b/some-network",
"interface": "eth1",
"ips": [ "192.0.2.2/24", "2001:db8::2234/32" ],
"mac": "02:11:22:33:44:55",
"dns": {
"nameservers": [ "192.0.2.1", "2001:db8:4860::8888" ],
"search": [ "eng.example.com", "example.com" ]
}
},
{
"name": "namespace-a/an-ip-over-infiniband-network",
"interface": "ib0",
"ips": [ "198.51.100.1/24" ],
"infiniband-guid":
"80:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22"
}
]
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/network-status: |
[
{
"name": "namespace-a/cluster-wide-default",
"interface": "eth5",
"ips": [ "192.0.2.2/24", "2001:db8::2230/32" ],
"mac": "02:11:22:33:44:54",
"default-route":["192.0.2.1","2001:db8::1","2001:db8::2"],
"default": true
},
{
"name": "namespace-b/some-network",
"interface": "eth1",
"ips": [ "192.0.2.2/24", "2001:db8::2234/32" ],
"mac": "02:11:22:33:44:55",
"dns": {
"nameservers": [ "192.0.2.1", "2001:db8:4860::8888" ],
"search": [ "eng.example.com", "example.com" ]
}
},
{
"name": "namespace-a/an-ip-over-infiniband-network",
"interface": "ib0",
"ips": [ "198.51.100.1/24" ],
"infiniband-guid":
"80:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22"
}
]
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
annotations:
k8s.v1.cni.cncf.io/network-status: |
[
{
"name": "namespace-a/cluster-wide-default",
"interface": "eth0",
"ips": [ "192.0.2.2/24", "2001:db8::2230/32" ],
"mac": "02:11:22:33:44:54",
"default-route": ["192.0.2.1”]
},
{
"name": "namespace-b/sriov-network_a",
"interface": "net1",
"device-info": {
"type": "pci",
"version": "1.0.0",
"pci": {
"pci-address": "0000:18:02.5",
"pf-pci-address": "0000:18:00.0"
}
}
},
{
"name": "namespace-b/sriov-network_b",
"interface": "net2",
"device-info": {
"type": "pci",
"version": "1.0.0",
"pci": {
"pci-address": "0000:18:0a.2",
"vhost-net": "/dev/vhost-net/",
"pf-pci-address": "0000:18:00.1"
}
}
},
{
"name": "namespace-c/userspace_net1",
"interface": "net3",
"mac": " 64:1f:74:32:2e:6d",
"device": {
"type": "vhost-user",
“version": "1.0.0",
"vhost-user": {
"mode": "client",
"path": "/var/run/net3/vhost.sock”
}
}
},
{
"name": "namespace-d/vdpa_net1",
"interface": "virtio0",
"mac": " 64:1f:74:32:2e:6e",
"device-info": {
"type": "vdpa”,
“version": "1.0.0",
"vdpa": {
"parent-device": "/sys/bus/vdpa/devices",
"driver": "vhost",
"device": "vdpa2",
"path": "/dev/vhost-vdpa0”,
"pci-address": "0000:04:02.7",
"pf-pci-address": "0000:04:00.0"
}
}
}
]
It’s generally expected that the the cluster-wide default network attachment sets a default route.
This default route may be overridden using the “default-route” key in the Network Attachment
Selection Annotation (see 4.1.2.1.9). Notably, if the cluster-wide default network attachment
does not set a default route and the “default-route” key has not been set, this may cause pods
which do not route traffic in a manner which is typically expected (that is, to other pods
connected to the default network).
The implementation is free to define how cluster-wide default network readiness is determined,
provided that when the cluster-wide default network is determined to be ready, a pod may be
immediately attached to that network and have a reasonable expectation of network
connectivity.
7.1 CNI Delegating Plugin Requirements for CNI Configuration and Result Versioning
The CNI Delegating Plugin must conform to the CNI specification’s requirements for invoking
plugins in a CNI configlist. If the CNI Delegating Plugin uses the CNI project’s reference "libcni"
library these issues will be handled automatically. If not, the CNI specification requires that the
CNI Delegating Plugin inject the cniVersion and name fields from the configlist into each
plugin invocation’s configuration JSON. This ensures that each plugin in the configlist is able to
understand the result of the previous plugin, and that the runtime receives the
correctly-versioned final result.
On pod network teardown, all network attachments that were attempted during pod network
setup must be torn down, and the failure of one shall not prevent teardown of subsequent
attachments. However, if any detachment failed, a final error shall be delivered to the runtime to
indicate the overall teardown operation failed.
1. Security
○ Should a cluster or namespace administrator (or somebody else) be able to
prevent certain pods from attaching to certain networks?
■ PodSecurityPolicy:
https://kubernetes.io/docs/concepts/policy/pod-security-policy/
■ RBAC
2. Dynamic attachment updates
○ Add/remove sidecar networks while the pod is running (since the sidecars are not
reported to Kubernetes, there is issue with changing the Pod’s Kube API IP
address at runtime)
○ Requires a long-running meta-plugin to listen for changes on Pod objects and
reconcile the pod's attachments
○ What happens if a dynamic attachment fails? Does that kill the pod entirely, or is
that error information propagated to the status map or a Pod Event?
1. Default-ness (which network gets the default route, which network is reported to Kube,
etc)
a. Decision: always attach the default Kube network, and all networks specified by
this CRD are sidecars which are not reported to Kube
i. https://youtu.be/_iK-DNJmzY0?list=PL69nYSiGNLP2E8vmnqo5MwPOY2
5sDWIxb&t=1885 (31:30)
b. Previously considered, punted for future:
i. allow not attaching default Kube network
ii. which network gets passed back to Kube
iii. which network gets the pod default route
iv. which network is used for health checking
2. Attachment "pairing" objects instead of Pod annotation of Network names (Mike)
a. Decision: stick with annotation on pod for now
b. Would support selectors to determine which pod and attachment factory to use
c. Allows for more easily finding all attachments that apply to a given factory (rather
than scanning all pods to find ones which have the right annotation)
d. Would allow for pod-specific details (like static IP address or other properties)
without adding more annotations to the Pod object
e. Downside: more user/admin work to connect pods to networks, user would have
to define the attachment factory, and then for each pod also define an attachment
object. Could be automated of course…
3. Sidecar Network Interaction with Services
a. Decision: networks explicitly selected by this mechanism have no defined
interaction with Kubernetes services or any other part of the Kube API, with the
exception of the network status annotation added to pods. It is up to the plugin
whether or not it wants to provide additional interaction with the Kube API (eg,
allows Services to be used on the sidecar networks or whatever)
4. Overlapping IP networks
a. Decision: punted to network plugins to manage; either the plugin does something
specific and well defined, or just Don’t Do This.
b. Per advocates for a more well-defined way to handle overlapping network
attachments
5. Networks as Resources
a. Decision: v1 of this specification will not address this question. It was discussed
heavily in the 2018-03-01 meeting [video] [minutes] and we agreed there were
definitely interesting ideas that should be explored but that the current proposals
were not adequate.
6. "Overrides" as part of the JSON-style annotation
a. Decision: Likely target for v2, not a target v1
b. General idea:
i. The possibility of an "overrides" variable. So, let's say it's bridge type
plugin. One sets:
ii. `"overrides": { "hairpin": true }
iii. The metaplugin checks the overrides against the configuration it loads
from CRD objects against what's provided in overrides, it sees that a key
is set in "overrides" and it overwrites the key (or sets it if unset) in the
configuration. I'd say for simplicity it would be limited to top-level key.
c. One commenter replied given an NFV use case, at a high level: "actually this is a
strong NFVI/TelCo request to be able to drive IP management from the Pod
level"