暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes系列之Calico网络原理篇

kubernetes爱好者 2020-01-12
2202

一、什么是Calico?

    Calico是一套开源的网络和网络安全方案,用于容器、虚拟机、宿主机之前的网络连接,可以用在kubernetes、OpenShift、DockerEE、OpenStrack等PaaS或IaaS平台上。


二、calico组件概述

Felixcalico的核心组件,运行在每个节点上。主要的功能有接口管理、路由规则、ACL规则和状态报告

  • 接口管理:Felix为内核编写一些接口信息,以便让内核能正确的处理主机endpoint的流量。特别是主机之间的ARP请求和处理ip转发。

  • 路由规则:Felix负责主机之间路由信息写到linux内核的FIB(Forwarding Information Base)转发信息库,保证数据包可以在主机之间相互转发。

  • ACL规则:Felix负责将ACL策略写入到linux内核中,保证主机endpoint的为有效流量不能绕过calico的安全措施。

  • 状态报告:Felix负责提供关于网络健康状况的数据。特别是,它报告配置主机时出现的错误和问题。这些数据被写入etcd,使其对网络的其他组件和操作人员可见。

Etcd保证数据一致性的数据库,存储集群中节点的所有路由信息。为保证数据的可靠和容错建议至少三个以上etcd节点。

Orchestrator plugin协调器插件负责允许kubernetes或OpenStack等原生云平台方便管理Calico,可以通过各自的API来配置Calico网络实现无缝集成。如kubernetes的cni网络插件。

BirdBGP客户端,Calico在每个节点上的都会部署一个BGP客户端,它的作用是将Felix的路由信息读入内核,并通过BGP协议在集群中分发。当Felix将路由插入到Linux内核FIB中时,BGP客户端将获取这些路由并将它们分发到部署中的其他节点。这可以确保在部署时有效地路由流量。

BGP Router Reflector(Bird)在大规模集群部署中Calico会用到BGP反射器,这个组件一般在数据中心出口位置,充当BGP客户端连接的中心点,防止节点中每个BGP客户端都维护一份整个集群的路由表。


三、BGP基础知识

    边界网关协议(BGP)是运行于 TCP上的一种自治系统的路由协议,也是互联网上一个核心的去中心化自治路由协议。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓朴图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。

  • IBGP(Internal BGP):当BGP运行于同一自治系统内部时,被称为IBGP

  • EBGP(External BGP):当BGP运行于不同自治系统之间时,称为EBGP

BGP是路由器之间的通信协议,主要用于AS(AutonomousSystem,自治系统)之间的互联。

AS内部有多个BGP speaker,分为ibgp、ebgp,ebgp与其它AS中的ebgp建立BGP连接。

AS内部的BGP speaker通过BGP协议交换路由信息,最终每一个BGP speaker拥有整个AS的路由信

    可以把calico中的node节点当成一个AS,而node节点中的容器是AS中的router,calico通过BGP解析,将整个网络中容器地址的路由表绘制出来。

BGP两种模式:

全互联模式(node-to-node mesh)

    全互联模式,每一个BGP Speaker都需要和其他BGP Speaker建立BGP连接,这样BGP连接总数就是N^2,如果数量过大会消耗大量连接。如果集群数量超过100台官方不建议使用此种模式。

路由反射模式Router Reflection(RR)

    RR模式中会指定一个或多个BGP Speaker为RouterReflection,它与网络中其他Speaker建立连接,每个Speaker只要与Router Reflection建立BGP就可以获得全网的路由信息。在calico中可以通过Global Peer实现RR模式。


四、calico访问过程

跨宿主机之间容器访问             个容器app-manager和app-upload分别在两台不同的宿主机

app-manager 172.23.123.121(容器ip) 172.20.58.196(宿主机ip
app-upload 172.23.179.56(容器ip) 172.20.58.238(宿主机ip

当app-manager访问app-upload时过程如下:

登录app-manager容器中,查看路由信息

可以看到0.0.0.0指向了169.254.1.1(eth0),查看容器ip地址

eth0@if195为calico在宿主机上创建的虚拟网桥的一端,另一端为cali874c09348b8

去往容器app-upload的数据包,由app-manager容器里经过网桥设备转发到app-manager所在的宿主机上,在宿主机上查看路由表

可以看到172.23.179.56的下一跳是172.20.58.238,也就是app-upload所在的宿主机ip地址,网络接口是tunl0

    tunl0设备是一个ip隧道(ip tunnel)设备,技术原理是IPIP,ip包进入ip隧道后会被linux内核的IPIP驱动接管并重新封装(伪造)成去宿主机网络的ip包,然后发送出去。这样原始ip包经过封装后下一跳地址就是172.20.58.238

数据包到达app-upload的宿主机172.20.58.238后,经过解包查找172.23.179.56的路由为网桥设备calie52a6da2cc0

最终172.23.179.56经过网桥设备calie52a6da2cc0被转发到容器app-upload内部,返回的数据包路径也是一样。


五、总结

    Calico作为kubernetes的网络组件之一已经在云原生众多开源项目中脱颖而出。Calico与flannel(大二层网络方案)对比,由于使用BGP网络协议代替二层网络中flannel进程的封包解包过程从而大大提高本身的传输性能,同时Calico可以配合使用Network Policy做pod和pod之前的访问控制,对于实际生产环境也是非常重要的一项安全功能。

    在Calico网络中可以把每个node看作一个vRouter,每个pod通过BGP网络协议互相连通,Calico中的confd组件负责维护kubernetes中node节点配置信息并写入etcd存储中,bird组件则作为BGP客户端将自身的路由信息分发到其他vRouter节点上,而Felix组件负责接口管理,以便让内核能够正确处理主机上的endpoint流量,通过Calico网络组件,kubernetes上的pod与pod之前被连接起来,通过BGP网络协议组成一张相互连通的网络环境。


文章转载自kubernetes爱好者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论