avatarTony

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

4300

Abstract

-</span>it <span class="hljs-comment">--net=host busybox ip a</span> <span class="hljs-number">1</span>: lo: <span class="hljs-operator"><</span>LOOPBACK,UP,LOWER_UP<span class="hljs-operator">></span> mtu <span class="hljs-number">65536</span> qdisc noqueue qlen <span class="hljs-number">1000</span> link<span class="hljs-operator">/</span>loopback <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span> brd <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span> inet <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-operator">/</span><span class="hljs-number">8</span> <span class="hljs-keyword">scope</span> host lo valid_lft forever preferred_lft forever inet6 ::<span class="hljs-number">1</span><span class="hljs-operator">/</span><span class="hljs-number">128</span> <span class="hljs-keyword">scope</span> host valid_lft forever preferred_lft forever <span class="hljs-number">2</span>: eth0: <span class="hljs-operator"><</span>BROADCAST,MULTICAST,UP,LOWER_UP<span class="hljs-operator">></span> mtu <span class="hljs-number">9001</span> qdisc mq qlen <span class="hljs-number">1000</span> link<span class="hljs-operator">/</span>ether <span class="hljs-number">12</span>:<span class="hljs-number">4</span>e:e2:<span class="hljs-number">6</span>d:<span class="hljs-number">77</span>:d5 brd ff:ff:ff:ff:ff:ff inet <span class="hljs-number">172.31</span><span class="hljs-number">.84</span><span class="hljs-number">.183</span><span class="hljs-operator">/</span><span class="hljs-number">20</span> brd <span class="hljs-number">172.31</span><span class="hljs-number">.95</span><span class="hljs-number">.255</span> <span class="hljs-keyword">scope</span> <span class="hljs-keyword">global</span> <span class="hljs-keyword">dynamic</span> eth0 valid_lft <span class="hljs-number">2754</span>sec preferred_lft <span class="hljs-number">2754</span>sec inet6 fe80::<span class="hljs-number">104</span>e:e2ff:fe6d:<span class="hljs-number">77</span>d5<span class="hljs-operator">/</span><span class="hljs-number">64</span> <span class="hljs-keyword">scope</span> link valid_lft forever preferred_lft forever <span class="hljs-number">3</span>: docker0: <span class="hljs-operator"><</span><span class="hljs-keyword">NO</span><span class="hljs-operator">-</span>CARRIER,BROADCAST,MULTICAST,UP<span class="hljs-operator">></span> mtu <span class="hljs-number">1500</span> qdisc noqueue link<span class="hljs-operator">/</span>ether <span class="hljs-number">02</span>:<span class="hljs-number">42</span>:<span class="hljs-number">97</span>:<span class="hljs-number">77</span>:c5:dc brd ff:ff:ff:ff:ff:ff inet <span class="hljs-number">172.17</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-operator">/</span><span class="hljs-number">16</span> brd <span class="hljs-number">172.17</span><span class="hljs-number">.255</span><span class="hljs-number">.255</span> <span class="hljs-keyword">scope</span> <span class="hljs-keyword">global</span> docker0 valid_lft forever preferred_lft forever inet6 fe80::<span class="hljs-number">42</span>:<span class="hljs-number">97</span>ff:fe77:c5dc<span class="hljs-operator">/</span><span class="hljs-number">64</span> <span class="hljs-keyword">scope</span> link valid_lft forever preferred_lft forever</pre></div><ul><li><b>Macvlan/Ipvlan Network</b>: This lets you assign a MAC/IP address to a container, making it appear as a physical network device on your LAN.</li></ul><div id="8ab7"><pre>$ docker network <span class="hljs-keyword">create</span> <span class="hljs-operator">-</span>d macvlan <span class="hljs-comment">--subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan_net</span> <span class="hljs-number">2</span>a03ac6926675427015f37186433e8308d0d9f207382b24af8b3569965ecd5ce

$

Options

