K8S CNI

OCI概念

OCIOpen Container Initiative,开放容器标准,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。

OCI 项目由 DockerCoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业中的其他领导者在 2015 6 月的时候启动。

  • runc: OCI默认实现,在资源效率和标准通用方面最强,但是在安全隔离方面却最弱
  • kata:更加强调安全
  • gvisor: gVisor 通过拦截所有从应用到主机内核的系统调用,并使用用户空间中 gVisor 的内核实现来处理这些调用
  • rkt: 弃用
  • crunRedhat 领导的 OCI 实现,它是由 C 开发的,性能好且轻量级

Open Container Initiative - Open Container Initiative

Runtime spec: GitHub - opencontainers/runtime-spec: OCI Runtime Specification

Image spec: GitHub - opencontainers/image-spec: OCI Image Format

Distribution spec: GitHub - opencontainers/distribution-spec: OCI Distribution Specification

Tools implemented OCI

opencontainers/runc

kata-containers/runtime

google/gvisor

github.com/rkt/rkt

github.com/containers/crun

OCI运行时环境

runc: 容器的低级运行时,OCI的默认实现,

CONTAINER_ID=$(docker create busybox:latest)
docker export -o busybox.tar ${CONTAINER_ID}
mkdir rootfs
tar -xf busybox.tar -C rootfs
runc spec
sudo runc run test
# top

containerd: 容器的高级运行时,runc的封装,

runc 是只是一个命令行工具,containerd_是一个长期居住守护进程。containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性,containerd 可以负责干下面这些事情:

 管理容器的生命周期(从创建容器到销毁容器)
 拉取 / 推送容器镜像
 存储管理(管理镜像及容器数据的存储)
 调用 runc 运行容器(与 runc 等容器运行时交互)
 管理容器网络接口及网络
sudo ctr images list
sudo ctr images pull docker.io/library/busybox:latest
sudo ctr containers list
sudo ctr run -t --net-host docker.io/library/busybox:latest test
# ping 10.67.126.18
sudo ctr container delete test

Runc和OCI在整个K8S体系架构中的位置,

早期: kubelet --> docker-manager --> docker

中期: kubelet -CRI-> docker-shim --> docker --> containerd --> runc

中期: kubelet -CRI-> cri-containerd --> containerd --> runc

当前: kubelet -CRI-> containerd(CRI plugin) --> runc

当前: kubelet -CRI-> cri-o --> runc

CNI介绍

CNI (Container Network Interface), a Cloud Native Computing Foundation project, consists of a specification and libraries for writing plugins to configure network interfaces in Linux containers, along with a number of supported plugins.

As well as the specification , the CNI repository contains the Go source code of a library for integrating CNI into applications and an example command-line tool for executing CNI plugins. A separate repository contains reference plugins and a template for making new plugins.

CNI Responsibilities

Pod IP address management

Pod-2-pod communication within a node

Pod-2-pod communication cross nodes

CNI SPEC

A configuration file (/etc/cni/net.d/)

CRI invokes CNI plugin binary file (/opt/cni/bin/)

Plugin do some operations and return an IP for container

创建一个Pod的流程

其中,在 “Invoke CNI plugin”阶段,会进入到下面的程序调用,

