从零开始入门 K8s | 理解 CNI 和 CNI 插件

0.png

作者 | 溪恒 阿里巴巴高级技术专家

本文整理自《CNCF x Alibaba 云原生技术公开课》第 26 讲,点击直达课程页面。

关注“阿里巴巴云原生”公众号,回复关键词“入门”,即可下载从零入门 K8s 系列文章 PPT。

导读:网络架构是 K8s 中较为复杂的方面之一。K8s 网络模型本身对某些特定的网络功能有着一定的要求,因此,业界已经有了不少的网络方案来满足特定的环境和要求。CNI 意为容器网络的 API 接口,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,作者将带领大家理解典型网络插件地工作原理、掌握 CNI 插件的使用。

一、CNI 是什么

首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。

它是 K8s 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式,实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。

二、Kubernetes 中如何使用 CNI

K8s 通过 CNI 配置文件来决定使用什么 CNI。

基本的使用方法为:

  1. 首先在每个结点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称;
  2. 安装 CNI 配置文件中所对应的二进制插件;
  3. 在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件;
  4. 上步执行完之后,Pod 的网络就配置完成了。

具体的流程如下图所示:

1.png

在集群里面创建一个 Pod 的时候,首先会通过 apiserver 将 Pod 的配置写入。apiserver 的一些管控组件(比如 Scheduler)会调度到某个具体的节点上去。Kubelet 监听到这个 Pod 的创建之后,会在本地进行一些创建的操作。当执行到创建网络这一步骤时,它首先会读取刚才我们所说的配置目录中的配置文件,配置文件里面会声明所使用的是哪一个插件,然后去执行具体的 CNI 插件的二进制文件,再由 CNI 插件进入 Pod 的网络空间去配置 Pod 的网络。配置完成之后,Kuberlet 也就完成了整个 Pod 的创建过程,这个 Pod 就在线了。

大家可能会觉得上述流程有很多步(比如要对 CNI 配置文件进行配置、安装二进制插件等等),看起来比较复杂。

但如果我们只是作为一个用户去使用 CNI 插件的话就比较简单,因为很多 CNI 插件都已提供了一键安装的能力。以我们常用的 Flannel 为例,如下图所示:只需要我们使用 kubectl apply Flannel 的一个 Deploying 模板,它就能自动地将配置、二进制文件安装到每一个节点上去。

2.png

安装完之后,整个集群的 CNI 插件就安装完成了。

因此,如果我们只是去使用 CNI 插件的话,那么其实很多 CNI 插件已经提供了一键安装的脚本,无需大家关心 Kubernetes 内部是如何配置的以及如何调用 API 的。

三、哪个 CNI 插件适合我

社区有很多的 CNI 插件,比如 Calico, flannel, Terway 等等。那么在一个真正具体的生产环境中,我们要选择哪一个 CNI 插件呢?
 
这就要从 CNI 的几种实现模式说起。我们需要根据不同的场景选择不同的实现模式,再去选择对应的具体某一个插件。

通常来说,CNI 插件可以分为三种:Overlay、路由及 Underlay。

3.png

  • Overlay 模式的典型特征是容器独立于主机的 IP 段,这个 IP 段进行跨主机网络通信时是通过在主机之间创建隧道的方式,将整个容器网段的包全都封装成底层的物理网络中主机之间的包。该方式的好处在于它不依赖于底层网络;
  • 路由模式中主机和容器也分属不同的网段,它与 Overlay 模式的主要区别在于它的跨主机通信是通过路由打通,无需在不同主机之间做一个隧道封包。但路由打通就需要部分依赖于底层网络,比如说要求底层网络有二层可达的一个能力;
  • Underlay 模式中容器和宿主机位于同一层网络,两者拥有相同的地位。容器之间网络的打通主要依靠于底层网络。因此该模式是强依赖于底层能力的。

了解了以上三种常用的实现模式之后,再根据自己的环境、需求判断可由哪一种模式进行实现,再在对应的模式中去找 CNI 插件。不过社区中有那么多插件,它们又都属于哪种模式?如何进行选择呢?怎么挑选适合自己的呢?我们可以从以下 3 个方面来考虑。

