网络插件Calico

转载自:https://www.cnblogs.com/pythonlx/p/17775826.html

Calico是什么

Calico是一个用于容器、虚拟机和主机的开源网络和网络安全解决方案。它是一个纯三层解决方案,利用BGP协议为容器或虚拟机提供IP地址,并提供网络安全功能,包括网络策略和加密。

Calico 通过将网络策略应用于标签和选择器,提供了一种简单而强大的方法来保护容器或虚拟机之间的通信,并限制容器或虚拟机可以访问的网络资源。它还支持基于 Kubernetes 和 OpenStack 等平台的网络自动化和集成。
Calico 的另一个重要特点是其可扩展性。它使用了基于 BGP 的路由技术,这使得它能够轻松地扩展到非常大规模的网络中,而不会降低性能。
由于Calico是一种纯三层的方案,因此可以避免与二层方案相关的数据包封装的操作,中间没有任何的NAT,没有任何的overlay,所以它的转发效率是所有方案中最高的,因为它的包直接走原生TCP/IP的协议栈,它的隔离也因为这个栈而变得好做。因为TCP/IP的协议栈提供了一整套的防火墙的规则,所以它可以通过IPTABLES的规则达到比较复杂的隔离逻辑。

Calico架构

组件介绍:

Felix:Calico Agetnt,在K8S集群的每台节点上,主要负责管理和维护该节点上的网络和安全策略,如网络接口管理和监听、路由、ARP管理、ACL管理和同步、状态上报等。
ETCD:分布式键值存储,用来存储网络元数据、安全策略以及节点的状态信息,确保Calico网络状态的一致性和准确性,可以和K8S的etcd何用
BGP Client(BIRD):跟Felix一样,每一个节点上都部署GBP Client,主要吧Felix写入Kernel的路由信息分发到当前Calico网络,确保各节点间的通信的有效性。
BGP Route Reflector(BIRD):在大型网络中,仅仅使用BGP Client形成mesh全网互联的方案会导致规模现在,所有节点之间两辆互联,需要N^2个连接,可使用BGP的Router Reflector的方法,会使用BGP Client仅与特定RR节点互联并做路由同步,从而大大减少连接数,可大规模部署使用。

关键点:

Felix会定期查询Etcd数据库,从而获取到IP变化信息,比如说用户在这台机器上创建了一个容器,增加了一个IP等。当它发现数据变更后,比如用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

Calico三种网络工作模式

IPIP模式

默认网络模式即IPIP模式,在所有节点查看网络,会有tunl0 网卡

分析

ng-deploy-7b7ff4f9bc-d2g65 在node-1-233上,它的IP10.244.154.56
如果10.244.154.56要访问另外一个ng-deploy-7b7ff4f9bc-s27c9,其IP10.244.167.190
它会找路由 10.244.167.128/26 via 192.168.1.231 dev tunl0 proto bird onlink,这条路由对应着node-1-231的节点IP 192.168.1.231,所以它通过这个IP就能找到10.244.167.190

以上可以说明,IPIP模式就是将节点与节点之间建立了一条隧道,并且建立了对应的路由信息,Pod之间通信时只需要知道目标IP所对应的路由就可以直接访问到对应的节点IP,从而达到对方的Pod。

将IPIP改为BGP

# kubectl  get ds -n kube-system
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   4         4         4       4            4           kubernetes.io/os=linux   22d
kube-proxy    4         4         4       4            4           kubernetes.io/os=linux   22d


更新calico-node配置

kubectl edit ds calico-node -n kube-system  #会进入vim编辑模式
搜索下面两行
        - name: CALICO_IPV4POOL_IPIP
          value: Always

在它的下面增加:
        - name: CALICO_AUTODETECTION_METHOD
          value: interface=ens33
          
# kubectl edit ds calico-node -n kube-system
daemonset.apps/calico-node edited

更改ippool,保存即可生效

kubectl edit ippool  #会进入vim编辑模式
搜索ipipMode
将ipipMode: Always 改为 ipipMode: Never

# kubectl edit ippool
ippool.crd.projectcalico.org/default-ipv4-ippool edited

查看ip,会发现四台机器的tunl0都没有IP地址

再查看route 使用BGP面膜是不在显示tunl0

使用ng-deploy 两个Pod,ng-deploy-7b7ff4f9bc-d2g65( 10.244.154.56 )到 ng-deploy-7b7ff4f9bc-s27c9 (10.244.167.190 )时 他的路由是0.244.167.128/26 via 192.168.1.231 dev ens33 proto bird ,不需要借助tunl,可以通过ens33直接访问。

posted @   哈喽哈喽111111  阅读(152)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-11-17 Logstash & 索引生命周期管理(ILM)
2020-11-17 Beats & FileBeat
2016-11-17 企业版 Linux 附加软件包(EPEL)
2016-11-17 centos7系统修改内核
2016-11-17 使用yum update更新文件系统时不更新内核的方法
点击右上角即可分享
微信分享提示