K8S CNI
OCI概念
OCI,Open Container Initiative,开放容器标准,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。
OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业中的其他领导者在 2015 年 6 月的时候启动。
- runc: OCI默认实现,在资源效率和标准通用方面最强,但是在安全隔离方面却最弱
- kata:更加强调安全
- gvisor: gVisor 通过拦截所有从应用到主机内核的系统调用,并使用用户空间中 gVisor 的内核实现来处理这些调用
- rkt: 弃用
- crun:Redhat 领导的 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 可以负责干下面这些事情:
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 VPC、AliVPC、IPIP 和 IPSec 等一些实验性后端也可用,但目前尚未得到官方支持。
Flannel 的缺点之一是缺乏高级功能,例如配置网络策略和防火墙的能力。因此 Flannel 是 Kubernetes 集群网络的一个很好的入门级选择,但是,如果你正在寻找高级网络功能,你可能需要考虑其他 CNI 选项,例如 Calico。
Calico
与 Flannel 一样,Calico 在 OSI 模型的第 3 层上运行,并使用 BGP 协议在其默认配置中的节点之间移动网络数据包,并使用 IP in IP 进行封装。使用 BGP,Calico 可以本地定向数据包,而无需将它们包装在额外的封装层中。
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对比 - 知乎
相关文章:

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

Python数据分析实验一:Python数据采集与存储
目录 一、实验目的与要求二、实验过程三、主要程序清单和运行结果1、爬取 “中国南海网” 站点上的相关信息2、爬取天气网站上的北京的历史天气信息 四、程序运行结果五、实验体会 一、实验目的与要求 1、目的: 理解抓取网页数据的一般处理过程;熟悉应用…...

丘一丘正则表达式
正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符说明实…...

工业物联网平台在水务环保、暖通制冷、电力能源等行业的应用
随着科技的不断发展,工业物联网平台作为连接物理世界与数字世界的桥梁,正逐渐成为推动各行业智能化转型的关键力量。在水务环保、暖通制冷、电力能源等行业,工业物联网平台的应用尤为广泛,对于提升运营效率、降低能耗、优化管理等…...

【研发日记】Matlab/Simulink技能解锁(二)——在Matlab Function编辑窗口Debug
文章目录 前言 行断点 条件断点 按行步进 Watch Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时,如果能确定大致的代码段,就可以在相应的行上设置一…...

从键盘输入两个数,求它们的和并输出 从键盘输入三个数到a,b,c中,按公式值输出
别急别急,先看完 (从初学者出发) 从键盘输入两个数,求它们的和并输出 作者 陈春晖 单位 浙江大学 本题目要求读入2个整数A和B,然后输出它们的和。 输入格式: 在一行中给出一个被加数 在另一行中给出一个加数 输出格式: 在…...

密码解密 C卷(100%用例)(JavaPythonC++Node.jsC语言)
给定一段“密文“字符串s,其中字符都是经过"密码本”映射的,现需要将"密文"解密并且输出 映射的规则(a-i)分别用(1-9)表示;(j-z")分别用(10-"26”)表示 约束:映射始终唯一 输入描述: “密文”字符串 输出描述: 明文字符串 补充说明: 翻译后的文本…...

因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)
H5项目打包之后,总是有这个报错,有时候还有别的icon也找不见 一通调查之后,发现是因为引入了一个vue插件 这个插件引入之后,webpack打包的时候就会自动在dist文件夹中产生一个manifest.json文件这个文件里面主要就是一些icon地址的…...

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)
文章目录 🦄 进程替换🦩 execl()函数🦩 execlp()函数🦩 execle()函数🦩 execv()函数🦩 execvp()函数🦩 execvpe()函数🦩 execve()函数 🦄 简单Shell命令行解释器的实现&a…...

【Linux】从零开始认识进程 — 前篇
我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程???3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…...

公众号留言功能恢复了,你的开通了吗?
了解公众号的人都知道,腾讯在2018年3月宣布暂停新注册公众号的留言功能,这之后注册的公众号都不具备留言功能。 这成了很多号主运营人的一块心病,也包括我。 没有留言,就好似一个人玩单机游戏,无法与读者互动ÿ…...

C语言葵花宝典之——文件操作
前言: 在之前的学习中,我们所写的C语言程序总是在运行结束之后,就会自动销毁,那如果我们想将一个结果进行长期存储应该如何操作呢?这时候就需要我们用文件来操作。 目录 1、什么是文件? 1.1 程序文件 1.2…...

SSM框架,MyBatis-Plus的学习(下)
条件构造器 使用MyBatis-Plus的条件构造器,可以构建灵活高效的查询条件,可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装…...

边缘计算网关的工作原理及其在工业领域的应用价值-天拓四方
随着物联网技术的快速发展,物联网时代已经悄然来临。在这个时代,数以亿计的设备相互连接,共享数据,共同构建智慧的世界。边缘计算网关通过将计算能力和数据存储推向网络的边缘,实现了对海量数据的实时处理,…...