4.png

1. 环境限制

不同环境中所支持的底层能力是不同的。

  • 虚拟化环境(例如 OpenStack)中的网络限制较多,比如不允许机器之间直接通过二层协议访问,必须要带有 IP 地址这种三层的才能去做转发,限制某一个机器只能使用某些 IP 等。在这种被做了强限制的底层网络中,只能去选择 Overlay 的插件,常见的有 Flannel-vxlan, Calico-ipip, Weave 等等;
  • 物理机环境中底层网络的限制较少,比如说我们在同一个交换机下面直接做一个二层的通信。对于这种集群环境,我们可以选择 Underlay 或者路由模式的插件。Underlay 意味着我们可以直接在一个物理机上插多个网卡或者是在一些网卡上做硬件虚拟化;路由模式就是依赖于 Linux 的路由协议做一个打通。这样就避免了像 vxlan 的封包方式导致的性能降低。这种环境下我们可选的插件包括 clico-bgp, flannel-hostgw, sriov 等等;
  • 公有云环境也是虚拟化,因此底层限制也会较多。但每个公有云都会考虑适配容器,提升容器的性能,因此每家公有云可能都提供了一些 API 去配置一些额外的网卡或者路由这种能力。在公有云上,我们要尽量选择公有云厂商提供的 CNI 插件以达到兼容性和性能上的最优。比如 Aliyun 就提供了一个高性能的 Terway 插件。

环境限制考虑完之后,我们心中应该都有一些选择了,知道哪些能用、哪些不能用。在这个基础上,我们再去考虑功能上的需求。

2. 功能需求

 

  • 首先是安全需求;

K8s 支持 NetworkPolicy,就是说我们可以通过 NetworkPolicy 的一些规则去支持“Pod 之间是否可以访问”这类策略。但不是每个 CNI 插件都支持 NetworkPolicy 的声明,如果大家有这个需求,可以选择支持 NetworkPolicy 的一些插件,比如 Calico, Weave 等等。

  • 第二个是是否需要集群外的资源与集群内的资源互联互通;

大家的应用最初都是在虚拟机或者物理机上,容器化之后,应用无法一下就完成迁移,因此就需要传统的虚拟机或者物理机能跟容器的 IP 地址互通。为了实现这种互通,就需要两者之间有一些打通的方式或者直接位于同一层。此时可以选择 Underlay 的网络,比如 sriov 这种就是 Pod 和以前的虚拟机或者物理机在同一层。我们也可以使用 calico-bgp,此时它们虽然不在同一网段,但可以通过它去跟原有的路由器做一些 BGP 路由的一个发布,这样也可以打通虚拟机与容器。

  • 最后考虑的就是 K8s 的服务发现与负载均衡的能力

K8s 的服务发现与负载均衡就是我们前面所介绍的 K8s 的 Service,但并不是所有的 CNI 插件都能实现这两种能力。比如很多 Underlay 模式的插件,在 Pod 中的网卡是直接用的 Underlay 的硬件,或者通过硬件虚拟化插到容器中的,这个时候它的流量无法走到宿主机所在的命名空间,因此也无法应用 kube-proxy 在宿主机配置的规则。

这种情况下,插件就无法访问到 K8s 的服务发现。因此大家如果需要服务发现与负载均衡,在选择 Underlay 的插件时就需要注意它们是否支持这两种能力。

经过功能需求的过滤之后,能选的插件就很少了。经过环境限制和功能需求的过滤之后,如果还剩下 3、4 种插件,可以再来考虑性能需求。

3. 性能需求

我们可以从 Pod 的创建速度和 Pod 的网络性能来衡量不同插件的性能。

  • Pod 的创建速度

当我们创建一组 Pod 时,比如业务高峰来了,需要紧急扩容,这时比如说我们扩容了 1000 个 Pod,就需要 CNI 插件创建并配置 1000 个网络资源。Overlay 和路由模式在这种情况下的创建速度是很快的,因为它是在机器里面又做了虚拟化,所以只需要调用内核接口就可以完成这些操作。但对于 Underlay 模式,由于需要创建一些底层的网络资源,所以整个 Pod 的创建速度相对会慢一些。因此对于经常需要紧急扩容或者创建大批量的 Pod 这些场景,我们应该尽量选择 Overlay 或者路由模式的网络插件。

  • Pod 的网络性能

