Calico网络插件
Calico简介
ProjectCalico
◼ 三层的虚拟网络方案
◼ 它把每个节点都当作虚拟路由器(vRouter),把每个节点上的Pod都当作是“节点路由器”后的一个终端设
备并为其分配一个IP地址
◼ 各节点路由器通过BGP(Border Gateway Protocol)协议学习生成路由规则从而实现不同节点上Pod间的互联
互通
Calico在每一个计算节点利用Linux内核实现了一个高效的vRouter(虚拟路由器)进行报文转发,而每
个vRouter通过BGP协议负责把自身所属的节点上运行的Pod资源的IP地址信息基于节点的agent程序
(Felix)直接由vRouter生成路由规则向整个Calico网络内传播
Calico默认使用的网络模型为IPIP
IPIP:通过一个IP报文承载另外一个IP报文的隧道协议
Calico为什么默认使用IPIP网络模型
集群的节点在底层本身都支持BGP协议的,Calico假设集群环境在底层完全不支持BGP,因而构建一个隧道网络模型IPIP
但可以把calico的配置文件下载到本地,修改网络模式,如把IPIP网络模式修改成BGP就可以了
colico网络模型
IPIP:支持vxlan隧道协议
BGP:路由模型(类似于flannel的host-gw模型)
vxlan是如何封装报文的
原始报文在内部封装过程中先被添加一个VXLAN帧头,外部被封装在UDP报头中、使用承载网络的IP、MAC地址作为外层头进行封装,并进行帧首部进行封装
IPIP是如何封装报文的
内部只封装到IP首部上,没有到帧级别,外部也只是封装一个IP首部和一个帧首部
vxlan报文封装与IPIP报文封装结果对比
vxlan内部封装到帧级别,外部封装UDP首部
IPIP没有UDP首部在外部,内部也没有封装帧首部
由此可见,IPIP的开销相对要小一些,安全性相对于vxlan要低的多
calico工作机制
calico不会像flannel一样创建一个虚拟交换机,而是对于任何一个pod,都会创建一对虚拟以太网卡,一端在pod上,另一端直接留在宿主机上,由内核直接管控,不需要加入任何交换机。基于宿主机的内核就能完成宿主机的路由
◼ Calico把Kubernetes集群环境中的每个节点上的Pod所组成的网络视为一个自治系统,各节点也就是各自治系
统的边界网关,它们彼此间通过BGP协议交换路由信息生成路由规则
◼ 考虑到并非所有网络都能支持BGP,以及BGP路由模型要求所有节点必须要位于同一个二层网络,Calico还
支持基于IPIP和VXLAN的叠加网络模型
◼ 类似于Flannel在VXLAN后端中启用DirectRouting时的网络模型,Calico也支持混合使用路由和叠加网络模型,
BGP路由模型用于二层网络的高性能通信,IPIP或VXLAN用于跨子网的节点间(Cross-Subnet)报文转发
配置模型可以是 Cross-Subnet
节点在同一子网中时,跨节点的pod间通讯使用路由模型
节点不在同一子网中时,可以使用IPIP或vxlan使用隧道模型
Calico架构
概括来说,Calico主要由Felix、Orchestrator Plugin、etcd、BIRD和BGP Router Reflector等组件组成
◼ Felix:Calico Agent,运行于每个节点,主要负责维护虚拟接口设备和路由信息
◼ Orchestrator Plugin:编排系统(例如Kubernetes、OpenStack等)用于将Calico整合进行系统中的插件,例如Kubernetes的CNI
◼ etcd:持久存储Calico数据的存储管理系统
◼ BIRD:负责分发路由信息的BGP客户端
◼ BGP Route Reflector:BGP路由反射器,可选组件,用于较大规模的网络场景
下载部署calico网络插件
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O
编辑calico文件,使用192.168.0.0/16网段
vim calico.yaml
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
- name: CALICO_IPV4POOL_BLOCK_SIZE
value: "24"
使用Calico网络插件初始化第一个节点并生成信息
kubeadm init --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=v1.25.3 --pod-network-cidr=192.168.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs
cp /etc/kubeinetes/admin.conf .kube/comfig
kubectl apply -f calico.yaml
根据提示命令把其他master节点和工作节点添加到集群中
查看calico的隧道接口
ip a
tunl0
编排应用
kubectl create deployment demoapp --image ikubernetes/demoapp:v1.0 --replicas=6
ip a
route -n
让两个pod互相通信并抓包查看是基于IPIP的隧道协议报文来实现的
找一个节点作为客户端,一个节点作为服务端,模拟通信
[root@k8s-Master-01 ~]# kubectl run client-$RANDOM --image ikubernetes/admin-box:v1.2 --restart=Never -it --command -- /bin/sh
[root@k8s-Master-01 ~]# kubectl exec -it demoapp-55c5f88dcb-kzfcg -- /bin/sh
[root@demoapp-55c5f88dcb-kzfcg /]#
请求另一节点
[root@demoapp-55c5f88dcb-kzfcg /]# while true; do curl 10.244.4.9; sleep 5; done
去node-02上抓包
使用ip a 查看节点之间网络通信网卡为eth0,抓此网卡上的通讯
[root@k8s-Node-02 ~]#tcpdump -i eth0 -nn host ip地址
会发现可以抓到请求以及响应报文
把IPIP改成其他网络模式
kubectl get ippool
kubectl get ippool default-ipv4-ippool -o yaml
kubectl get ippool default-ipv4-ippool -o yaml > default-ipv4-ippool.yaml
编辑default-ipv4-ippool.yaml文件,修改网络模式,使用BGP模式,在同一子网时使用BGP,跨子网时使用IPIP
vim default-ipv4-ippool.yaml
ipipMode: always改Cross-Subnet
kubectl apply -f default-ipv4-ippool.yaml
查看路由信息
route -n
抓包看是否有变化
进入节点1的pod,去访问节点2的pod,在节点2上进行抓包
[root@k8s-Node-02 ~]#tcpdump -i eth0 -nn tcp port 80
安装calicoctl工具程序,可以实现更多高级功能
在主节点进行下载
curl -L https://github.com/projectcalico/calico/releases/latest/download/calicoctl-linux-amd64 -o calicoctl
cp calicactl /usr/local/bin/
chmod +x /usr/local/bin/
查看版本
calicoctl version
查看命令帮助
calicoctl --help