etcd
etcd是Coreos团队于2013年6月发起的开源项目,它的方针是构建一个高可用的分布式键值((key-value)数据库。etcd内部选用raft协议作为一致性算法,etcd是go言语编写的
etcd作为服务发现系统,有以下的特色:
- 简略:装置装备简略,而且供给了HTTP API进行交互,运用也很简略
- 安全:支撑ssL证书验证
- 快速:单实例支撑每秒2k+读操作
- 可靠:选用raft算法,完成分布式系统数据的可用性和一致性
etcd现在默许运用2379端口供给HTTP API服务,2380端口和peer通讯(这两个端口现已被IANA(互联网数字分配机构)官方预留给etcd) 即etcd默许运用2379端口对外为客户端供给通讯,运用端口2380来进行服务器间内部通讯。 etcd在出产环境中一般引荐集群方法布置。因为etcd的leader选举机制,要求至少为3台或以上的奇数台.
准备签发证书环境
CFSSL 是CloudFlare 公司开源的一款、PKI/TLS 工具。CFSSL包含一个命令行工具和一个用于签名、验证和绑缚TLs 证书的 HTTP API服务。运用GO言语编写。
CFSSL运用装备文件生成证书,因而自签之前,需求生成它辨认的 json 格式的装备文件,CFSSL供给了便利的命令行生成装备文件。
CFSSL用来为etcd供给TLS 证书,它支撑签三种类型的证书:
- client 证书,服务端衔接客户端时带着的证书,用于客户端验证服务端身份,如 kube-apiserver拜访 etcd;
- server证书,客户端衔接服务端时带着的证书,用于服务端验证客户端身份,如 etcd对外供给服务;
- peer 证书,相互之间衔接时运用的证书,如etcd节点之间进行验证和通讯。
CNI网络组件
k8s中 pod网络通讯
Pod内容器与容器之间的通讯
- 在同一个Pod 内的容器
(Pod 内的容器是不会跨宿主机的)同享同一个网络命名空间,相当于它们在同一台机器上相同,能够用localhost地址拜访彼此的端口。
- 同一个Node内Pod 之间的通讯
每个Pod都有一个真实的全局IP地址,同一个 Node 内的不同Pod 之间能够直接选用对方pod 的 IP地址进行通讯,Podl与 pod2 都是经过 Veth 衔接到同一个docker0/cni0 网桥,网段相同,所以他们之间能够直接通讯
- 同Node 上 Pod之间的通讯
Pod 地址与 docker0在同一网段,docker0网段与宿主机网卡是两个不同的网段,且不同Node之间的通讯只能经过宿主机的物理网卡进行。 要想完成不同 node 上 pod 之间的通讯,就必须想办法经过主机的物理网卡IP地址进行寻址和通讯。因比要满意两个条什: pod 的 IP 不能冲突:将 pod 的 IP 地点的 Node 的 IP 关联起来,经过这个关联让不同 node 上 pod 之间直接经过内网 IP 地址通讯
overlay Network:
叠加网络,在二层或者三层根底网络上叠加的一种虚拟网络技能形式,该网络中的主机经过虚拟链路地道衔接起来。 经过Overlay技能(能够理解成地道技能),在原始报文外再包一层四层协议(UDP协议),经过主机网络进行路由转发。这种方法功用有必定损耗,首要体现在对原始报文的修及。现在Overlay首要选用VHLAN。
VHLAN
将源数据包封装到UDP中,并运用根底网络的IP/MAC作为外层报文头进行封装,然后在以网络上传输,抵达意图地后由地道端点解封装并将数据发送到方针地址。
Flannel
Flannel 的功用是让集群中的不同节点主机创立的 Docker容器都具有全集群唯一的虚拟IP地址。 Flannel是 Overlay 网络的一种,也是将TCP源数据包封装在另一种网络包里面进行路由转发和通讯,现在支撑 UDP、VLAN、Host-gw 3种数据传输方法。
Flannel UDP 形式的作业原理:
数据从主机A上 Pod 的源容器中宣布后,经由地点主机的 docker0/cni0 网络接口转发到flannel0接口,flanmeld 服务监听在flannne10虚拟网卡的别的一端。 flannel 经过 ETCD 服务保护了一张节点间的路由表。源主机A的flameld服务将本来的数拱内容封装到UDP报文中,根器自己的路由表经过物理网卡投递给意图节点主机B的flameld服务,数据抵达今后被解包,然后直接进入意图节点的 flannel0接口,之后被转发到意图主机的 doctero/cni0网桥,最终就像本机容器道信相同由 docker0/cni0 转发到方针容器。
ETCD 之Flannel供给说明:
- 存储管理Flannel可分配的IP地址段资源
- 监控ETCD中每个Pod 的实践地址,并在内存中建立保护Pod节点路由表
因为 UDP 形式是在用户态做转发,会多一次报文地道封装,因而功用上会比内核态做转发的VXLAN形式差
VXLAN形式
VXLAN形式运用比较简略,flannel 会在各节点生成一个flannel.1的 VXLAM网卡(VTEP设备,担任VXLAN封装和解封装)
VXLAN形式下封包与解包的作业是由内核进行的。flannel不转发数据,仅动态设置ARP表和 MAC表项。
UDP形式的 flanne10网卡是三层转发,运用 flannel0 时在物理网络之上构建三层网络,属于 ip in upd : VXLAN形式是二层完成,overlay 是数据帧,属于 mac in udp。
Flannel VXLAN形式跨主机的作业原理:
- 数据帧从主机 A 上 Pod 的源容器中宣布后,经由地点主机的 docker0/cni0网络接口转发到 flanne1.1 接口
- flannel.l收到数据帧后添加VXLAN 头部,封装在 UDP报文中
- 主机A经过物理网卡发送封包到主机B的物理网卡中
- 主机B的物理网卡再经过 VXLAN默许端口4789转发到flannel.1接口进行解封装
- 解封装今后,内核将数据帧发送到 cni0,最终由 cni0 发送到桥接到此接口的容器B中。
Calico
k8s组网方案比照
flannel方案
需求在每个节点上把发向容器的数据包进行封装后,再用地道将封装后的数据包发送到运转着日标pod的node节点上。方针node节点再担任去掉封装,将去除封装的数据包发送到方针Pod 上。数据通讯功用则大受影响。
calico方案
Calico不运用地道或NAT来完成转发,而是把Host当作nternet中的路由器,运用bgp同步路由,并运用iptables来做安全拜访战略,完成跨Host转发。选用直接路由的方法,这种方法功用损耗最低,不需求修改报文数据,但是假如网络比较杂乱场景下,路由表会很杂乱,对运维搭档提出了较高的要求。
calico 的形式:
- IPIP形式:在原有IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址IP和意图地址IP都修改为对端宿主机 ip。calico 默许运用IPIP的形式,
- BGP形式:将节点做为虚拟路由器经过 BGP 路由协议来完成集群内容器之间的网络拜访。
- cross-subnet (ipip-bgp混合形式):IPIP形式和 BGP形式都有对应的局限性,关于一些主机跨子网而又无法使网络设备运用BGP的场景能够运用cross-subnet形式,完成同子网机器运用BGP形式,跨子网机器运用IPIP形式。
calico 主哥由以下几个部分组成:
- Calico CNL插件:首要担任与kubernetes对接,供kubelet调用运用。
- Felix:担任保护宿主机上的路由规矩、FIB转发信息库等。
- BIRD:担任分发路由规矩,类似路由器。
- Confd:装备管理组件。
calico 作业原理:
IPIP 形式:
Calico 会将容器的IP 包经过内核的TPIP 驱动直接在封装宿主机网络的IP 包中,并依据路由经过tunlO 网卡发送给其他节点,这样抵达方针节点今后再经过 IPIP 驱动解包得到原始容器IP包,然后经过路由规矩发送给veth pair设备抵达日标容器。
BGP形式:
calico是经过路由表来保护每个pod 的通讯。calico 的 CNI 插件会为每个容器设置一个veth pair 设备,然后把另一端接入到宿主机网络空间,因为没有网桥,CNI插件还需求在宿主机上为每个容器的veth pair 设备装备一条路由规矩,用于接收传入的IP包。有了这样的 veth pair 设备今后,容器宣布的IP 包就会经过veth pair 设备抵达宿主机,然后宿主机依据路由规矩的下一跳地址,发送给正确的网关,然后抵达方针宿主机,再抵达方针容器。这些路由规矩都是 Felix 保护装备的,而路由信息则是calico BIRD组件基于 BGP 分发而来。caivo实践上是将集群里一切的节点都作为鸿沟路由器来处理,他们一起组成了一个全互联的网络。彼此之间经过BGP交换路由,这些节点我们叫做BGP Peer 。
相比IPIP形式,BGP形式下不需求tunl0设备参与报文传输,报文直接经过物理网卡(比方ens33)转发到方针主机上,不会进行二次IP报文的封装,因而从功用上来看,BGP是占优势的,但是因为没有二次封装,BGP形式只能在同一个子网内运用,无法跨网段运用
现在比较常用的CNL网络组件是flannel和calico,flannel的功用比较简略,但不具有杂乱的网络战略装备才能 但calico以其功用、灵活性而出名。calico的功用更为全面 ,不只供给主机和pod之间的网络衔接,还触及网络安全和管理,但具有杂乱网络装备才能的同时,往往意味着本身的装备比较杂乱,所以相对而言,比较小而简略集群运用flannel,考虑到日后扩容,未来网络可能需求加入更多设备,装备更多网络战略,则运用calico更好。
总结
k8s的三种网络
节点网络 节点物理网卡IP
flannel 是k8s的pod能够完成跨节点通讯的cni网络插件
flannel形式: UPD(默许形式) VXLAN(引荐,功用比UPD更好) host-gw(功用最好,但装备繁琐)
因为 UPD形式是在用户态做转发,会多一次报文地道封装,因而功用上会比内核态做转发的 VXLAN 形式差
flannel的UPD形式作业原理
1、运用数据从源主机的pod宣布到cni0网桥接口,再由cni0网桥接口转发到flannel0虚拟网卡接口
2、flanneld服务会监听flannel0接口的数据,flanneld服务会将内部数据包封装到UDP报文里
3、依据flannel在etcd保护的路由表经过物理网卡转发到方针主机(经过flannel在etcd保护的路由表查到方针pod地点的节点ip,在UDP报文外在封装节点ip报文,MAC报文后发送到方针节点)
4、经过8285号端口,UDP报文送到达方针主机的flanneld服务后会被解封装,然后会经过方针主机的flannel0接口转发到方针主机的cni0网桥,最终在被cni0转发到方针pod
flannel和 calico区别?
flannel:udp vxlan host-gw,
通常运用vxlan形式,选用的是叠加网络,IP地道方法传输数据,,能够完成跨子网传输,但传输过程中需求封包和解包的过程,对功用有必定的影响,
同时也具有一些长处,功用简略,装备便利,利于管理,但不具有杂乱的网络战略规矩装备才能
calico: ipip bgp 混合
运用ipip形式能够完成夸子网传输,但传输过程中需求封包和解包,对功用有一点的影响
运用bgp形式能够直接依据bgp路由规矩转发,且传输过程中不需求封包和解包因而功用较好,但只能在同一个子网内运用,无法跨网络运用
具有更丰厚的网络安全战略和装备管理才能,但是保护起来较为杂乱
所以关于较小规划且网络要求简略的k8s集群,能够选用flannel;
关于集群规划较大且要求更多的网络战略装备时,能够选用功用更为全面地calico
coreDNS 是kubernetes 的默许 DNS 完成
依据 service 资源称号 解分出 cluster IP
依据 pod 资源称号 解分出 pod IP