docker run <span class="hljs-operator">-</span>it <span class="hljs-comment">--net=my_macvlan_net busybox ip a</span> <span class="hljs-number">1</span>: lo: <span class="hljs-operator"><</span>LOOPBACK,UP,LOWER_UP<span class="hljs-operator">></span> mtu <span class="hljs-number">65536</span> qdisc noqueue qlen <span class="hljs-number">1000</span> link<span class="hljs-operator">/</span>loopback <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span> brd <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span> inet <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-operator">/</span><span class="hljs-number">8</span> <span class="hljs-keyword">scope</span> host lo valid_lft forever preferred_lft forever <span class="hljs-number">36</span>: eth0<span class="hljs-variable">@if2</span>: <span class="hljs-operator"><</span>BROADCAST,MULTICAST,UP,LOWER_UP,M<span class="hljs-operator">-</span>DOWN<span class="hljs-operator">></span> mtu <span class="hljs-number">9001</span> qdisc noqueue link<span class="hljs-operator">/</span>ether <span class="hljs-number">02</span>:<span class="hljs-number">42</span>:c0:a8:<span class="hljs-number">01</span>:<span class="hljs-number">02</span> brd ff:ff:ff:ff:ff:ff inet <span class="hljs-number">192.168</span><span class="hljs-number">.1</span><span class="hljs-number">.2</span><span class="hljs-operator">/</span><span class="hljs-number">24</span> brd <span class="hljs-number">192.168</span><span class="hljs-number">.1</span><span class="hljs-number">.255</span> <span class="hljs-keyword">scope</span> <span class="hljs-keyword">global</span> eth0 valid_lft forever preferred_lft forever</pre></div><ul><li><b>Overlay Network</b>: Useful for multi-host networking, especially in a distributed system like K8s. It allows containers across different hosts to communicate as if they’re on the same logical network.</li></ul><h1 id="35f1">Container Network Interface</h1><p id="4704">The Container Network Interface (CNI) is a specification and a set of tools for configuring container networking. It’s a standard that defines how network plugins should be created and interact with container runtimes (like <code>containerd</code> or <code>runc</code>). The idea is to have a consistent and straightforward interface between container runtimes and network plugins, so different systems and tools can work seamlessly together.</p><p id="c80c">CNI has spawned a variety of open-source projects that offer different networking solutions for containers. These CNI plugins are designed to be used with container runtimes that adhere to the CNI specification, such as K8s, Mesos, and more. Below are some popular open-source CNI projects:</p><h2 id="6bfa">Flannel</h2><ul><li>Repository: <a href="https://github.com/coreos/flannel">coreos/flannel</a></li><li>Description: Flannel is a simple and easy-to-setup overlay network that satisfies the Kubernetes CNI. It can utilize various backend technologies to route container traffic.</li></ul><h2 id="c60a">Calico</h2><ul><li>Repository: <a href="https://github.com/projectcalico/calico">projectcalico/cni-plugin</a></li><li>Description: Calico provides networking and network policy for containers, virtual machines, and native host-based workloads. It uses a pure IP networking fabric to deliver high-performance networking.</li></ul><h2 id="0522">Cilium</h2><ul><li>Repository: <a href="https://github.com/cilium/cilium">cilium/cilium</a></li><li>Description: Cilium uses eBPF (extended Berkeley Packet Filter) to provide API-aware network security, load balancing, and routing.</li></ul><h2 id="3931">Weave</h2><ul><li>Repository: <a href="https://github.com/weaveworks/weave">weaveworks/weave</a></li><li>Description: Weave creates a virtual network that connects containers across multiple hosts and enables their automatic discovery.</li></ul></article></body>

Docker — Container Network Basics

Container networking basics

Containerization has revolutionized software deployment. While the idea of isolating applications in their environment isn’t new, the way containers achieve this is particularly efficient. One of the essential aspects of containerization is networking. In a K8s cluster, understanding the basics of container networking is crucial for effective orchestration.

Why is Container Networking Important?

Containers, by design, are transient. They can be created, destroyed, and recreated rapidly. This dynamic nature means that their networking must be equally flexible. Unlike traditional VMs, which have a more static network interface and IP, containers can come and go, implying their network configurations can change rapidly.

Isolation and Security

