summaryrefslogtreecommitdiff
path: root/doc/rtd/reference/network-config.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rtd/reference/network-config.rst')
-rw-r--r--doc/rtd/reference/network-config.rst317
1 files changed, 317 insertions, 0 deletions
diff --git a/doc/rtd/reference/network-config.rst b/doc/rtd/reference/network-config.rst
new file mode 100644
index 00000000..5a2386d7
--- /dev/null
+++ b/doc/rtd/reference/network-config.rst
@@ -0,0 +1,317 @@
+.. _network_config:
+
+Network configuration
+*********************
+
+Default behaviour
+=================
+
+``Cloud-init`` searches for network configuration in order of increasing
+precedence; each item overriding the previous.
+
+- **Datasource**: For example, OpenStack may provide network config in the
+ MetaData Service.
+- **System config**: A ``network:`` entry in :file:`/etc/cloud/cloud.cfg.d/*`
+ configuration files.
+- **Kernel command line**: ``ip=`` or
+ ``network-config=<Base64 encoded YAML config string>``
+
+User data cannot change an instance's network configuration. In the absence
+of network configuration in any of the above sources, ``cloud-init`` will
+write out a network configuration that will issue a DHCP request on a "first"
+network interface.
+
+.. note::
+
+ The ``network-config`` value is expected to be a Base64 encoded YAML string
+ in :ref:`network_config_v1` or :ref:`network_config_v2` format. Optionally,
+ it can be compressed with ``gzip`` prior to Base64 encoding.
+
+Disabling network configuration
+===============================
+
+Users may disable ``cloud-init``'s network configuration capability and rely
+on other methods, such as embedded configuration or other customisations.
+
+``cloud-init`` supports the following methods for disabling ``cloud-init``.
+
+Kernel command line
+-------------------
+
+``Cloud-init`` will check for the parameter ``network-config=disabled``,
+which will automatically disable any network configuration.
+
+Example disabling kernel command line entry: ::
+
+ network-config=disabled
+
+Cloud config
+------------
+
+In the combined ``cloud-init`` configuration dictionary, merged from
+:file:`/etc/cloud/cloud.cfg` and :file:`/etc/cloud/cloud.cfg.d/*`: ::
+
+ network:
+ config: disabled
+
+If ``cloud-init``'s networking config has not been disabled, and no other
+network information is found, then it will proceed to generate a fallback
+networking configuration.
+
+Disabling network activation
+============================
+
+Some datasources may not be initialised until after the network has been
+brought up. In this case, ``cloud-init`` will attempt to bring up the
+interfaces specified by the datasource metadata using a network activator
+discovered by `cloudinit.net.activators.select_activators`_.
+
+This behaviour can be disabled in the ``cloud-init`` configuration dictionary,
+merged from :file:`/etc/cloud/cloud.cfg` and
+:file:`/etc/cloud/cloud.cfg.d/*`: ::
+
+ disable_network_activation: true
+
+Fallback network configuration
+==============================
+
+``Cloud-init`` will attempt to determine which, of any attached network
+devices, is most likely to have a connection and then generate a network
+configuration to issue a DHCP request on that interface.
+
+``Cloud-init`` runs during early boot and does not expect composed network
+devices (such as Bridges) to be available. ``Cloud-init`` does not consider
+the following interface devices as likely "first" network interfaces for
+fallback configuration; they are filtered out from being selected.
+
+- **loopback**: ``name=lo``
+- **Virtual Ethernet**: ``name=veth*``
+- **Software Bridges**: ``type=bridge``
+- **Software VLANs**: ``type=vlan``
+
+``Cloud-init`` will prefer network interfaces that indicate they are connected
+via the Linux ``carrier`` flag being set. If no interfaces are marked as
+connected, then all unfiltered interfaces are potential connections.
+
+Of the potential interfaces, ``cloud-init`` will attempt to pick the "right"
+interface given the information it has available.
+
+Finally, after selecting the "right" interface, a configuration is generated
+and applied to the system.
+
+.. note::
+ PhotonOS disables fallback networking configuration by default, leaving
+ network unrendered when no other network config is provided.
+ If fallback config is still desired on PhotonOS, it can be enabled by
+ providing ``disable_fallback_netcfg: false`` in
+ :file:`/etc/cloud/cloud.cfg:sys_config` settings.
+
+Network configuration sources
+=============================
+
+``Cloud-init`` accepts a number of different network configuration formats in
+support of different cloud substrates. The datasource for these clouds in
+``cloud-init`` will detect and consume datasource-specific network
+configuration formats for use when writing an instance's network
+configuration.
+
+The following datasources optionally provide network configuration:
+
+- :ref:`datasource_config_drive`
+
+ - `OpenStack Metadata Service Network`_
+ - :ref:`network_config_eni`
+
+- :ref:`datasource_digital_ocean`
+
+ - `DigitalOcean JSON metadata`_
+
+- :ref:`datasource_nocloud`
+
+ - :ref:`network_config_v1`
+ - :ref:`network_config_v2`
+ - :ref:`network_config_eni`
+
+- :ref:`datasource_opennebula`
+
+ - :ref:`network_config_eni`
+
+- :ref:`datasource_openstack`
+
+ - :ref:`network_config_eni`
+ - `OpenStack Metadata Service Network`_
+
+- :ref:`datasource_smartos`
+
+ - `SmartOS JSON Metadata`_
+
+- :ref:`datasource_upcloud`
+
+ - `UpCloud JSON metadata`_
+
+- :ref:`datasource_vultr`
+
+ - `Vultr JSON metadata`_
+
+For more information on network configuration formats:
+
+.. toctree::
+ :maxdepth: 1
+
+ network-config-format-eni.rst
+ network-config-format-v1.rst
+ network-config-format-v2.rst
+
+
+Network configuration outputs
+=============================
+
+``Cloud-init`` converts various forms of user-supplied or automatically
+generated configuration into an internal network configuration state. From
+this state, ``cloud-init`` delegates rendering of the configuration to
+distro-supported formats. The following ``renderers`` are supported in
+``cloud-init``:
+
+NetworkManager
+--------------
+
+`NetworkManager`_ is the standard Linux network configuration tool suite. It
+supports a wide range of networking setups. Configuration is typically stored
+in :file:`/etc/NetworkManager`.
+
+It is the default for a number of Linux distributions; notably Fedora,
+CentOS/RHEL, and their derivatives.
+
+ENI
+---
+
+:file:`/etc/network/interfaces` or ``ENI`` is supported by the ``ifupdown``
+package found in Alpine Linux, Debian and Ubuntu.
+
+Netplan
+-------
+
+Introduced in Ubuntu 16.10 (Yakkety Yak), `Netplan`_ has been the default
+network configuration tool in Ubuntu since 17.10 (Artful Aardvark). Netplan
+consumes :ref:`network_config_v2` input and renders network configuration for
+supported backends such as ``systemd-networkd`` and ``NetworkManager``.
+
+Sysconfig
+---------
+
+Sysconfig format is used by RHEL, CentOS, Fedora and other derivatives.
+
+NetBSD, OpenBSD, FreeBSD
+------------------------
+
+Network renders supporting BSD releases, which typically write configuration
+to :file:`/etc/rc.conf`. Unique to BSD renderers is that each renderer also
+calls something akin to `FreeBSD.start_services`_ which will invoke applicable
+network services to setup the network, making network activators unneeded
+for BSD flavors at the moment.
+
+Network output policy
+=====================
+
+The default policy for selecting a network ``renderer`` (in order of
+preference) is as follows:
+
+- ENI
+- Sysconfig
+- Netplan
+- NetworkManager
+- FreeBSD
+- NetBSD
+- OpenBSD
+- Networkd
+
+The default policy for selecting a network ``activator`` (in order of
+preference) is as follows:
+
+- **ENI**: using ``ifup``, ``ifdown`` to manage device setup/teardown
+- **Netplan**: using ``netplan apply`` to manage device setup/teardown
+- **NetworkManager**: using ``nmcli`` to manage device setup/teardown
+- **Networkd**: using ``ip`` to manage device setup/teardown
+
+When applying the policy, ``cloud-init`` checks if the current instance has the
+correct binaries and paths to support the renderer. The first renderer that
+can be used is selected. Users may override the network renderer policy by
+supplying an updated configuration in cloud-config. ::
+
+ system_info:
+ network:
+ renderers: ['netplan', 'network-manager', 'eni', 'sysconfig', 'freebsd', 'netbsd', 'openbsd']
+ activators: ['eni', 'netplan', 'network-manager', 'networkd']
+
+Network configuration tools
+===========================
+
+``Cloud-init`` contains one tool used to test input/output conversion between
+formats. The :file:`tools/net-convert.py` in the ``cloud-init`` source
+repository is helpful in examining expected output for a given input format.
+
+CLI Interface:
+
+.. code-block:: shell-session
+
+ $ tools/net-convert.py --help
+
+Example output:
+
+.. code-block::
+
+ usage: net-convert.py [-h] --network-data PATH --kind
+ {eni,network_data.json,yaml} -d PATH [-m name,mac]
+ --output-kind {eni,netplan,sysconfig}
+
+ optional arguments:
+ -h, --help show this help message and exit
+ --network-data PATH, -p PATH
+ --kind {eni,network_data.json,yaml}, -k {eni,network_data.json,yaml}
+ -d PATH, --directory PATH
+ directory to place output in
+ -m name,mac, --mac name,mac
+ interface name to mac mapping
+ --output-kind {eni,netplan,sysconfig}, -ok {eni,netplan,sysconfig}
+
+Example of converting V2 to sysconfig:
+
+.. code-block:: shell-session
+
+ $ tools/net-convert.py --network-data v2.yaml --kind yaml \
+ --output-kind sysconfig -d target
+ $ cat target/etc/sysconfig/network-scripts/ifcfg-eth*
+
+Example output:
+
+.. code-block::
+
+ # Created by cloud-init on instance boot automatically, do not edit.
+ #
+ BOOTPROTO=static
+ DEVICE=eth7
+ IPADDR=192.168.1.5/255.255.255.0
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+ # Created by cloud-init on instance boot automatically, do not edit.
+ #
+ BOOTPROTO=dhcp
+ DEVICE=eth9
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+
+
+.. _Cloud-init: https://launchpad.net/cloud-init
+.. _NetworkManager: https://networkmanager.dev
+.. _Netplan: https://netplan.io/
+.. _DigitalOcean JSON metadata: https://developers.digitalocean.com/documentation/metadata/
+.. _OpenStack Metadata Service Network: https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/metadata-service-network-info.html
+.. _SmartOS JSON Metadata: https://eng.joyent.com/mdata/datadict.html
+.. _UpCloud JSON metadata: https://developers.upcloud.com/1.3/8-servers/#metadata-service
+.. _Vultr JSON metadata: https://www.vultr.com/metadata/
+.. _cloudinit.net.activators.select_activators: https://github.com/canonical/cloud-init/blob/main/cloudinit/net/activators.py#L279
+.. _FreeBSD.start_services: https://github.com/canonical/cloud-init/blob/main/cloudinit/net/freebsd.py#L28