FAQ guide for network CNI providers

This commit is contained in:
rawmind0
2018-07-31 15:42:57 +02:00
parent e9631a4613
commit 7163ab7994
11 changed files with 380 additions and 0 deletions
@@ -0,0 +1,9 @@
---
title: Network
weight: 8005
---
Network FAQ's
- [CNI provider]({{< baseurl >}}/rancher/v2.x/en/faq/network/cni-providers/)
@@ -0,0 +1,156 @@
---
title: CNI providers
weight: 2300
draft: true
---
---
### What is CNI?
CNI (Container Network Interface), a [Cloud Native Computing Foundation project](https://cncf.io/), consists of a specification and libraries for writing plugins to configure network interfaces in Linux containers, along with a number of supported plugins. CNI concerns itself only with network connectivity of containers and removing allocated resources when the container is deleted.
K8S uses CNI as an interface between network providers and k8s pods networking.
<img src="img/cni-logo.png" alt="CNI logo">
For more information visit [CNI GitHub project](https://github.com/containernetworking/cni).
### What network models are used in CNI?
CNI providers implement their network fabric using either an encapsulated network model such as VXLAN or an unencapsulated network model such as BGP.
#### What is an encapsulated network?
This network model provides a logical L2 network encapsulated over the existing L3 network topology spanning the k8s cluster nodes. With this model you have an isolated l2 network for containers without needed routing distribution, at the cost of an little overhead in terms of processing and increasing ip package size with an ip header generated by overlay encapsulation. Encapsulation information is used to be distributed by udp port between k8s workers, interchanging network control plane information about how mac addressed could be reached. Common encapsulation used in this kind of network model are vxlan, ipsec, ip-in-ip...
Simplifying, this network model generates a kind of network bridge extended between k8s workers, where pods will be connected.
This network model is indeed when a extended layer 2 bridge is preferred. This network model is sensible to layer 3 network latencies of the k8s workers. If datacenters are in distinct geo-locations, be sure to have low latencies between them to avoid eventual network segmentation.
CNI providers using this network model, flannel, canal, weave...
<img src="img/encapsulated-network.svg" alt="Encapsulated network">
#### What is an unencapsulated network?
This network model provides a l3 network to route packets between containers. This model doesn't generate an isolated l2 network, neither generates overhead, at the cost of route distribution needed, that is managed by k8s workers. Instead of ip headers to encapsutate, it uses a network protocol between k8s workers to distribute routing information to reach pods, like [bgp](https://en.wikipedia.org/wiki/Border_Gateway_Protocol).
Simplifying, this network model generates a kind of network router extended between k8s workers, that provides information how to reach pods.
This network model is indeed when a routed layer 3 network is preferred. This mode dinamically update routes at os level at k8s workers. It's less sensible to latency but
CNI providers using this network model, calico, romana...
<img src="img/unencapsulated-network.svg" alt="Unencapsulated network">
### What CNI provides Rancher?
Rancher supports three different CNI providers for k8s clusters. They could be choosed when you create new k8s cluster from Rancher.
#### What is canal?
<img src="img/canal-logo.png" alt="Canal logo">
Canal is a CNI provider that gives you the best of Flannel and Calico. It allows users to easily deploy Calico and flannel networking together as a unified networking solution, combining Calico’s network policy enforcement with the rich superset of Calico (unencapsulated) and/or flannel (encapsulated) network connectivity options.
On Rancher, canal is the default CNI provider combined with flannel and vxlan encapsulation.
K8S workers should open udp port 8472 (vxlan) and 9099 (healthcheck)
<img src="img/canal-diagram.png" alt="Canal diagram">
More info:
https://github.com/projectcalico/canal
#### What is flannel?
<img src="img/flannel-logo.png" alt="Flannel logo">
Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes. Flannel runs a single binary agent called flanneld on each host, that is responsible for allocating a subnet lease to each host out of a larger, preconfigured address space. Flannel uses either the Kubernetes API or etcd directly to store the network configuration, the allocated subnets, and any auxiliary data (such as the host's public IP). Packets are forwarded using one of several backend mechanisms, being the default encapsulation [vxlan](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan).
Encapsulated traffic is clear by default, flannel provides experimental backend for cipher it, [ipsec](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#ipsec), that make use of strongswam to stablish ciphered ipsec tunnels between k8s workers.
K8S workers should open udp port 8472 (vxlan) and 9099 (healthcheck)
<img src="img/flannel-diagram.png" alt="Flannel diagram">
More info:
https://github.com/coreos/flannel
#### What is calico?
<img src="img/calico-logo.png" alt="Calico logo">
Calico enables networking and network policy in k8s clusters across the cloud. Calico uses a pure unencapsulated IP network fabric and policy engine to provide networking solution to your k8s workloads. K8S workloads are able to peer with cloud infrastructure such as on-premise, using BGP.
Calico also provides a stateless IP-in-IP encapsulation mode that can be used, if necessary.
Calico also offers policy isolation, allowing you to secure and govern your k8s workloads using advanced ingress and egress policies.
K8S workers should open tcp port 179 (bgp)
<img src="img/calico-diagram.svg" alt="Calico diagram">
More info:
https://www.projectcalico.org/
https://github.com/projectcalico/calico
### What can I find out more about the different network projects?
Once 3 distinct CNI providers are presented, it's time to see summarize features and popularity activity on github projects.
#### What are CNI features?
Here is a summary of different features of each of the CNI providers supported on Rancher.
| Provider | Network Model | Route Distribution | Network Policies | Mesh | External Datastore | Encryption | Ingress/Egress Policies | Commercial Support |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| Canal | Encapsulated (vxlan) | No | Yes | No | K8S api | No | Yes | No |
| flannel | Encapsulated (vxlan) | No | No | No | K8S api | No | No | No |
| Calico | Unencapsulated | Yes | Yes | Yes | Etcd | Yes | Yes | Yes |
- Network Model: ecnapsulated or unencapsulated. More info at CNI network model section
- Route Distribution: It is a must on Unencapsulated CNI providers, and it is typically done by BGP. Route distribution is a nice to have a feature with CNI, if you plan to build clusters split across network segments. It is an exterior gateway protocol designed to exchange routing and reachability information on the Internet. BGP can assist with pod to pod networking between clusters.
- Network Policies: K8S offers functionality to enforce rules about which service can communicate with each other using network policies. This feature is stable from k8s 1.7 and is ready to use with supported networking plugins.
- Mesh: This feature allows service to service networking communication between distinct k8s clusters.
- External Datastore: if CNI provider needs an external datastore to persist own data.
- Encyption: This feature allows cypher and secure network control and data planes.
- Ingress/Egress Policies: This feature allows manage routing control for k8s and Non-k8s communications.
#### What are Github projects?
Here is a summary of different github metics to take an idea of projects popularity and activity about of each of the CNI providers supported on Rancher.
| Provider | Project | Stars | Forks | Contributors |
| ---- | ---- | ---- | ---- | ---- |
| Canal | https://github.com/projectcalico/canal | 536 | 75 | 19 |
| flannel | https://github.com/coreos/flannel | 3.279 | 774 | 107 |
| Calico | https://github.com/projectcalico/calico | 572 | 225 | 82 |
- Project: main url of the project
- Stars: Likes on GitHub
- Contributors: number of people maintaining the code base and documentation.
- Forks: number of copies of the repo. Contributors typically have to fork the repo. Other people will fork the project to build a custom copy, push code to a feature branch that they own, or for various reasons.
Note: Tables is updated with 26th july 2018 data
### Which CNI provider?
The above question doesn't have a trivial answer. There are many different providers, which have various features and options. There isn't one provider that meets everyones needs, and there are many different options. By the moment, at rancher v2.0.x we are supporting 3 of the major CNI providers that could be used by every user.
At rancher v2.0.x, canal is the default CNI provider. We recommend to use it in most cases. It provides encapsulated networking for containers with flannel, adding project calico network policies that can provide project/namespace isolation in terms of networking.
Anyway, all of 3 solutions could be a good CNI provider choose and may work perfectly fine.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="150.5 130.5 767.5 446.10666" width="767.5pt" height="446.10666pt" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata> Produced by OmniGraffle 7.4.3
<dc:date>2018-07-27 08:48:50 +0000</dc:date>
</metadata>
<defs>
<font-face font-family="Helvetica Neue" font-size="16" panose-1="2 0 5 3 0 0 0 2 0 4" units-per-em="1000" underline-position="-100" underline-thickness="50" slope="0" x-height="517" cap-height="714" ascent="951.9958" descent="-212.99744" font-weight="500">
<font-face-src>
<font-face-name name="HelveticaNeue"/>
</font-face-src>
</font-face>
</defs>
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<title>Canvas 1</title>
<rect fill="white" width="767.5" height="446.10666"/>
<g>
<title>Layer 1</title>
<line x1="201.40945" y1="575.10666" x2="869.126" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<rect x="177.5" y="161.63496" width="296" height="332" fill="#0174a8"/>
<rect x="177.5" y="161.63496" width="296" height="332" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(182.5 166.63496)" fill="#a5a5a5">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="#a5a5a5" x="0" y="15" textLength="78.512">k8s worker</tspan>
</text>
<rect x="200.80567" y="205.83552" width="115.38866" height="53.77273" fill="white"/>
<rect x="200.80567" y="205.83552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(205.80567 214.2739)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 1</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.0.2</tspan>
</text>
<rect x="271.30567" y="372.33552" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="372.33552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 380.7739)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="24.54233" y="15" textLength="8.288">fl</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="32.83033" y="15" textLength="48.016">anneld</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.0.1</tspan>
</text>
<rect x="334.80567" y="205.83552" width="115.38866" height="53.77273" fill="white"/>
<rect x="334.80567" y="205.83552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(339.80567 214.2739)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 2</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.0.3</tspan>
</text>
<rect x="271.30567" y="465.3355" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="465.3355" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 482.9979)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="1.5423287" y="15" textLength="102.304">192.168.34.10</tspan>
</text>
<rect x="271.30567" y="296.44916" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="296.44916" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 314.11152)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="23.50233" y="15" textLength="58.384">docker0</tspan>
</text>
<line x1="373.65864" y1="259.60825" x2="347.84136" y2="296.44916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="279.41836" y1="259.60825" x2="308.08164" y2="296.44916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329" y1="350.2219" x2="329" y2="372.33552" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329.2452" y1="519.10825" x2="329.7559" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329" y1="465.3355" x2="329" y2="426.10825" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<rect x="597" y="163.49378" width="296" height="332" fill="#0174a8"/>
<rect x="597" y="163.49378" width="296" height="332" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(602 168.49378)" fill="#a5a5a5">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="#a5a5a5" x="0" y="15" textLength="78.512">k8s worker</tspan>
</text>
<rect x="620.3057" y="207.69434" width="115.38866" height="53.77273" fill="white"/>
<rect x="620.3057" y="207.69434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(625.3057 216.1327)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 1</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.1.2</tspan>
</text>
<rect x="690.8057" y="374.19434" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="374.19434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 382.6327)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="24.54233" y="15" textLength="8.288">fl</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="32.83033" y="15" textLength="48.016">anneld</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.1.1</tspan>
</text>
<rect x="754.3057" y="207.69434" width="115.38866" height="53.77273" fill="white"/>
<rect x="754.3057" y="207.69434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(759.3057 216.1327)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 2</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.1.3</tspan>
</text>
<rect x="690.8057" y="467.19434" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="467.19434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 484.8567)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="1.5423287" y="15" textLength="102.304">192.168.34.11</tspan>
</text>
<rect x="690.8057" y="298.30797" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="298.30797" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 315.97034)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="23.50233" y="15" textLength="58.384">docker0</tspan>
</text>
<line x1="793.1586" y1="261.46707" x2="767.3414" y2="298.30797" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="698.9184" y1="261.46707" x2="727.5816" y2="298.30797" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.5" y1="352.0807" x2="748.5" y2="374.19434" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.8122" y1="520.96707" x2="749.44094" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.5" y1="467.19434" x2="748.5" y2="427.96707" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<path d="M 393.5 398.5 L 404.5 375 L 404.5 386.75 L 672.5 386.75 L 672.5 375 L 683.5 398.5 L 672.5 422 L 672.5 410.25 L 404.5 410.25 L 404.5 422 Z" fill="white"/>
<path d="M 393.5 398.5 L 404.5 375 L 404.5 386.75 L 672.5 386.75 L 672.5 375 L 683.5 398.5 L 672.5 422 L 672.5 410.25 L 404.5 410.25 L 404.5 422 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(398.5 389.276)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="black" x="90.064" y="15" textLength="99.872">encapsulation</tspan>
</text>
<path d="M 151 131 L 917.5 131 L 917.5 448.5 L 151 448.5 Z" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="4,4"/>
<text transform="translate(156 136)" fill="#ff2600">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="#ff2600" x="0" y="15" textLength="210.432">Overlay network 10.42.0.0/16</tspan>
</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="177 161.13496 716.5 415.4717" width="716.5pt" height="415.4717pt" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata> Produced by OmniGraffle 7.4.3
<dc:date>2018-07-27 09:12:19 +0000</dc:date>
</metadata>
<defs>
<font-face font-family="Helvetica Neue" font-size="16" panose-1="2 0 5 3 0 0 0 2 0 4" units-per-em="1000" underline-position="-100" underline-thickness="50" slope="0" x-height="517" cap-height="714" ascent="951.9958" descent="-212.99744" font-weight="500">
<font-face-src>
<font-face-name name="HelveticaNeue"/>
</font-face-src>
</font-face>
</defs>
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<title>Canvas 1</title>
<rect fill="white" width="716.5" height="415.4717"/>
<g>
<title>Layer 1</title>
<line x1="201.40945" y1="575.10666" x2="869.126" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<rect x="177.5" y="161.63496" width="296" height="332" fill="#0174a8"/>
<rect x="177.5" y="161.63496" width="296" height="332" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(182.5 166.63496)" fill="#a5a5a5">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="#a5a5a5" x="0" y="15" textLength="78.512">k8s worker</tspan>
</text>
<rect x="200.80567" y="205.83552" width="115.38866" height="53.77273" fill="white"/>
<rect x="200.80567" y="205.83552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(205.80567 214.2739)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 1</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.0.2</tspan>
</text>
<rect x="271.30567" y="372.33552" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="372.33552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 389.9979)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="11.494329" y="15" textLength="37.936">bgp r</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="49.14233" y="15" textLength="44.752">outing</tspan>
</text>
<rect x="334.80567" y="205.83552" width="115.38866" height="53.77273" fill="white"/>
<rect x="334.80567" y="205.83552" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(339.80567 214.2739)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 2</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.0.3</tspan>
</text>
<rect x="271.30567" y="465.3355" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="465.3355" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 482.9979)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="1.5423287" y="15" textLength="102.304">192.168.34.10</tspan>
</text>
<rect x="271.30567" y="296.44916" width="115.38866" height="53.77273" fill="white"/>
<rect x="271.30567" y="296.44916" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(276.30567 314.11152)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="23.50233" y="15" textLength="58.384">docker0</tspan>
</text>
<line x1="373.65864" y1="259.60825" x2="347.84136" y2="296.44916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="279.41836" y1="259.60825" x2="308.08164" y2="296.44916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329" y1="350.2219" x2="329" y2="372.33552" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329.2452" y1="519.10825" x2="329.7559" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="329" y1="465.3355" x2="329" y2="426.10825" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<rect x="597" y="163.49378" width="296" height="332" fill="#0174a8"/>
<rect x="597" y="163.49378" width="296" height="332" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(602 168.49378)" fill="#a5a5a5">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="#a5a5a5" x="0" y="15" textLength="78.512">k8s worker</tspan>
</text>
<rect x="620.3057" y="207.69434" width="115.38866" height="53.77273" fill="white"/>
<rect x="620.3057" y="207.69434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(625.3057 216.1327)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 1</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.1.2</tspan>
</text>
<rect x="690.8057" y="374.19434" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="374.19434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 391.8567)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="11.494329" y="15" textLength="37.936">bgp r</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="49.14233" y="15" textLength="44.752">outing</tspan>
</text>
<rect x="754.3057" y="207.69434" width="115.38866" height="53.77273" fill="white"/>
<rect x="754.3057" y="207.69434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(759.3057 216.1327)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="13.142329" y="15" textLength="79.104">workload 2</tspan>
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="19.334329" y="33.448" textLength="66.72">10.42.1.3</tspan>
</text>
<rect x="690.8057" y="467.19434" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="467.19434" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 484.8567)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="1.5423287" y="15" textLength="102.304">192.168.34.11</tspan>
</text>
<rect x="690.8057" y="298.30797" width="115.38866" height="53.77273" fill="white"/>
<rect x="690.8057" y="298.30797" width="115.38866" height="53.77273" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(695.8057 315.97034)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" x="23.50233" y="15" textLength="58.384">docker0</tspan>
</text>
<line x1="793.1586" y1="261.46707" x2="767.3414" y2="298.30797" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="698.9184" y1="261.46707" x2="727.5816" y2="298.30797" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.5" y1="352.0807" x2="748.5" y2="374.19434" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.8122" y1="520.96707" x2="749.44094" y2="575.10666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="748.5" y1="467.19434" x2="748.5" y2="427.96707" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<path d="M 505.25 429.95 L 505.25 377.55 C 505.25 373.9344 518.69 371 535.25 371 C 551.81 371 565.25 373.9344 565.25 377.55 L 565.25 429.95 C 565.25 433.5656 551.81 436.5 535.25 436.5 C 518.69 436.5 505.25 433.5656 505.25 429.95" fill="white"/>
<path d="M 505.25 429.95 L 505.25 377.55 C 505.25 373.9344 518.69 371 535.25 371 C 551.81 371 565.25 373.9344 565.25 377.55 L 565.25 429.95 C 565.25 433.5656 551.81 436.5 535.25 436.5 C 518.69 436.5 505.25 433.5656 505.25 429.95 M 505.25 377.55 C 505.25 381.1656 518.69 384.1 535.25 384.1 C 551.81 384.1 565.25 381.1656 565.25 377.55" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text transform="translate(510.25 397.801)" fill="black">
<tspan font-family="Helvetica Neue" font-size="16" font-weight="500" fill="black" x="4.112" y="15" textLength="41.776">ETCD</tspan>
</text>
<line x1="386.69433" y1="400.48854" x2="505.25" y2="403.09137" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<line x1="690.8057" y1="401.80288" x2="565.25" y2="403.3745" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB