k8s---Calico网络
1 什么是calico?
Calico 是一种开源网络和网络安全解决方案,适用于容器、虚拟机和基于主机的本机工作负载。Calico支持广泛的平台,包括Kubernetes,OpenShift,Mirantis Kubernetes Engine(MKE),OpenStack和裸机服务。无论您选择使用 Calico 的 eBPF 数据平面还是 Linux 的标准网络管道,Calico 都能提供超快的性能和真正的云原生可扩展性。Calico为开发人员和集群运营商提供了一致的体验和功能集,无论是在公共云还是本地运行,在单个节点上运行,还是在数千个节点的集群上运行。
官网:https://docs.tigera.io/calico/latest/about
2 calico主要组件
Felix
calico的核心组件,运行在每个节点上;Felix会监听Etcd中心的存储,从它获取事件;主要的功能有接口管理、路由规则、ACL规则和状态报告.
- 接口管理:Felix为内核编写一些接口信息,以便让内核能正确的处理主机endpoint的流量。特别是主机之间的ARP请求和处理ip转发。
- 路由规则:Felix负责主机之间路由信息写到linux内核的FIB(Forwarding Information Base)转发信息库,保证数据包可以在主机之间相互转发。
- ACL规则:Felix负责将ACL策略写入到linux内核中,保证主机endpoint的为有效流量不能绕过calico的安全措施。
- 状态报告:Felix负责提供关于网络健康状况的数据。特别是,它报告配置主机时出现的错误和问题。这些数据被写入etcd,使其对网络的其他组件和操作人员可见。
[root@master ~]# ps -ef | grep felix
root 2319 2067 0 09:11 ? 00:00:00 runsv felix
root 2328 2319 1 09:11 ? 00:05:47 calico-node -felix
root 110678 80681 0 15:36 pts/1 00:00:00 grep --color=auto felix
Etcd
保证数据一致性的数据库,存储集群中节点的所有路由信息。为保证数据的可靠和容错建议至少三个以上etcd节点。可与kuenetes共用。
BIRD(BGP Client)
BGP客户端,Calico在每个节点上的都会部署一个BGP客户端,它的作用是将Felix的路由信息读入内核,并通过BGP协议在集群中分发。当Felix将路由插入到Linux内核FIB中时,BGP客户端将获取这些路由并将它们分发到部署中的其他节点。这可以确保在部署时有效地路由流量。
[root@master ~]# ps -ef | grep bird | grep -v color
root 2323 2067 0 09:11 ? 00:00:00 runsv bird
root 2324 2067 0 09:11 ? 00:00:00 runsv bird6
root 2503 2323 0 09:11 ? 00:00:08 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
root 2504 2324 0 09:11 ? 00:00:07 bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
BGP Router Reflector
(可选组件)用于较大规模的网络场景;大型网络仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,所有节点需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。
Orchestrator plugin
协调器插件负责允许kubernetes或OpenStack等原生云平台方便管理Calico,可以通过各自的API来配置Calico网络实现无缝集成。如kubernetes的cni网络插件。
3 calico架构图
[root@master ~]# ip a | grep cali
7: caliab9fc67e222@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
8: cali148ad8c4d6e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
4 calico的网络模式
4.1 vxlan、ipip、bgp
模式 | 数据包封包 | 优点 | 缺点 |
---|---|---|---|
vxlan | 封包, 在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac。外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取 | 只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的”二层”互通, 三层即vxlan包封装在udp数据包中, 要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac。 | 需要进行vxlan的数据包封包和解包会存在一定的性能损耗 |
ipip (默认) | 封包,在tunl0设备上将pod发来的数据包的mac层去掉,留下ip层封包。 外层数据包目的ip地址根据路由得到。 | 只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。 | 需要进行ipip的数据包封包和解包会存在一定的性能损耗 |
bgp | 不需要进行数据包封包 | 不用封包解包,通过bgp协议可实现pod网络在主机间的三层可达, k8s节点不跨网段时和flannel的host-gw相似;支持跨网段, 满足复杂的网络架构 | 跨网段时,需要主机网关路由也充当BGP Speaker能够学习到pod子网路由并实现pod子网路由的转发 |
4.2 crosssubnet
- Calico支持两种类型的封装:VXLAN和IP in IP。在某些 IP in IP 不支持的环境中支持 VXLAN(例如 Azure)。VXLAN 的每数据包开销略高,因为标头较大,但除非您运行的是网络密集型工作负载,否则您通常不会注意到差异。两种封装类型之间的另一个小区别是,Calico的VXLAN实现不使用BGP,而Calico的IP in IP实现在Calico节点之间使用BGP。
- 其中:Vxlan模式和ipip模式都可以设置crosssubnet, 即在跨网段的k8s节点的pod间通信时才使用vxlan或ipip进行封包, 同一网段的8s节点的pod间通信则直接使用bgp模式。使用同网段内的k8s节点作为BGP Speaker全互联交换各自的pod子网路由实现互通, 避免封包。
- 官网crosssubnet:https://docs.tigera.io/calico/latest/networking/configuring/vxlan-ipip#configure-ip-in-ip-encapsulation-for-only-cross-subnet-traffic
Configure IP in IP encapsulation for only cross-subnet traffic
IP in IP封装可以选择性地执行,并且仅针对跨越子网边界的流量执行。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-cross-subnet-1
spec:
cidr: 192.168.0.0/16
ipipMode: CrossSubnet
natOutgoing: true
Configure IP in IP encapsulation for all inter workload traffic
Calico将来自启用Calico的主机的所有流量使用IP-in-IP路由到IP池内的所有Calico网络容器和虚拟机
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-1
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
Configure VXLAN encapsulation for only cross subnet traffic
VXLAN封装可以选择性地执行,并且只能针对跨越子网边界的流量执行。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-cross-subnet-1
spec:
cidr: 192.168.0.0/16
vxlanMode: CrossSubnet
natOutgoing: true
Configure VXLAN encapsulation for all inter workload traffic
Calico使用VXLAN将来自启用Calico的主机的所有流量路由到IP池内的所有Calico网络容器和虚拟机
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-1
spec:
cidr: 192.168.0.0/16
vxlanMode: Always
natOutgoing: true
如果仅使用 VXLAN 池,则不需要 BGP 网络。您可以通过自定义清单来禁用 BGP 以减少集群中的moving parts