10 张图解 K8S CNI Calico 网络模型原理与功能实战

news/2024/7/5 4:46:44

一、概述

Calico 是一个联网和网络策略供应商。Calico 支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带 BGP。Calico 使用相同的引擎为主机、Pod 和(如果使用 Istio 和 Envoy)应用程序在服务网格层执行网络策略。Calico 以其性能、灵活性而闻名。Calico 的功能更为全面,更为复杂。它不仅提供主机和 pod 之间的网络连接,还涉及网络安全和管理。Calico CNI 插件在 CNI(container network interface)框架内封装了 Calico 的功能。

GitHub 地址:

https://github.com/projectcalico/calico

官方文档:

https://projectcalico.docs.tigera.io/about/about-calico

其它 CNI 插件,可以查看 k8s 官网:

https://kubernetes.io/docs/concepts/cluster-administration/addons/

二、Calico 架构和核心组件

Calico不使用重叠网络比如 flannel 和 libnetwork 重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心;Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息像整个 Calico 网络内传播——小规模部署可以直接互联,大规模下可通过指定的 BGP route reflector 来完成。

Calico 的核心组件:

  • Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。

  • etcd:分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性,可以与 kubernetes 共用;

  • BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,使用 BIRD 实现,BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议比如 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。

  • BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

三、什么是 BGP?

边界网关协议(BGP是运行于 TCP 上的一种自治系统的路由协议,也是互联网上一个核心的去中心化自治路由协议。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓朴图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。

  • BGP 是路由器之间的通信协议,主要用于 AS(AutonomousSystem,自治系统)之间的互联。

  • AS 内部有多个 BGP speaker,分为 ibgp、ebgp,ebgp 与其它 AS 中的 ebgp 建立 BGP 连接。

  • AS 内部的 BGP speaker 通过 BGP 协议交换路由信息,最终每一个 BGP speaker 拥有整个 AS 的路由信

可以把 calico 中的 node 节点当成一个 AS,而 node 节点中的容器是 AS 中的 router,calico 通过 BGP 解析,将整个网络中容器地址的路由表绘制出来。

  • IBGP(Internal BGP):当 BGP 运行于同一自治系统内部时,被称为IBGP

  • EBGP(External BGP):当 BGP 运行于不同自治系统之间时,称为EBGP

BGP 两种模式:

  • 全互联模式(node-to-node mesh):全互联模式,每一个 BGP Speaker 都需要和其他 BGP Speaker 建立 BGP 连接,这样 BGP 连接总数就是 N^2,如果数量过大会消耗大量连接。如果集群数量超过 100 台官方不建议使用此种模式。
  • 路由反射模式Router Reflection(RR):RR 模式中会指定一个或多个 BGP Speaker 为 RouterReflection,它与网络中其他 Speaker 建立连接,每个 Speaker 只要与 Router Reflection 建立 BGP 就可以获得全网的路由信息。在 calico 中可以通过 Global Peer 实现 RR 模式。

三、Calico 两种网络模式

1)IPIP 模式

  • 从字面来理解,就是把一个 IP 数据包又套在一个 IP 包里,即把 IP 层封装到 IP 层的一个 tunnel,看起来似乎是浪费,实则不然。

  • 它的作用其实基本上就相当于一个基于 IP 层的网桥!

  • 一般来说,普通的网桥是基于 mac 层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。

  • ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。

Calico 的 IPIP 模式工作原理如下图: 

Calico 使用的这个 tunl0 设备,是一个 IP 隧道(IP tunnel)设备

在上面的例子中,IP 包进入 IP 隧道设备之后,就会被 Linux 内核的 IPIP 驱动接管。IPIP 驱动会将这个 IP包直接封装在一个宿主机网络的 IP 包中,如下所示:

2)BGP 模式

  • 边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。

  • 它通过维护 IP 路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。

  • BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。

  • BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单 IP,BGP 机房的优点:服务器只需要设置一个 IP 地址,最佳访问路由是

    由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。

  • BGP 网络相比较 IPIP 网络,最大的不同之处就是没有了隧道设备 tunl0。前面介绍过 IPIP 网络 pod 之间的流量 发送 tunl0,然后 tunl0 发送对端设备。BGP 网络中,pod 之间的流量直接从网卡发送目的地,减少了 tunl0 这个环节。