github.com/containerd/containerd
sandbox_run.go
func (c *criService) RunPodSandbox......if err := c.setupPodNetwork(ctx, &sandbox); err != nil { ->func (c *criService) setupPodNetwork......result, err = netPlugin.SetupSerially(ctx, id, path, opts...) ->cni.go
func (c *libcni) SetupSerially(ctx context.Context, id string......result, err := c.attachNetworksSerially(ctx, ns) ->func (c *libcni) attachNetworksSerially...r, err := network.Attach(ctx, ns) ->namespace.go
func (n *Network) Attach(ctx context.Context, ns *Namespace) (*types100.Result, error) {r, err := n.cni.AddNetworkList(ctx, n.config, ns.config(n.ifName)) ->api.go
func (c *CNIConfig) AddNetworkList…result, err = c.addNetwork(ctx, list.Name, list.CNIVersion, net, result, rt) ->func (c *CNIConfig) addNetwork(ctx context.Context, name, cniVersion return invoke.ExecPluginWithResult(ctx, pluginPath, newConf.Bytes, c.args("ADD", rt), c.exec) ->exec.go
func ExecPluginWithResult(ctx context.Context... ->...stdoutBytes, err := exec.ExecPlugin(ctx, pluginPath, netconf, args.AsEnv()) ->raw_exec.go
func (e *RawExec) ExecPlugin(ctx context.Context,...c := exec.CommandContext(ctx, pluginPath)

Sandbox

K8S在创建任何一个Pod的时候都会先创建一个sandbox容器,或者pause容器,起到一个占位的目的,这个Pod中的其它容器会共享pause容器中的网络和存储资源,

config_unix.go -> "sandboxImage": "registry.k8s.io/pause:3.8“

https://github.com/kubernetes/kubernetes/blob/master/build/pause/linux/pause.c

Cnitool

Cnitool是一个用于CNI开发和测试的工具,

https://github.com/containernetworking/cni/blob/main/cnitool/cnitool.go

sudo su –
mkdir cnitool && cd cnitool
go install github.com/containernetworking/cni/cnitool@latest
git clone https://github.com/containernetworking/plugins.git
cd plugins
./build_linux.sh
echo '{"cniVersion":"0.4.0","name":"myptp","type":"ptp","ipMasq":true,"ipam":{"type":"host-local","subnet":"172.16.29.0/24","routes":[{"dst":"0.0.0.0/0"}]}}' | sudo tee /etc/cni/net.d/10-myptp.confip netns add testing
ip netns add testing2
CNI_PATH=./bin cnitool add myptp /var/run/netns/testing
CNI_PATH=./bin cnitool add myptp /var/run/netns/testing2
ip -n testing addr
ip -n testing2 addr
ip netns exec testing ping <testing2 IP>
ip netns exec testing2 ping <testing IP>CNI_PATH=./bin cnitool del myptp /var/run/netns/testing
CNI_PATH=./bin cnitool del myptp /var/run/netns/testing2
ip netns del testing
ip netns del testing2

常见CNI插件

Flannel: The basic CNI, high performance, but not support security related features

Calico:  High performance, support security features

Weave: Mesh overlay between all nodes, fast datapath, support security features

Cilium: Use eBPF to support advanced network features, support security features, resource usage is high

The Ultimate Guide To Using Calico, Flannel, Weave and Cilium - Platform9

https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-august-2020-6e1b757b9e49

Flannel

Flannel Kubernetes 集群的所有节点上运行一个简单的覆盖网络。 它在第 3 层( OSI 网络模型的网络层)提供网络。

Flannel 支持 VXLAN 作为其默认后端,但你也可以将其配置为使用 UDP host-gw。**AWS VPCAliVPCIPIP IPSec 等一些实验性后端也可用,但目前尚未得到官方支持。

Flannel 的缺点之一是缺乏高级功能,例如配置网络策略和防火墙的能力。因此 Flannel Kubernetes 集群网络的一个很好的入门级选择,但是,如果你正在寻找高级网络功能,你可能需要考虑其他 CNI 选项,例如 Calico

Calico

Flannel 一样,Calico OSI 模型的第 3 层上运行,并使用 BGP 协议在其默认配置中的节点之间移动网络数据包,并使用 IP in IP 进行封装。使用 BGPCalico 可以本地定向数据包,而无需将它们包装在额外的封装层中。

Calico 最有价值的特性是它对网络策略的支持。通过定义和执行网络策略,你可以规定哪些 pod 可以发送和接收流量并管理网络内的安全性

Weave

Weave Kubernetes 集群的所有节点之间创建一个网格覆盖,并将其与每个节点上的路由组件结合使用,以在整个集群中动态路由流量。默认情况下,Weave 使用快速数据路径方法路由数据包,该方法尝试沿最短路径在节点之间发送流量。该网络不断分析交通流量并优化路线。如果快速数据路径发生故障,则称为***sleeve***数据包转发的较慢网络方法是备用方法 。

Cilium

Cilium 可以为大规模部署提供优势,并利用 eBPF 来提高可观察性和网络管理效率。Cilium 仍然是一个年轻的项目,在下面引用的基准测试中,它似乎确实更耗费资源。

网桥/veth-pair

网桥可以理解为Linux上的一个虚拟交换机,可以连接不用的veth-pair,起到转发数据包的作用。

Veth-pair类似一根网线,可以连接不同的network space,让不同的ns通信。

Veth-pair的一端可以连接到kernel ns,但在kernel ns中需要一个路由才能进入到veth-pair的另一端。

下面演示不同的ns通过网桥可以相互ping通对方,

brctl addbr br0
ip link set br0 up
ip netns add ns1
ip netns add ns2
ip link add veth1-ns type veth peer name veth1-br
ip link add veth2-ns type veth peer name veth2-br
ip link set veth1-ns netns ns1
ip link set veth2-ns netns ns2
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set veth1-ns up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1-ns
ip netns exec ns2 ip link set lo up
ip netns exec ns2 ip link set veth2-ns up
ip netns exec ns2 ip addr add 10.0.0.3/24 dev veth2-ns
ip link set veth1-br up
ip link set veth2-br up
brctl addif br0 veth1-br
brctl addif br0 veth2-brbrctl show
ip netns list
ip netns exec ns1 ifconfig
ip netns exec ns2 ifconfigip netns exec ns1 ping 10.0.0.3
ip netns exec ns2 ping 10.0.0.2ifconfig br0 down
brctl delbr br0
ip link delete veth1-br
ip link delete veth2-br
ip netns del ns1
ip netns del ns2

如何实现一个CNI

CNI要解决的问题有,

  • IP地址管理
  • Node内不同Pod的通信
  • 不同Node上Pod的通信

IP地址管理需要考虑的事情是如何保证不同Node上为Pod分配的IP地址不会冲突,以及如何全局统一来协调。通常这里需要用到etcd数据库,保存全局的IP地址分配的配置。

Node内不同的Pod通信,可以考虑使用网桥+ethpair。

不同的Node上Pod的通信比较复杂,如果Node在同一子网,可以考虑最简单的静态路由的方案,也就是underlay网络,或者基于静态路由的BGP方案。如果Node不在同一子网,需要考虑overlay的网络方案,例如IPIP,vxlan等。

按照CNI规范,实现一个CNI需要创建一个配置文件用以描述CNI plugin,以及一个二进制的plugin可执行文件。这里我们实现一个基于静态路由的SimpleCNI,

CNI plugin配置文件参考下面:

root@rxxxx:/etc/cni/net.d# cat simplecni.conf
{"cniVersion": "0.3.0","name": "simplecni","type": "simplecni","bridge": "simplecni0","subnet": "10.244.0.0/16"
}

Plugin可执行文件参考以下模板,编译好simplecni以后,需要将binary放到以下位置:/opt/cni/bin/simplecni,

https://github.com/containernetworking/plugins/blob/main/plugins/main/bridge/bridge.go

为了简化IPAM的管理,这里没有使用etcd数据库,而是在每个node上创建了一个配置文件,ipam.config,用于IP地址的管理和分配,

root@xxx:/etc/cni# cat ipam.config
{"Subnet":"10.244.1.0","SubnetPrefix":"10.244.1.","Gateway":"10.244.1.1","IPIndex":“1"}

由于SimpleCNI基于静态路由,所以需要手动在不同的Node上配置类似下面的路由规则以实现不同Node上的Pos间的相互通信,

# On node1
ip route add 10.244.2.0/24 via 192.168.2.1 dev eth1# On node2
ip route add 10.244.1.0/24 via 192.168.1.1 dev eth1

SimpleCNI代码参考:K8S-Related/SimpleCNI at main · wangxiaohui2015/K8S-Related (github.com)

IPIP

IP in IP可用于跨子网的Node上Pod与Pod的通信,基本原理是将Pod与Pod通信的IP层数据包封装到Node上IP数据包的payload部分,通过Node的IP层进行通信。使用IPIP后,会在OS上创建一个tunl0的设备,用于IPIP协议的解析,数据包的封装和解封,OS Kernel本身支持IPIP协议。参考:

一文明白calico的IPIP网络模式 - 知乎

VXLan 

VXLan是另一种overlay技术,其将内层层2的数据包,封装包外层UDP里面,以实现虚拟数据链路层技术。

参考:flannel使用的vxlan和calico使用的IPIP对比 - 知乎

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

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

相关文章

AI智慧校园电子班牌云平台源码

目录 家长端 学校端 电子围栏 亲情通话 课堂答题 移动化管理模式 统一资源管理平台 模板内容智能更换 家校互联 家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等。 学校端 课堂秩序管理:提高教…

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…

3D地图在BI大屏中的应用实践

前言 随着商业智能的不断发展&#xff0c;数据可视化已成为一项重要工具&#xff0c;有助于用户更好地理解数据和分析结果。其中&#xff0c;3D地图作为一种可视化工具&#xff0c;已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合&#xff0c;以更加直观…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

嵌入式学习第二十七天!(TCP并发模型)

TCP并发模型&#xff1a; 1. TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够实现的并发量比较有限。 2. IO模型&#xff1a; 1. 阻塞IO&#xff1a; 没有数据到来时&#xff0c;可以让任务挂起&#xff0c;节省CPU资源开销&#xff0c;提…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络&#xff08;内网&#xff09;和外部网络&#xff08;外网&#xff09;之间传输文件的过程。这在企业环境中尤其常见&#xff0c;因为内部网络通常包含敏感数据&#xff0c;而外部网络&#xff08;如互联网&#xff09;则允许更广泛的访…

Apache zookeeper kafka 开启SASL安全认证

背景&#xff1a;我之前安装的kafka没有开启安全鉴权&#xff0c;在没有任何凭证的情况下都可以访问kafka。搜了一圈资料&#xff0c;发现有关于sasl、acl相关的&#xff0c;准备试试。 简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发…

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

k8s的pod和svc相互访问时网络链路解析

k8s的pod和svc相互访问时网络链路解析 1. k8s环境中pod相互访问1.1. k8s中pod相互访问的整体流程1.2. k8s的相同机器的不同pod相互访问1.3. k8s的不同机器的不同pod相互访问 2. k8s访问svc2.1 nat操作2.2 流量进入到后端pod 3. 疑问和思考3.1 访问pod相互访问为什么不用做nat?…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建MindSpore知识库

InternLM 模型部署 准备环境 拷贝环境 /root/share/install_conda_env_internlm_base.sh InternLM 激活环境 conda activate InternLM 安装依赖 # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install…

数据结构之单链表

目录 1.问题引入 2.主题介绍 2.1链表的概念和结构 2.2链表的分类 2.3单链表的实现 2.3.1接口实现 2.3.2函数实现 2.3.3函数测试 3.小结 halo&#xff0c;又和大家见面了&#xff0c;今天要给大家分享的是单链表的知识&#xff0c;跟着我的脚步&#xff0c;包学包会哦~ …

中电金信:技术实践|Flink维度表关联方案解析

导语&#xff1a;Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架&#xff0c;主要用来处理流式数据。它既可以处理有界的批量数据集&#xff0c;也可以处理无界的实时流数据&#xff0c;为批处理和流处理提供了统一编程模型。 维度表可以看作是用户来分析数…

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…

精读《精通 console.log》

1 引言 本周精读的文章是 Mastering JS console.log like a Pro&#xff0c;一起来更全面的认识 console 吧&#xff01; 2 概述 & 精读 console 的功能主要在于控制台打印&#xff0c;它可以打印任何字符、对象、甚至 DOM 元素和系统信息&#xff0c;下面一一介绍。 c…

PSCA电源控制集成之电压和电源域边界

电压域之间的跨越必须是异步的。电源域之间的跨越可以是同步的&#xff0c;也可以是异步的。 在电压域或异步电源域之间的边界处&#xff0c;需要使用域桥来实现所需的协议。 对于电压域之间的边界&#xff0c;或者是异步电源域之间的边界&#xff0c;域桥被分割成两半&#…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

Linux系列

安装系列 1.MySQL安装 我们要通过rpm&#xff0c;进行MySQL数据库的安装&#xff0c;主要的步骤如下&#xff1a; rpm -qa 查询当前系统中安装的所有软件 rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件 rpm -…

七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma

前言 我司第二项目组一直在迭代论文审稿GPT(对应的第二项目组成员除我之外&#xff0c;包括&#xff1a;阿荀、阿李、鸿飞、文弱等人)&#xff0c;比如 七月论文审稿GPT第1版&#xff1a;通过3万多篇paper和10多万的review数据微调RWKV七月论文审稿GPT第2版&#xff1a;用一万…

Android Kotlin知识汇总(三)Kotlin 协程

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理&#xff0c;例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题&#xff0c;从而让您能够编写出更清晰、更简洁的应用代…

【蓝桥杯选拔赛真题67】python奇偶数位相乘 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python奇偶数位相乘 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python奇偶数位相乘 第十五届蓝桥杯青少年组python比赛选拔赛真题 一…