文章目录
- 一、etcd详解
- 1、etcd的特点
- 2、准备签发证书的环境
- 二、网络插件原理
- 1、flannel
- 1.1 UDP模式(性能差)
- 1.2 VXLAN模式(性能较好)
- 1.3 host-gw模式(性能最高)
- 2、calico插件
- 3、总结
一、etcd详解
etcd是Coreos团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,etcd内部采用作为一致性算法,etcd是go语言编写。
1、etcd的特点
etcd作为服务发现系统,有以下的特点:
- 简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单。
- 安全:支持SSL证书验证。
- 快速:单实例支持每秒2K+读操作。
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性。
etcd目前默认使用2379端口提供HTTP API服务。2380端口和peer通信,(这两个端口已被IANA官方预留给etcd)
#简单来说
etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器内部通讯。
etcd在生产环境中一般推荐集群方式部署,由于etcd的leader选举机制,要求至少为3台或以上的奇数台。
2、准备签发证书的环境
CFSSL是CloudFlare 公司开源的一款 PKI/TLS 工具,CFSSL包含一个命令行工具和一个用于签名、验证和捆绑TLS证书的HTTP API 服务。使用go语言编写。
- CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL提供了方便的命令行生成配置文件。
CFSSL用来为etcd提供TLS证书,它支持三种类型的证书。
-
client 证书: 服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kube-aoiserver访问etcd
-
server证书: 客户端连接服务端时携带的证书,用以服务端验证客户端身份,如etcd对外提供服务。
-
peer证书: 相互之间连接使用的证书,如etcd节点之间进行验证和通信。
etcd安装步骤
1、准备CA证书和私钥文件,使用CA签发服务端证书和私钥文件
2、使用CA证书、服务端证书和私钥文件加上etcd集群配置文件并且启动etcd服务。
3、复制etcd工作目录和服务管理文件,到灵台几个节点上,修改etcd集群配置文件没并且启动etcd服务,
4、使用v3版本接口执行etcdctl + 证书选项 + (endpoint health | endpoint status | member list)
5、查看etcd集群节点状态
二、网络插件原理
kubernets中网络通信
#Pod内容器与容器之间的通信
在同一个Pod内的容器(Pod内的容器是不会跨主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样。可以使用localhost地址访问彼此的端口,完成通信。
#同一个Node内Pod之间的通信
每个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对方的Pod的ip地址进行通信,Pod1和Pod2都是通过Veth连接到同一个docker0/cni0网桥,网段相同,所以他们之间可以直接通信。
#不同Node上Pod之间的通信
Pod地址与docker0在同一网段,docker0网段与宿主机网卡是两个不同的网段,且不同的Node之间的通信只能通过宿主机的物理网卡进行。
要想实现不同Node上Pod之间的通信,就必须想办法通过主机的物理网卡IP地址进行通信。
//因此要满足两个要求。
1、Pod的IP不能冲突
2、将Pod的IP和所在的Node的IP关联起来,通过这个关联让不同Node上Pod之间直接通过内网IP地址通信。
下面就将介绍两种可以使得不同Node上的Pod相互通信的插件
1、flannel
由CoreOS开发的项目Flannel,可能是最直接和最受欢迎的CNI插件,它是容器编排系统中最成熟的网络结构实例之一。
Flannel实质上是一种“ 覆盖网络(overlay network)”,也就是将TCP数据包装载另一个网络里面进行路由转发和通信。
#覆盖网络(overlay network)
//重叠网是节点和逻辑链接的虚拟网络,他们建立在现有的网络之上。
使用重叠网,可以创建多层网络抽象以运行虚拟化的网络,这些物理层均受物理基础架构的支持,重叠网的目的是在无需重新配置整个网络设计的情况下启用新服务或功能。
//简单来说,重叠网就是在现有网络基础上,抽象一层逻辑网络。可以使用逻辑网络进行传输。
flannel有三种网络工作模式
-
UDP模式: 使用设备flannel.0进行封包解包,不是内核原生支持,上下文切换较大,性能非常差。
-
vxlan模式: 使用flannel.1 进行封包解包,内核原生支持,性能较强。
-
host-gw模式: 无需flannel.1这样的中间设备,直接随主机当做子网的下一跳地址,性能最强。
1.1 UDP模式(性能差)
-
核心就是通过TUN设备flannel0实现(TUN设备是工作在三层的虚拟网络设备,功能是:在操作系统内核和用户应用程序之间传递IP包)
-
相比两台宿主机直接通信,多了flanneld的处理过程,这个过程,使用了flannel0这个TUN设备,仅在发出IP包的过程中就要经过了三次用户态到内核态的数据拷贝,(linux的上下文切换代价比较大),所以性能非常差。
上图数据流向原理说明
-
在flannel管理的容器网络里,一台宿主机上的所有容器,它们被分配一个共用 “ 子网 ”,子网与宿主机的对应关系,存在Etcd中。(例如: Node1的子网是100.96.1.0/16,containner-1的ip地址是:100.96.1.2)
-
当flanneld进程处理flannel传入的IP包时,就可以根据目的地址(如100.96.2.3),匹配到对应的子网(比如:100.96.2.0/16),从etcd中找到这个子网对应的宿主机的IP地址(10.168.0.3/24)
-
然后flanneld在收到container-1给container-2的包后,把这个包直接封装在UDP包里,发给Node2(UDP包的源地址是Node1,目的地址是Node2)
-
每台宿主机的flanneld都监听着8285端口,所以flanneld只要把UDP发给node2的8285端口就行了,然后Node2的flannel再把IP包发给他所管理的TUN设备flannel0,flannel0设备再发给docker0
#简单来说
1、在Node1和Node2上面再部署了一个叠加网络,这个网络给每一个node分配一个虚拟网络设备(TUN)。这个设备主要是处理系统内核和用户之间传递IP包。
2、etcd中会存储每个pod网段(namespace)和主机ip的路由信息表。
存储管理Flannel可分配的IP地址段资源
监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表
3、当Node1的containner-1向Node2的containner-2发送请求时。首先数据包会到达Node1的docker0上面,因为docker0相当于它的网关,然后再发给flannel0这个虚拟网络,虚拟网络将数据包发送给flanneld进程,它根据etcd中存储的路由表信息,将数据包通过物理主机网卡发送到对应的物理主机上的响应的8285端口上。
4、对应主机收取到后,进行解压,解压后,将UDP包发送给docker0,最后根据目标地址转发给对应的containner-2
1.2 VXLAN模式(性能较好)
VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,他使用一种隧道协议,将二层以太网帧封装在四层UDP报文中,通过三层网络传输,组成一个虚拟大二层网络。
什么是VXLAN?
- VXLAN是linux本身支持的一种网络虚拟化技术,VXLAN可以在内核态实现封装和解封装工作,从而通过 “ 隧道 ”机制,构建出覆盖网络。
vlan和VXlan的区别?
- vlan
vlan(虚拟局域网),将交换机网络进行隔离,解决广播风暴的危险。
#缺点
1、Vlan技术最多支持4096的Vlan,已无法满足需求。
2、公有云提供商的业务要求将实体网络租借给多个不同的用户,这些用户的网络有可能出现IP地址、MAC地址重叠,传统的vlan仅仅解决广播域的问题,而解决不了网络地址重叠问题。
3、由于虚拟化的出现,交换机的负担增加,每台交换机需要承受多台虚拟机的MAC地址,从而影响交换机的转发性能
- vxlan
vxlan(虚拟扩展局域网),采用MAC-in-UDP报文封装模式,通过将二层报文使用三层协议封装实现二层网络在三层范围内扩展,满足数据中心大二层虚拟机迁移和多租户需求。
#相比valan的优势
1、24位长度的VNI字段可以支持更多数量的虚拟网络,解决了vlan数目上限4094的局限性。
2、VXLAN技术通过隧道技术在物理的三层网络中虚拟二层网络,处于VXLAN网络的终端无法察觉到VXLAN的通信过程,这样也就使得逻辑网络拓扑和物理网络拓扑实现了一定程度的解耦,网络拓扑的配置对于物理设备的配置的依赖程度有所降低,配置更灵活更方便。
3、VLAN技术仅仅解决了二层网络广播域分割的问题,而VXLAN技术还具有多租户支持的特性,通过VXLAN分割,各个租户可以独立组网、通信,地址分配方面和多个租户之间地址冲突的问题也得到了解决。
VXLAN模式核心思想
- Vxlan模式使用比较简单,flannel会在各个节点生产各行一个flannel.1的VXLAN网卡(VTEP设备,负责VXLAN的封装和解封装)。
- VXLAN模式下封包与解包的工作是由内核进行的。flannel不转发数据,仅动态设置ARP表和MAC表项。
- UDP模式的flannel0网络是三层转发,使用flannel0时在物理网络之上构建三层网络,属 于 ip in udp ;VXLAN模式是二层实现,overlan是数据帧,属于mac in udp。
上图解释说明:
- 数据帧从Node1上的Pod的源容器发出后,经由所在主机的docker0/cni0 网络接口转发到flannel.1接口。
- flannel.1 收到数据帧后添加VXLAN头部,封装在UDP报文中。
- Node1通过物理网卡发送封包到Node2的物理网卡中。
- Node2的物理网卡通过VXLAN默认的端口4789转发到flannel.1接口进行解封装。
- 解封装以后,内核将数据帧发送到cni0.最后由cni0发送到桥接到此接口的Node2中的容器。
1.3 host-gw模式(性能最高)
这是一种纯三层络的方案,性能最高
- 就是将每个Flannel子网的下一跳,设置成了该子网对应的宿主机的IP地址,也就是说 ,宿主机(host)充当了这条容器通信路径的“网关”(Gateway), 这正是host-gw的含义
所有的子网和主机的信息,都保存在Etcd中,flanneld只需要watch这些数据的变化 ,实时更新路由表就行了。 - 核心是IP包在封装成数据帧的时候,使用路由表的“下一跳”设置上的MAC地址,这样可以经过二层网络到达目的宿主机
2、calico插件
原理:
一台主机可以理解成一个路由器,每个虚拟机上面的容器通过veth将请求发送到本机网卡上,然后通过 veth pair设备传输到另外一台设备上面的veth pair设备,然后通过veth传输到本机的容器。
每台设备通过路由器进行转发路由信息,路由条目主要是静态路由和BGP路由。
flannel方案
- 需要在每个节点上把发向容器的数据进行封装后, 再用隧道将封装后的数据包发送到运行着目标Pod的node节点上,目标node节点再负责去掉封装,将取出封装的数据包发送到目标Pod上。数据通信性能则大受影响。
calico方案
- calico不使用隧道或NAT来实现转发,而是把Host当做internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发。
- 采用直接路由的方式,这种方式性能锁好最低,不需要修改报文数据,但是如果网络比较复杂场景下,路由表会很复杂,对运维同时提出了较高的要求。
calico主要由三个部分组成
- calico CNI插件: 主要负责与kubernetes对接,共kubelet调用使用。
- Felix : 负责额维护宿主机上的路由规则,FIB转发信息库等。
- BIRD: 负责分发路由规则,类似路由器
- Confd: 配置管理组件
calico工作原理
-
calico 是通过路由表来维护每个pod的通信。calico的CNI插件会为每个容器设置一个veth pair设备,然后把另一点接入到宿主机网络空间,由于没有网桥,CNI插件还需要在宿主机上为每个容器的veth pair设备配置一条路由规则,用于接收传入的IP包。
-
有了这样的veth pair 设备以后,容器发出的ip包就会通过veth pair 设备到达宿主机, 然后宿主机根据路由规则的下一跳地址,发给正确的网关,然后到达目标宿主机,再到达容器。
-
这些路由规则都是Felix 维护的,而路由信息则是calico BRED 组件基于BGP分发而来。
-
calico 实际上是将集群里的所有的节点都当做边界路由器来处理,他们一起组成了一个全互连的网络,批次之间通过BGP交换路由,这些节点我们叫做 BGP Peer。
3、总结
目前比较常用的CNI网络组件是flannel和calico。
- flannel的功能比较简单,不具备复杂的网络策略配置能力,
- Calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。