四、安装 Calico 插件

1)通过 helm 安装 Calico

官方文档:

https://projectcalico.docs.tigera.io/getting-started/kubernetes/helm

# 添加源
helm repo add projectcalico https://projectcalico.docs.tigera.io/charts

# helm repo update

# 下载
helm pull  projectcalico/tigera-operator --version v3.24.5
# 解压
tar -xf tigera-operator-v3.24.5.tgz

# 安装,默认命名空间:calico-system
helm install calico ./tigera-operator  --namespace tigera-operator --create-namespace

# 检查tigera-operator所有资源
kubectl get all -n tigera-operator

2)通过 yaml 文件安装

wget https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f calico.yaml

# 查看
kubectl get all -n kube-system|grep calico

3)k8s flannel 网络切换 calico

1、卸载 flannel 插件

### 1、查看已安装flannel信息
cat /etc/cni/net.d/10-flannel.conflist

### 2、删除flannel布署资源
kubectl delete -f kube-flannel.yml

### 3、清除flannel遗留信息,在集群各节点清理flannel网络的残留文件
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni
rm -rf /etc/cni/net.d

2、开始安装 Calico 插件

# 下载
wget https://docs.projectcalico.org/manifests/calico.yaml

# 安装
kubectl apply -f calico.yaml

# 查看
kubectl get all -n kube-system|grep calico

# 如果节点NotReady,重启以下容器或者kubelet试试
systemctl restart containerd docker


http://lihuaxi.xjx100.cn/news/173672.html

相关文章

vue.js毕业设计,基于vue.js前后端分离外卖点餐系统设计与实现(H5移动项目)

功能介绍 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…

SpringBoot中如何获取request对象呢?

转自: SpringBoot中如何获取request对象呢? 下文笔者讲述SpringBoot中获取Request对象的方法分享,如下所示 Request对象简介 Request对象中封装了客户端的请求信息包含请求头,请求体及其它的请求信息 那么如何在SpringBoot中获取这一重要信息呢&…

点击化学FAM荧光素:6-FAM-alkyne,FAM alkyne 6-isomer,6-炔基-羧基荧光素

【中文名称】6-炔基-羧基荧光素 【英文名称】 FAM alkyne,6-isomer,6-FAM-alkyne 【CAS】478801-49-9 【分子式】C24H15NO6 【分子量】413.39 【纯度标准】95% 【包装规格】25mg,50mg,100mg 【是否接受定制】可进行定制,定制时间周…

华为云RDS数据库测评:性能超出预期,双11优惠还在继续

一、前言 作为一名电商行业公司的员工,深刻体会到系统大压力、高并发下保证服务的正常使用是多么严峻的挑战。双11这段时间,因为激增的使用量让我们的数据库服务严重吃紧,压力特别的大,甚至还出现了交易漏单,脏数据等…

Hive 3.1.3

1.下载安装包 Index of /hive/hive-3.1.3https://dlcdn.apache.org/hive/hive-3.1.3/ 2.安装&修改配置文件 2.1 安装MySQL a. 搜索centos7默认的mariadb & 卸载 [root@node1 ~]# rpm -qa | grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 卸载 [r…

你也还在找程序员外包平台吗?有这几个就足够了!

大家都知道,如果程序员想在工作之余赚一点外快的话,接外包是所有兼职赚钱之中来钱比较快的一种。但是要找到一些比较靠谱的,能够经常使用的接外包平台,似乎是一件费时又费力的事情。 接下来就为大家推荐几个比较好的程序员接外包的…

MySQL数据库期末考试试题及参考答案(09)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 一、 填空题 MySQL提供的____命令可以将数据库导出成SQL脚本,以实现数据的备份。mysqldump命令备份多个数据库时,数据库名称之间用____隔开。MySQL中…

狂神的MySQL(1)

01、什么是数据库,为什么要学习数据库 javaEE:企业级java开发 Web 前端(页面:展示,数据!) 后台(连接点:连接数据库JDBC,连接前端(控制&#xf…