Containers are all about isolation, allowing multiple applications to run on a single OS without interfering with each other. Networking is a crucial part of this isolation. It ensures that:

  • Containers can communicate with each other securely and efficiently.
  • Traffic to and from containers can be appropriately routed, filtered, and load-balanced.
  • Intruders are kept out, and sensitive data is kept in.

Inter-container Communication

In microservices architectures, an application might be split into dozens (or even hundreds) of individual services, each running in its own container. Efficient and reliable container-to-container communication is essential for:

  • Maintaining application responsiveness.
  • Ensuring data consistency.
  • Implementing complex workflows and transaction sequences.

Service Discovery

As mentioned, containers can come and go, and hardcoding IPs is impractical. Thus, an effective networking solution must offer:

  • Dynamic service registration and discovery.
  • Load balancing to distribute traffic evenly among multiple instances of a service.

Cross-Host Communication

In distributed platforms like K8s, containers can reside on different hosts. Networking plays a crucial role in ensuring:

  • Seamless communication across containers, irrespective of where they are running.
  • Efficient routing and low latency, especially when container instances span across data centers or cloud regions.

Container Networking Modes

  • None: No networking. This disables networking for the container. You use this mode. For example:
$ docker run -it --net=none busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
  • Bridge Network: The default Docker networking mode. Containers get IPs from a private subnet and communicate with external entities through NAT. For example:
$ docker run -it busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
  • Host Network: Containers share the host’s network stack. They can directly use the host’s IP but might face port conflicts. Processes running inside the container have the same network capabilities as services running directly on the host. For example:
$ docker run -it --net=host busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq qlen 1000
    link/ether 12:4e:e2:6d:77:d5 brd ff:ff:ff:ff:ff:ff
    inet 172.31.84.183/20 brd 172.31.95.255 scope global dynamic eth0
       valid_lft 2754sec preferred_lft 2754sec
    inet6 fe80::104e:e2ff:fe6d:77d5/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
    link/ether 02:42:97:77:c5:dc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:97ff:fe77:c5dc/64 scope link
       valid_lft forever preferred_lft forever
  • Macvlan/Ipvlan Network: This lets you assign a MAC/IP address to a container, making it appear as a physical network device on your LAN.
$ docker network create -d macvlan   --subnet=192.168.1.0/24   --gateway=192.168.1.1   -o parent=eth0 my_macvlan_net
2a03ac6926675427015f37186433e8308d0d9f207382b24af8b3569965ecd5ce

$ docker run -it --net=my_macvlan_net busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 9001 qdisc noqueue
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
  • Overlay Network: Useful for multi-host networking, especially in a distributed system like K8s. It allows containers across different hosts to communicate as if they’re on the same logical network.

Container Network Interface

The Container Network Interface (CNI) is a specification and a set of tools for configuring container networking. It’s a standard that defines how network plugins should be created and interact with container runtimes (like containerd or runc). The idea is to have a consistent and straightforward interface between container runtimes and network plugins, so different systems and tools can work seamlessly together.

CNI has spawned a variety of open-source projects that offer different networking solutions for containers. These CNI plugins are designed to be used with container runtimes that adhere to the CNI specification, such as K8s, Mesos, and more. Below are some popular open-source CNI projects:

Flannel

  • Repository: coreos/flannel
  • Description: Flannel is a simple and easy-to-setup overlay network that satisfies the Kubernetes CNI. It can utilize various backend technologies to route container traffic.

Calico

  • Repository: projectcalico/cni-plugin
  • Description: Calico provides networking and network policy for containers, virtual machines, and native host-based workloads. It uses a pure IP networking fabric to deliver high-performance networking.

Cilium

  • Repository: cilium/cilium
  • Description: Cilium uses eBPF (extended Berkeley Packet Filter) to provide API-aware network security, load balancing, and routing.

Weave

  • Repository: weaveworks/weave
  • Description: Weave creates a virtual network that connects containers across multiple hosts and enables their automatic discovery.
Docker
Kubernetes
DevOps
Cloud Computing
Software Development
Recommended from ReadMedium