主要表现在两个 Pod 之间的网络转发、网络带宽、PPS 延迟等这些性能指标上。Overlay 模式的性能较差,因为它在节点上又做了一层虚拟化,还需要去封包,封包又会带来一些包头的损失、CPU 的消耗等,如果大家对网络性能的要求比较高,比如说机器学习、大数据这些场景就不适合使用 Overlay 模式。这种情形下我们通常选择 Underlay 或者路由模式的 CNI 插件。

相信大家通过这三步的挑选之后都能找到适合自己的网络插件。

四、如何开发自己的 CNI 插件

有时社区的插件无法满足自己的需求,比如在阿里云上只能使用 vxlan 这种 Overlay 的插件,而 Overlay 插件的性能相对较差,无法满足阿里云上的一些业务需求,所以阿里云上开发了一个 Terway 的插件。

如果我们自己的环境比较特殊,在社区里面又找不到合适的网络插件,此时可以开发一个自己的 CNI 插件。

CNI 插件的实现通常包含两个部分:

  1. 一个二进制的 CNI 插件去配置 Pod 网卡和 IP 地址。这一步配置完成之后相当于给 Pod 上插上了一条网线,就是说它已经有自己的 IP、有自己的网卡了;
  2. 一个 Daemon 进程去管理 Pod 之间的网络打通。这一步相当于说将 Pod 真正连上网络,让 Pod 之间能够互相通信。

给 Pod 插上网线

那么如何实现第一步,给 Pod 插上网线呢?通常是这样一个步骤:

5.png

1. 给 Pod 准备一个网卡

通常我们会用一个 "veth" 这种虚拟网卡,一端放到 Pod 的网络空间,一端放到主机的网络空间,这样就实现了 Pod 与主机这两个命名空间的打通。

2. 给 Pod 分配 IP 地址

这个 IP 地址有一个要求,我们在之前介绍网络的时候也有提到,就是说这个 IP 地址在集群里需要是唯一的。如何保障集群里面给 Pod 分配的是个唯一的 IP 地址呢?

一般来说我们在创建整个集群的时候会指定 Pod 的一个大网段,按照每个节点去分配一个 Node 网段。比如说上图右侧创建的是一个 172.16 的网段,我们再按照每个节点去分配一个 /24 的段,这样就能保障每个节点上的地址是互不冲突的。然后每个 Pod 再从一个具体的节点上的网段中再去顺序分配具体的 IP 地址,比如 Pod1 分配到了 172.16.0.1,Pod2 分配到了 172.16.0.2,这样就实现了在节点里面 IP 地址分配的不冲突,并且不同的 Node 又分属不同的网段,因此不会冲突。

这样就给 Pod 分配了集群里面一个唯一的 IP 地址。

3. 配置 Pod 的 IP 和路由

  • 第一步,将分配到的 IP 地址配置给 Pod 的虚拟网卡;
  • 第二步,在 Pod 的网卡上配置集群网段的路由,令访问的流量都走到对应的 Pod 网卡上去,并且也会配置默认路由的网段到这个网卡上,也就是说走公网的流量也会走到这个网卡上进行路由;
  • 最后在宿主机上配置到 Pod 的 IP 地址的路由,指向到宿主机对端 veth1 这个虚拟网卡上。这样实现的是从 Pod 能够到宿主机上进行路由出去的,同时也实现了在宿主机上访问到 Pod 的 IP 地址也能路由到对应的 Pod 的网卡所对应的对端上去。

给 Pod 连上网络

刚才我们是给 Pod 插上网线,也就是给它配了 IP 地址以及路由表。那怎么打通 Pod 之间的通信呢?也就是让每一个 Pod 的 IP 地址在集群里面都能被访问到。

