7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理
Posted 高效运维
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理相关的知识,希望对你有一定的参考价值。
一、Docker 网络模式
在讨论 Kubernetes 网络之前,让我们先来看一下 Docker 网络。Docker 采用插件化的网络模式,默认提供 bridge、host、none、overlay、maclan 和 Network plugins 这几种网络模式,运行容器时可以通过–network 参数设置具体使用那一种模式。
bridge:这是Docker默认的网络驱动,此模式会为每一个容器分配Network Namespace和设置IP等,并将容器连接到一个虚拟网桥上。如果未指定网络驱动,这默认使用此驱动。
host:此网络驱动直接使用宿主机的网络。
none:此驱动不构造网络环境。采用了none 网络驱动,那么就只能使用loopback网络设备,容器只能使用127.0.0.1的本机网络。
overlay:此网络驱动可以使多个Docker daemons连接在一起,并能够使用swarm服务之间进行通讯。也可以使用overlay网络进行swarm服务和容器之间、容器之间进行通讯,
Network plugins:可以安装和使用第三方的网络插件。可以在Docker Store或第三方供应商处获取这些插件。
1.1 bridge网络的构建过程
通过 ifconfig 命令可以查看 docker0 网桥的信息:
通过 docker network inspect bridge 可以查看网桥的子网网络范围和网关:
2)运行容器时,在宿主机上创建虚拟网卡 veth pair 设备,veth pair 设备是成对出现的,从而组成一个数据通道,数据从一个设备进入,就会从另一个设备出来。
1.2 外部访问
$ docker run -P {images}
$ docker run -p {hostPort}:{containerPort} {images}
二、Kubernetes 网络模式
Kubernetes与Docker网络有些不同。Kubernetes网络需要解决下面的4个问题:
集群内:
容器与容器之间的通信
Pod和Pod之间的通信
Pod和服务之间的通信
集群外:
-
外部应用与服务之间的通信
2.1 同一个 Pod 中容器之间的通信
2.2 不同 Pod 中容器之间的通信
对于此场景,情况现对比较复杂一些,这就需要解决 Pod 间的通信问题。在Kubernetes 通过 flannel、calic 等网络插件解决 Pod 间的通信问题。本文以 flannel 为例说明在 Kubernetes 中网络模型,flannel 是 kubernetes 默认提供网络插件。Flannel 是由 CoreOS 团队开发社交的网络工具,CoreOS 团队采用 L3 Overlay 模式设计 flannel, 规定宿主机下各个Pod属于同一个子网,不同宿主机下的Pod属于不同的子网。
2.3 Flannel 在 K8S 中运行的整体过程
$ etcdctl ls /coreos.com/network/config
2)设置 Node 节点上的子网
基于在 etcd 中设置的网络,flannel 为每一个 Node 分配 IP 子网。
获取子网列表
$ etcdctl ls /coreos.com/network/subnets
获取子网信息
$ etcdctl ls /coreos.com/network/subnets/{IP网段}
3)在每个 Node 上启动 flanneld
$ cat /var/run/flannel/subnet.env
4)创建虚拟网卡
在Node节点上,会创建一个名为flannel.1的虚拟网卡。
$ ip addr show flannel.1
5)创建Docker网桥
$ ip addr show docker0
6)修改路由表
flannel会对路由表进行修改,从而能够实现容器跨主机的通信。
$ route -n
2.4 数据传递过程
在源容器宿主机中的数据传递过程:
1)源容器向目标容器发送数据,数据首先发送给 docker0 网桥
在源容器内容查看路由信息:
$ kubectl exec -it -p {Podid} -c {ContainerId} -- ip route
2)docker0 网桥接受到数据后,将其转交给 flannel.1 虚拟网卡处理
查看源容器所在Node的路由信息:
$ ip route
3)flannel.1 接受到数据后,对数据进行封装,并发给宿主机的 eth0
flannel.1收到数据后,flannelid会将数据包封装成二层以太包。
Ethernet Header的信息:
4)对在flannel路由节点封装后的数据,进行再封装后,转发给目标容器 Node 的 eth0
-
From: {源容器 Node 节点网卡的 MAC 地址} -
To: {目录容器 Node 节点网卡的 MAC 地址}
IP Header的信息:
通过此次封装,就可以通过物理网络发送数据包。
在目标容器宿主机中的数据传递过程:
5)目标容器宿主机的eth0接收到数据后,对数据包进行拆封,并转发给flannel.1虚拟网卡;
6)flannel.1 虚拟网卡接受到数据,将数据发送给docker0网桥;
7)最后,数据到达目标容器,完成容器之间的数据通信。
近期好文:
以上是关于7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理的主要内容,如果未能解决你的问题,请参考以下文章