作者/李逸锋
本文主要分析以下几个问题:
1.安装calico的默认配置。
2.calico下pod ip分配过程(calico-ipam)。
3.calico下pod间通信过程(bgp mesh下的data path)。
安装calico时的默认配置
k8s集群安装完成后,通过kubectl apply -f calico.yaml(https://docs.projectcalico.org/manifests/tigera-operator.yaml)部署calico资源,主要包括:
1.calico_backend: "bird",默认使用bird构建bgp mesh的全连接网络。
2.ipam.type: calico-ipam,默认使用calico-ipam管理pod ip。
3.CALICO_IPV4POOL_IPIP: always,默认启用ipip。
4.注册crd,bgpconfigurations、bgppeers、blockaffinities、clusterinformations、felixconfigurations、globalnetworkpolicies、globalnetworksets、hostendpoints、ipamblocks、ipamconfigs、ipamhandles、ippools、networkpolicies、networksets,其中常用的有bgpconfigurations、bgppeers、ippools、networkpolicies。
查看当前集群信息如下:
此时calico的架构如下:
calico-kube-controllers负责networkpolicy的实现。
calico-node以daemonset部署,每个节点上跑一个,主要包括3部分felix、bird、confd。
Felix:控制主机的iptables和路由表。
bird:bird是linux提供的一个bgp客户端工具,负责读取felix写入内核的路由信息,与其它节点的bird一起,构建bgp网络。
confd:监听etcd对BGP配置的改动。它还可以修改bird的配置文件,并触发bird重新加载配置文件。
calico如何为pod分配一个ip
创建一个pod时,大致流程如下:
1.kubelet创建pod,调用cri接口。
2.cri调用cni接口,即calico,请求为pod分配ip。
3.calico从默认的ippool中分配一个ip,默认的ippool如下。
pod间的通信
同节点pod通信
此时我们有2个pod都在同一个节点上(cn-hangzhou.i-bp1ezitqhldkymjjhrnq),分别为:demo-1(10.96.42.99),demo-2(10.96.42.116)。
下面分析10.96.42.99 ping 10.96.42.116的数据报文路径:
1.查询pod1的路由表,发现要从eth0接口出去。因为eth0是虚拟网卡对的一端,报文从eth0出去后将转到另一端,即主机的calic5f87b3df21接口(169.254.1.1是一个不存在的ip地址,正常数据包无法转发,通过在calic5f87b3df21接口上开启proxy arp实现)。
2.查询主机的路由表,发现转到10.96.42.116走cali8e5e92fc168接口。
3.cali2b21c42e8e9接口同样是虚拟网卡对的一端,它的另一端是pod demo-2里的eth0。
4.回程报文从pod2转发到pod1过程类似。
不同节点pod通信
此时我们有2个pod在不同节点上:
1.查询pod1的路由表,数据包从pod的eth0接口转到主机的cali2b21c42e8e9接口(同样通过peoxy arp实现)。
2.查询主机1的路由表,发现要从cali2b21c42e8e9接口出去(这是一个ipip的tunnel,由calico-node中的bird维护)。
3.报文经过tunl0封装报文(ipip隧道),从主机1的eth0出去,最终转到主机2上的tunl0。
4.查询主机2上的路由表,发现要转发到pod2(10.96.42.116)需要走calif6b1a0cdc38接口。
5.同样calif6b1a0cdc38是虚拟网卡对的一端,将转发给pod2内的另一端eth0。
6.回程报文从pod2转发到pod1过程类似。
calico的bgp网络
上面分析了calico下的pod的通信过程,可以发现它是一个纯三层的实现方案。节点上的路由条目是通过bgp学习得到的。下面我们分析当前集群的bgp网络结构。
可以看到当前集群使用的是bgp node-to-node mesh的网络拓扑,此时形成的bgp网络如下图:
每个节点上的bird与其它节点上的bird两两互联,形成网状网络。从apiserver wath到的节点与pod的对应关系将转为路由条目,同步到所有节点上。
节点中的每个pod的网卡都作为一个workloadendpoint接入到bgp网络中。
此种bgp node-to-node的模式下并没有很多配置,官方建议当集群节点数>50时,使用bgp RR模式以增加性能。
总结
calico默认使用calico ipam管理pod 的ip,包括ip的分配、回收。
calico是个纯三层的网络方案,默认配置下每个节点上的bird进程将组件成bgp mesh网络,维护每个节点上的路由条目。
参考文档:
https://docs.projectcalico.org/archive/v3.20/networking/configuring(calico)
https://bird.network.cz/get_doc&v=20&f=bird.html#toc5(bird)
https://www.ibm.com/docs/zh/cloud-private/3.2.0topic=ins-calico (calico IBM)
LStack产品简介
面向行业应用开发商(ISV/SI)提供混合云/边缘云场景下云原生应用开发测试、交付、运维一站式服务,帮助企业采用云原生敏捷开发交付方法论,从而提高软件开发人员效率、减少运维成本,加快数字化转型,并最终实现业务创新。
本文暂时没有评论,来添加一个吧(●'◡'●)