一、概述 Calico是一个联网和网络策略供应商。Calico支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带BGP。Calico使用相同的引擎为主机、Pod和(如果使用Istio和Envoy)应用程序在服务网格层执行网络策略。Calico以其性能、灵活性而闻名。Calico的功能更为全面,更为复杂。它不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。CalicoCNI插件在CNI(containernetworkinterface)框架内封装了Calico的功能。 GitHub地址:https:github。comprojectcalicocalico 官方文档:https:projectcalico。docs。tigera。ioaboutaboutcalico 想了解flannel的小伙伴,可以参考我这篇文章:Kubernetes(k8s)CNI(flannel)网络模型原理 其它CNI插件,可以查看k8s官网:https:kubernetes。iodocsconceptsclusteradministrationaddons二、Calico架构和核心组件 Calico不使用重叠网络比如flannel和libnetwork重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心;Calico在每一个计算节点利用LinuxKernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播小规模部署可以直接互联,大规模下可通过指定的BGProutereflector来完成。 Calico的核心组件:Felix:运行在每一台Host的agent进程,主要负责网络接口管理和监听、路由、ARP管理、ACL管理和同步、状态上报等。etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用;BGPClient(BIRD):Calico为每一台Host部署一个BGPClient,使用BIRD实现,BIRD是一个单独的持续发展的项目,实现了众多动态路由协议比如BGP、OSPF、RIP等。在Calico的角色是监听Host上由Felix注入的路由信息,然后通过BGP协议广播告诉剩余Host节点,从而实现网络互通。BGPRouteReflector:在大型网络规模中,如果仅仅使用BGPclient形成mesh全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要N2个连接,为了解决这个规模问题,可以采用BGP的RouterReflector的方法,使所有BGPClient仅与特定RR节点互联并做路由同步,从而大大减少连接数。三、什么是BGP? 边界网关协议(BGP)是运行于TCP上的一种自治系统的路由协议,也是互联网上一个核心的去中心化自治路由协议。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了AS互联的拓朴图并由此清除了路由环路,同时在AS级别上可实施策略决策。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。BGP是路由器之间的通信协议,主要用于AS(AutonomousSystem,自治系统)之间的互联。AS内部有多个BGPspeaker,分为ibgp、ebgp,ebgp与其它AS中的ebgp建立BGP连接。AS内部的BGPspeaker通过BGP协议交换路由信息,最终每一个BGPspeaker拥有整个AS的路由信 可以把calico中的node节点当成一个AS,而node节点中的容器是AS中的router,calico通过BGP解析,将整个网络中容器地址的路由表绘制出来。 IBGP(InternalBGP):当BGP运行于同一自治系统内部时,被称为IBGP。EBGP(ExternalBGP):当BGP运行于不同自治系统之间时,称为EBGP。 BGP两种模式:全互联模式(nodetonodemesh)全互联模式,每一个BGPSpeaker都需要和其他BGPSpeaker建立BGP连接,这样BGP连接总数就是N2,如果数量过大会消耗大量连接。如果集群数量超过100台官方不建议使用此种模式。路由反射模式RouterReflection(RR)RR模式中会指定一个或多个BGPSpeaker为RouterReflection,它与网络中其他Speaker建立连接,每个Speaker只要与RouterReflection建立BGP就可以获得全网的路由信息。在calico中可以通过GlobalPeer实现RR模式。三、Calico两种网络模式1)IPIP模式从字面来理解,就是把一个IP数据包又套在一个IP包里,即把IP层封装到IP层的一个tunnel,看起来似乎是浪费,实则不然。它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需IP,而这个ipip则是通过两端的路由做一个tunnel,把两个本来不通的网络通过点对点连接起来。ipip的源代码在内核netipv4ipip。c中可以找到。 Calico的IPIP模式工作原理如下图: Calico使用的这个tunl0设备,是一个IP隧道(IPtunnel)设备 在上面的例子中,IP包进入IP隧道设备之后,就会被Linux内核的IPIP驱动接管。IPIP驱动会将这个IP包直接封装在一个宿主机网络的IP包中,如下所示: 2)BGP模式边界网关协议(BorderGatewayProtocol,BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP,BGP机房的优点:服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。BGP网络相比较IPIP网络,最大的不同之处就是没有了隧道设备tunl0。前面介绍过IPIP网络pod之间的流量发送tunl0,然后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。 四、安装Calico插件1)通过helm安装Calico 官方文档:https:projectcalico。docs。tigera。iogettingstartedkuberneteshelm添加源helmrepoaddprojectcalicohttps:projectcalico。docs。tigera。iochartshelmrepoupdate下载helmpullprojectcalicotigeraoperatorversionv3。24。5解压tarxftigeraoperatorv3。24。5。tgz安装,默认命名空间:calicosystemhelminstallcalico。tigeraoperatornamespacetigeraoperatorcreatenamespace检查tigeraoperator所有资源kubectlgetallntigeraoperator2)通过yaml文件安装wgethttps:docs。projectcalico。orgmanifestscalico。yamlkubectlapplyfcalico。yaml查看kubectlgetallnkubesystemgrepcalico3)k8sflannel网络切换calico1、卸载flannel插件1、查看已安装flannel信息catetccninet。d10flannel。conflist2、删除flannel布署资源kubectldeletefkubeflannel。yml3、清除flannel遗留信息,在集群各节点清理flannel网络的残留文件ifconfigcni0downiplinkdeletecni0ifconfigflannel。1downiplinkdeleteflannel。1rmrfvarlibcnirmrfetccninet。d2、开始安装Calico插件下载wgethttps:docs。projectcalico。orgmanifestscalico。yaml安装kubectlapplyfcalico。yaml查看kubectlgetallnkubesystemgrepcalico如果节点NotReady,重启以下容器或者kubelet试试systemctlrestartcontainerddocker 五、网络策略 关于网络策略,可以参考我这篇文章:【云原生】k8s中的hostNetwork和NetworkPolicy讲解与实战操作 六、简单使用 官方文档:https:projectcalico。docs。tigera。iosecuritykubernetespolicy1)网络策略示例1、允许来自同一命名空间中的Pod的入口流量 允许来自同一命名空间中的Pod的入口流量,在以下示例中,传入带有标签的Pod的labelcolor:red,仅当它们来自pod带有labelcolor:red,才被允许转到80端口。kind:NetworkPolicyapiVersion:networking。k8s。iov1metadata:name:allowsamenamespacenamespace:defaultspec:podSelector:matchLabels:color:blueingress:from:podSelector:matchLabels:color:redports:port:802、允许来自不同命名空间中的Pod的入口流量 在以下示例中,仅当传入流量来自带有标签color:red的Pod时,才允许传入流量,在带有标签的命名空间中带有标签shape:square,在端口上80。kind:NetworkPolicyapiVersion:networking。k8s。iov1metadata:name:allowsamenamespacenamespace:defaultspec:podSelector:matchLabels:color:blueingress:from:podSelector:matchLabels:color:rednamespaceSelector:matchLabels:shape:squareports:port:802)固定PodIP 【示例1】pod 利用注解cni。projectcalico。orgipAddrsvifixediptestpod。yamlapiVersion:v1kind:Podmetadata:name:myapppodlabels:app:myappannotations:cni。projectcalico。orgipAddrs:〔10。244。1。200〕spec:containers:name:myappcontainerimage:busyboxcommand:〔sh,c,echoHelloKubernetes!sleep3600〕 【示例2】控制器单pod 利用注解cni。projectcalico。orgipAddrsvifixediptestdeployment。yamlapiVersion:appsv1kind:Deploymentmetadata:name:fixediptestnamespace:defaultlabels:k8sapp:cloudnativertestspec:replicas:1strategy:type:RollingUpdaterollingUpdate:maxUnavailable:1selector:matchLabels:k8sapp:cloudnativertesttemplate:metadata:labels:k8sapp:cloudnativertestannotations:cni。projectcalico。orgipAddrs:〔10。244。1。220〕spec:containers:name:fixediptestimage:nginx:1。7。9imagePullPolicy:IfNotPresentports:name:httpcontainerPort:80 【示例3】控制器多pod固定IP池 需要创建额外IP池(除了默认IP池),利用注解cni。projectcalico。orgipv4pools。 这里先安装一个客户端工具calicoctlwgethttps:github。comprojectcalicocalicoreleasesdownloadv3。24。5calicoctllinuxamd64mvcalicoctllinuxamd64usrlocalbincalicoctlchmodxusrlocalbincalicoctl 编排vifixediptestdeployment2。yamlapiVersion:projectcalico。orgv3apiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:newpool1spec:blockSize:31cidr:10。244。3。22024ipipMode:NevernatOutgoing:trueapiVersion:projectcalico。orgv3apiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:newpool2spec:blockSize:31cidr:10。244。4。22124ipipMode:NevernatOutgoing:trueapiVersion:appsv1kind:Deploymentmetadata:name:fixediptest2namespace:defaultlabels:k8sapp:cloudnativertestspec:replicas:3strategy:type:RollingUpdaterollingUpdate:maxUnavailable:1selector:matchLabels:k8sapp:cloudnativertesttemplate:metadata:labels:k8sapp:cloudnativertestannotations:【注意】不能使用单引号cni。projectcalico。orgipv4pools:〔newpool1,newpool2〕spec:containers:name:fixediptestimage:nginx:1。7。9imagePullPolicy:IfNotPresentports:name:httpcontainerPort:80 查看查看ip池calicoctlgetippoolkubectlgetpodsowide 【温馨提示】要更改用于Pod的默认IP范围,请修改calico。yaml清单文件中CALICOIPV4POOLCIDR部分。七、CalicoVSFlannel 目前比较常用的是flannel和calico,flannel的功能比较简单,不具备复杂网络的配置能力,不支持网络策略;calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。1)Flannel优势:部署简单,性能一般。劣势:没办法实现固定IP的容器漂移,没法做子网隔离,对上层设计依赖程度高,没有IPAM,IP地址浪费,对Docker启动方法有绑定。2)CalicoCalico还以其先进的网络功能而闻名。网络策略是其最受追捧的功能之一。支持固定IP的配置。此外,Calico还可以与服务网格Istio集成,以便在服务网格层和网络基础架构层中解释和实施集群内工作负载的策略。这意味着用户可以配置强大的规则,描述Pod应如何发送和接受流量,提高安全性并控制网络环境。 两个插件使用的都比较广泛,如果需要设置网络策略,规划更复杂的网络,固定IP等,就建议使用C如果只是简单的使用网络插件的通讯功能就选择Flannel。 关于Kubernetes(k8s)CNI(Calico)网络模型原理介绍与部署就先到这里了,有疑问的小伙伴,欢迎给我留言,后续会持续更新【云原生大数据】相关的文章,请小伙伴耐心等待