一般我们是在 CNI Daemon 进程中去做这些网络打通的事情。通常来说是这样一个步骤:

  • 首先 CNI 在每个节点上运行的 Daemon 进程会学习到集群所有 Pod 的 IP 地址及其所在节点信息。学习的方式通常是通过监听 K8s APIServer,拿到现有 Pod 的 IP 地址以及节点,并且新的节点和新的 Pod 的创建的时候也能通知到每个 Daemon;
  • 拿到 Pod 以及 Node 的相关信息之后,再去配置网络进行打通。

    • 首先 Daemon 会创建到整个集群所有节点的通道。这里的通道是个抽象概念,具体实现一般是通过 Overlay 隧道、阿里云上的 VPC 路由表、或者是自己机房里的 BGP 路由完成的;
    • 第二步是将所有 Pod 的 IP 地址跟上一步创建的通道关联起来。关联也是个抽象概念,具体的实现通常是通过 Linux 路由、fdb 转发表或者OVS 流表等完成的。Linux 路由可以设定某一个 IP 地址路由到哪个节点上去。fdb 转发表是 forwarding database 的缩写,就是把某个 Pod 的 IP 转发到某一个节点的隧道端点上去(Overlay 网络)。OVS 流表是由 Open vSwitch 实现的,它可以把 Pod 的 IP 转发到对应的节点上。

六、本文总结

本文的主要内容就到此为止了,这里为大家简单总结一下:

  1. 在我们自己的环境中搭建一个 K8s 集群,应当如何选择最适合自己的网络插件?
  2. 当社区网络插件不能满足时,如何开发自己的网络插件?

2群直播海报.png

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老码农:这段代码绝了,切勿模仿!

作为一名老码农,我的心这次凉透了!事情起因很简单:我在某Hub上浏览时候,发现这样的一条信息:Python 超过 C、JS 薪酬排行第一(最大招聘网站Indeed.com数据)噗,996刚下班的我&#xf…

揭秘 RocketMQ 新特性以及在金融场景下的实践

2019 年末, RocketMQ 正式发布了 4.6.0 版本,增加了“ Request-Reply ”的同步调用的新特性。“ Request-Reply ”这个新特性是由微众银行的开发者们总结实践经验,并反馈给社区的。接下来本文会详细介绍此新特性。 “ Request-Reply ”是什么…

docker 安装部署 Jenkins 2.322

文章目录一、镜像容器1. 安装docker2. 镜像搜索3. 远程拉取镜像4. 创建挂载目录5. 修改权限6. 启动容器二、配置修改2.1. 镜像地址2.2. 核查url2.3. 重启容器2.4. 效果访问2.5. 密码获取2.6. 插件选择2.7. 创建用户2.8. 核查URL一、镜像容器 1. 安装docker yum install docke…

闲鱼的云原生故事:靠什么支撑起万亿的交易规模?

来源 | 阿里巴巴中间件作者 | 王树彬,阿里巴巴闲鱼架构负责人责编 | Carol2014年6月28日,阿里即将赴美上市的这一年,西溪园区的一个茶水间里,28个人日夜赶工了三个月后,上线了一个闲置交易平台——闲鱼。今年5月份&…

Kubernetes operator 模式开发实践

0. 前言 近日我们在开发符合我们业务自身需求的微服务平台时,使用了 Kubernetes 的 Operator Pattern 来实现其中的运维系统,在本文,我们将实现过程中积累的主要知识点和技术细节做了一个整理。 读者在阅读完本文之后,会对 Oper…

Jenkins 2.322 安装 自定义插件

文章目录Jenkins自定义安装插件1. Rebuilder2. Safe Restart3. Artifactory4. Build Timeout5. Credentials Binding6. Email Extension7. Git8. Pipeline9. SonarQube Scanner10. SSH Build Agents11. Workspace Cleanup12. TimestamperJenkins自定义安装插件 在jenkins管理页…

从国际站 - M 站建设谈开发者产品思维

前言 作为一个开发者我们在持续不断地交付我们负责的需求,可我们很少从产品的角度来看待我们交付的需求,比方说一直被强调的需求类型、需求价值、需求目标。作为产品需要具备的能力:看到用户、倾听用户、判断用户、与用户连接、在用户的交互…

