Kubernetes 网络架构及相关网卡

Kubernetes 网络架构及相关网卡

宿主机网卡

1 packet dropped by kernel
[root@node12 /]# ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.3.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::1c39:e0ff:fefd:bc01  prefixlen 64  scopeid 0x20<link>
        ether 1e:39:e0:fd:bc:01  txqueuelen 1000  (Ethernet)
        RX packets 215461844  bytes 49255741900 (45.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 210219198  bytes 99380196541 (92.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:3a:fe:ce:d7  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 18.16.200.142  netmask 255.255.255.0  broadcast 18.16.200.255
        inet6 fe80::4e56:dbf1:fdb1:bbd9  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:fb:f2:44  txqueuelen 1000  (Ethernet)
        RX packets 271704820  bytes 128411272052 (119.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 234410728  bytes 75423059029 (70.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.3.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::8087:1ff:fe29:ed7c  prefixlen 64  scopeid 0x20<link>
        ether 82:87:01:29:ed:7c  txqueuelen 0  (Ethernet)
        RX packets 52059332  bytes 8640899916 (8.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38918760  bytes 6548881752 (6.0 GiB)
        TX errors 0  dropped 20 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 23487  bytes 1343648 (1.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23487  bytes 1343648 (1.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth0b52cfb8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet6 fe80::bca4:22ff:fea7:349  prefixlen 64  scopeid 0x20<link>
        ether be:a4:22:a7:03:49  txqueuelen 0  (Ethernet)
        RX packets 5345585  bytes 2672632806 (2.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5451377  bytes 3371977575 (3.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth3867ca45: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet6 fe80::7035:a5ff:fecd:e4d0  prefixlen 64  scopeid 0x20<link>
        ether 72:35:a5:cd:e4:d0  txqueuelen 0  (Ethernet)
        RX packets 4210336  bytes 3083434674 (2.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4364899  bytes 5908811645 (5.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0网卡

Docker 安装时会自动在 host 上创建三个网络:none,host,和bridge;详细说明可参考其它文档。

我们可用 docker network ls 命令查看:

[root@node12 /]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0ee6eb650f66        bridge              bridge              local
30a3e66f751c        host                host                local
2d1ae28eb78b        none                null                local

基于DRIVER是bridge的网络都会有一个对应的linux bridge被创建:

在默认环境中,一个名为docker0的linux bridge自动被创建好了,其上有一个 docker0 内部接口,IP地址为172.17.0.1/16(掩码为255.255.0.0)

再用docker network inspect指令查看bridge网络:其Gateway就是网卡/接口docker0的IP地址:172.17.0.1。

[root@node12 /]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "0ee6eb650f66797ca4dde49db3985a4006affdf69f2e208791e11dd3f977a9ab",
        "Created": "2019-12-27T09:25:56.921594934+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

这时就会出现如何识别docker0的虚拟网卡和容器的对应关系,例如,图示中有两个容器和docker0中的两个接口:

安装Linux网桥管理工具bridge-utils

[root@node12 /]# yum install bridge-utils

[root@node12 /]# brctl show
bridge name bridge id       STP enabled interfaces
cni0        8000.1e39e0fdbc01   no      veth07cd1879
                            veth0b52cfb8
                            veth4238d279
                            veth6389b6d5
                            veth724d6510
                            veth78b32a65
                            veth96aa8f2a
                            vethad79f5c0
                            vethb4ae9fae
                            vethcaba2513
                            vethd9bb4726
docker0     8000.02423afeced7   no      

flannel网络

flannel 的 IP 地址是通过 Etcd 管理的,在 k8s 初始化的时候指定 pod 大网的网段 --pod-network-cidr=10.244.0.0/16,flanneld 可以直接通过 Etcd 管理,如果启动的时候指定了 --kube-subnet-mgr,可以直接通过 k8s 的 apiserver 来获得一个小网段的租期,通过 kubectl get -o jsonpath='{.spec.podCIDR}' 可以获取对应节点的 CIDR 表示的网段,flannel 是以节点为单元划分小网段的,每个节点上的 pod 在这个例子当中是划分一个 10.244.x.0/24 的网段,所以总共能分配 255 个节点,每个节点上可以分配 253 个 pod。结构如下图所示,每个节点上都会有一个 flanneld 用于管理自己网段的租期。

img

可以通过在 host 上 cat /run/flannel/subnet.env 查看同步下来的信息,例如:

[root@node12 /]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.3.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

说明当前节点分配的网段是 10.244.0.1/24。在每个节点上因为已经确定了网段,用 ipam 就可以管理这一范围 ip 地址的分配,所以本身 pod 的 IP 分配和中心 Etcd 没有太多联系。

veth网卡

Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。
VETH设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。

veth设备特点

  • veth和其它的网络设备都一样,一端连接的是内核协议栈
  • veth设备是成对出现的,另一端两个设备彼此相连
  • 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去

cni0网卡

查看cni0网卡对应的桥接网卡

[root@node12 /]# brctl show
bridge name bridge id       STP enabled interfaces
cni0        8000.1e39e0fdbc01   no      veth07cd1879
                            veth0b52cfb8
                            veth4238d279
                            veth6389b6d5
                            veth724d6510
                            veth78b32a65
                            veth96aa8f2a
                            vethad79f5c0
                            vethb4ae9fae
                            vethcaba2513
                            vethd9bb4726
docker0     8000.02423afeced7   no  

参考:

flannel 网络架构

Linux-虚拟网络设备-veth pair

flanneld,flannel和cni逐步深入

Kubernetes 网络 -flannel 网络插件详解

Kubernetes中的网络解析——以flannel为例

猜你喜欢

转载自www.cnblogs.com/hongdada/p/12391803.html