分享免费的编程资源和教程

网站首页 > 技术教程 正文

「技术干货」k8s学习-calico的默认配置

goqiw 2024-09-08 17:14:13 技术教程 23 ℃ 0 评论


作者/李逸锋


本文主要分析以下几个问题:


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)提供混合云/边缘云场景下云原生应用开发测试、交付、运维一站式服务,帮助企业采用云原生敏捷开发交付方法论,从而提高软件开发人员效率、减少运维成本,加快数字化转型,并最终实现业务创新。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表