2020人工智能应用挑战赛前瞻 | 专家委员会强大阵容,震撼发布!

截止2019年8月份全国344所高校已经开办、正在开办、即将开办人工智能方向相关专业。还记得当时浙江大学在新增机器人工程和人工智能两个超级热门专业时,不仅引起国内教育界的讨论,国外媒体也争相报道。其中日本《日经亚洲评论》认为,中国教育…

超18万人次下载使用的 Cloud Toolkit 的成长历程

在文章的开始,先介绍一下 Cloud Toolkit 是什么? Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端&#xff0…

新华智云基于MaxCompute建设媒体大数据开放平台

摘要:随着自媒体的发展,传统媒体面临着巨大的压力和挑战,新华智云运用大数据和人工智能技术,致力于为媒体行业赋能。通过媒体大数据开放平台,将媒体行业全网数据汇总起来,借助平台数据处理能力和算法能力&a…

docker Gitlab14.5.0 初始化账号以及密码是什么呢?

文章目录1. 进入容器2. 进入bin目录3. 执行命令4. 执行命令5. 修改密码6. 确认密码7. 保存修改8. 操作记录(全)9. 操作截图(全)这时,gitlab已经跑起来了,通过浏览器能正常访问了,那么问题来了&a…

坦白讲!90%的数据分析师都不合格!!

你还要在家待多久,之前托人给你找的工作你也不去,你到底想干什么呀!”大明的女友又开始了每日的说教,大明漠然的关上了门,隔绝了声音。大明是一名技术开发工程师,不知道这是第几次和女友的争吵了&#xff0…

“新基建”提速,工业互联网大数据发展迎新机遇

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 近期,中央政治局密集召开会议研究新冠肺炎疫情防控工作,部署统筹做好疫情防控和经济社会发展工作&…

MQ java.lang.OutOfMemoryError: unable to create new native thread

文章目录1. 问题现象2. 分析定位3. 解决方案4. 结果验证5. 总结1. 问题现象 java.lang.OutOfMemoryError: unable to create new native thread 2. 分析定位 生产上所有程序都是在jboss账户下运行,于是查看该账户下所有的线程数总和为950,也即是说&am…

多所高校内使用AI监控并追踪学生行为惹争议!

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 据华尔街日报报道,在美国各地大学校园之中,越来越多的技术开始用于集中监视、追踪和管理学生。 学校…

Kubernetes 并非灵丹妙药...

作者 | Alex Hewson译者 | 弯月,责编 | 郑丽媛头图 | CSDN 下载自视觉中国出品 | CSDN(ID:CSDNnews)以下为译文:我经常听到有人问这样一个问题:“我们应该将自家的技术栈托管到Kubernetes上吗?”…

云栖号在线课堂—云服务器数据库快速入门特辑

目前阿里云为用户提供丰富的云服务器ECS产品,不同系列ECS之间存在较大差异,选择合适的ECS,是业务起飞的第一步!除了基础的ECS产品选型和技术揭秘,还有阿里专家分享的ECS迁云工具轻松上云最佳实践、ECS弹性伸缩最佳实践…

Docker Nacos Mysql集群

文章目录一、基础准备1. 节点总览2. 安装docker3. 安装MySQL二、节点部署2.1. 拉取镜像2.2. 节点12.3. 节点22.4. 节点32.5. 搭建完成一、基础准备 1. 节点总览 IP端口用途192.168.159.1338848mysql nacos192.168.159.1338858nacos192.168.159.1338868nacos 我这里是用一台云…

鼠标悬停 显示遮罩层

HTML部分: css部分: .smallbox {width: 100%;.card {position: relative;top: 0;left: 0;width: 224px;height: 302px;margin-right: 70px;overflow: hidden;img {width: 224px;height: 302px;margin-right: 70px;}.message {position: absolute;// bottom: 0;left: 0;right: …

AI技术的“践行者” — 云测试成为企业降本增效利器

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 目前,人工智能技术对于加速企业数字化转型、提高信息利用效率等方面都起着重大作用。 尤其在提升社会劳动生产率…