下载指定版本的pytorch
下载网址:https://download.pytorch.org/whl/torch_stable.html 参考博客网址:https://blog.csdn.net/wusuoweiieq/article/details/132773977...

STL:List从0到1
🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…...

利用高分五号02星高光谱数据进行地物识别
高分五号02星搭载了一台60公里幅宽、330谱段、30米分辨率的可见短波红外高光谱相机(AHSI),可见近红外(400~1000nm)和短波红外光谱(1000~2500nm)分辨率分别达到5纳米和10纳米。单看参数性能优越&…...

前端如何识别上传的二维码---jsQR
npm npm i -d jsqrhtml <el-button click"$refs.input.click()">识别</el-button> <input type"file" style"display: none" id"input" input"upload">js import jsQR from "jsqr";decodeQR…...

flink1.18.0 自定义函数 接收row类型的参数
比如sql中某字段类型 array<row<f1 string,f2 string,f3 string,f4 bigint>> 现在需要编写 tableFunction 需要接受的参数如上 解决方案 用户定义函数|阿帕奇弗林克 --- User-defined Functions | Apache Flink...

JDK8和JDK11在Ubuntu18上切换(解决nvvp启动报错)
本文主要介绍JDK8和JDK11在Ubuntu18上切换,以供读者能够理解该技术的定义、原理、应用。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:计算机杂记 🎀CSDN主页 发狂的小花 🌄人…...

基于eleiment-plus的表格select控件
控件不是我写的,来源于scui,但在使用中遇到了一些问题,希望能把过程记录下来,同时把这个问题修复掉。 在使用的时候对控件进行二级封装,比如我的一个商品组件,再很多地方可以用到,于是 <template>&l…...

「❤️万文总结 时光回忆录❤️」那年,我在北京邮电大学计算机学院求学的日子
文章目录 关于我 | About Me梦绕西土城,邮情涌流 | Dreams and Connections in Haidian 北邮求学记 | My Days at BUPT岁月如歌,追忆往昔 | Reminiscing the Fleeting Years新篇章:班级与环境 | New Class, New Surroundings高压与挑战&#…...

【四 (1)数据可视化之如何选用正确的图表】
目录 文章导航一、数据分析中可视化的作用1、揭示数据关联和模式2、支持数据分析和决策3、提升沟通和共享效果4、强调关键信息和发现5、增强故事叙述和记忆效果6、有效增强数据交互性数据7、复杂信息易理解8、数据多维度显示 二、如何选用合适的图表1、简洁性避免使用过于复杂或…...

PHP<=7.4.21 Development Server源码泄露漏洞 例题
打开题目 dirsearch扫描发现存在shell.php 非预期解 访问shell.php,往下翻直接就看到了flag.. 正常解法 访问shell.php 看见php的版本是7.3.33 我们知道 PHP<7.4.21时通过php -S开起的WEB服务器存在源码泄露漏洞,可以将PHP文件作为静态文件直接输…...

大语言模型RAG-技术概览 (一)
大语言模型RAG-技术概览 (一) 一 RAG概览 检索增强生成(Retrieval-AugmentedGeneration, RAG)。即大模型在回答问题或生成问题时会先从大量的文档中检索相关的信息,然后基于这些信息进行回答。RAG很好的弥补了传统搜索方法和大模型两类技术…...

【嵌入式DIY实例】-DIY锂电池电压检测表
DIY锂电池电压检测表 文章目录 DIY锂电池电压检测表1、直流电压检测传感器介绍2、硬件准备3、代码实现4、OLED显示在电子应用中,通常需要使用到电池,电源管理是必不可少的部分。本文将详细介绍如何使用一个0-25V的直流电压传感器来检测锂电池的电压。 1、直流电压检测传感器介…...

生成baidu.com域名的私有证书:Linux系统命令示例
在Linux系统上生成一个针对xzyxdev.prec-tech.com域名的私有证书(通常指的是自签名证书),你可以使用openssl工具。以下是一个简单的步骤和命令示例来生成这样的证书: 生成私钥 首先,你需要生成一个私钥。这通常是一个…...

小程序学习4 mock
services/home.js import { config, cdnBase } from ../../config/index;/** 获取首页数据 */ function mockFetchHome() {const { delay } require(../_utils/delay);const { genSwiperImageList } require(../../model/swiper);return delay().then(() > {return {swip…...

Unity3D MMORPG角色的UI血条管理详解
前言 在Unity3D游戏开发中,MMORPG(Massively Multiplayer Online Role-Playing Game)游戏是一种非常流行的游戏类型。在这种类型的游戏中,玩家通常可以选择不同的角色来进行游戏,而角色的血条管理是游戏中非常重要的一…...

【python】爬取杭州市二手房销售数据做数据分析【附源码】
一、背景 在数据分析和市场调研中,获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库,结合 XPath 解析网页信息,实现对链家网二手房销售数据的爬取,并将数据导出为 Excel 文件的过…...