源码解析:从 kubelet、容器运行时看 CNI 的使用

news2024/11/20 12:26:23

这是 Kubernetes 网络学习的第三篇笔记。

  • 深入探索 Kubernetes 网络模型和网络通信
  • 认识一下容器网络接口 CNI(本篇)
  • 源码分析:从 kubelet、容器运行时看 CNI 的使用
  • 从 Flannel 学习 Kubernetes VXLAN 网络
  • Cilium CNI 与 eBPF
  • ...

在上一篇中,通过对 CNI 规范的解读了解了网络配置的操作和相关的流程。在网络的几个操作中除了 CNI_COMMAND 外,有另外三个参数几乎每次都要提供 CNI_CONTAINERIDCNI_IFNAMECNI_NETNS,这些参数无外乎都来自容器运行时。这篇将结合 Kubernetes 和 Containerd 源码,来分析一下 CNI 的使用。

Kubernetes 的源码来自分支 release-1.24,Containerd 的来自分支 release/1.6

CNI 的使用

runtime-with-cni

创建 Pod

在之前做过的 kubelet 源码分析 中曾提到 Kubelet#syncLoop() 会持续监控来自 文件apiserverhttp 的变更,来更新 pod 的状态。写那篇文章的时候,分析到这里就结束了。因为这之后的工作就交给容器运行时来完成 sandbox 和各种容器的创建和运行,见 kubeGenericRuntimeManager#SyncPod()

kubelet 封装 sandbox 和容器创建、运行请求,调用容器运行时的接口,将具体工作交由容器运行时来完成来完成(容器运行时接口 Container Runtime Interface,简称 CRI,找时间再进行研究)。

参考源码

  • pkg/kubelet/kubelet.go:1985
  • pkg/kubelet/kuberuntime/kuberuntime_manager.go:711

Sandbox 容器

记得在 系列的第一篇 中,当我们在节点上查看命名空间时,网络命名空间的进程是 /pause

lsns -t net
        NS TYPE NPROCS    PID USER     NETNSID NSFS                                                COMMAND
4026531992 net     126      1 root  unassigned                                                     /lib/systemd/systemd --system --deserialize 31
4026532247 net       1  83224 uuidd unassigned                                                     /usr/sbin/uuidd --socket-activation
4026532317 net       4 129820 65535          0 /run/netns/cni-607c5530-b6d8-ba57-420e-a467d7b10c56 /pause

Kubernetes 在创建 pod 时,会先一个 sandbox 容器(使用 pause 镜像,启动时执行 /pause 进入休眠状态)。我们知道 Kubernetes 的 pod 中是允许多容器的,由这个 sandbox 容器来创建和维持网络命名空间,pod 的其他容器会加入到该命名空间中。因为 pause 镜像足够简单,不会出错导致网络管理空间在出错时被删除。sandbox 容器发挥着至关重要的作用,它在 PID 进程空间的进程树中作为 PID 为 1 的进程,其他容器进程都将其作为父进程。当其他容器的进程成为孤儿进程时,可以得到清理。

创建 Sandbox 容器

CRI 的 RuntimeServiceServer 定义了运行时对外提供的服务接口,除了管理 sandbox、容器相关的操作外,还有 streaming 相关的操作,即常用的 execattachportforward。streaming 相关的内容,可以参考之前的一篇 《源码解析 kubectl port-forward 工作原理》。

让我们来看容器相关的部分。

Containerd 的 criService 实现了 RuntimeServiceServer 的接口。创建 sandbox 容器的请求通过 CRI 的 UDS(Unix domain socket) 接口 /runtime.v1.RuntimeService/RunPodSandbox,进入到 criService 的处理流程中。在 criService#RunPodSandbox(),负责创建和运行 sandbox 容器,并保证容器状态正常。

  1. 容器运行时首先初始化容器对象,产生必要的参数 CNI_CONTAINERID
  2. 会创建 pod 网络命名空间,产生必要的参数 CNI_NETNS
  3. 然后调用 CNI 的接口来对 pod 的网络空间进行配置,比如创建网络接口、分配 IP 地址、创建 veth、设置路由等等一系列的操作。这些操作正是由具体的网络插件实现完成,不同插件之间的实现存在差异。了解了规范之后之后,网络的配置就不难了,其中 2 和 3 可能执行多次:
    1. 读取网络配置
    2. 查找二进制文件
    3. 执行二进制文件
    4. 向容器运行时反馈结果
  4. 最后便是创建 sandbox 容器,这个过程与操作系统的类型相关,会调用对应操作系统的方法来完成容器的创建。

从零开始学习容器,推荐阅读 Ivan Velichko 的 《Learning Containers From The Bottom Up》

参考源码:

  • pkg/cri/server/sandbox_run.go:61
  • pkg/cri/server/sandbox_run.go:422

创建其他容器

接下来就是创建 pod 内的其他容器:临时(ephemeral)、初始化(init)和普通容器,创建这些容器的时候,会将 sandbox 容器的。会加入到 sandox 的网络命名空间中。这里不展开,详细逻辑可参考 containerd 的 containerStore#Create()

参考源码

  • kubernetes:pkg/kubelet/kuberuntime/kuberuntime_manager.go:913
  • containerd:pkg/cri/server/container_create.go:51

总结

接着上篇 CNI 的规范介绍,这次又介绍了 CNI 的使用,以及如何与容器运行时的交互、Pod 的创建流程。

不同的 CNI 插件,实现了不一样的网络功能。下篇,将以 Flannel 为例来了解下 CNI 的实现,以及 Kubernetes VXLAN 网络。

为什么介绍 flannel?因为我常用的开发环境之一 k3s 默认就用的 flannel 网络。另一个开发环境是 k8e ,k8e 默认用的是 Cilium,cilium 的 cni 也是系列的文章之一。

关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

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

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

相关文章

web前端期末大作业 基于HTML+CSS+JavaScript程序员个人博客模板(web学生作业源码)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

翻译: ChatGPT 的激发敬畏、恐惧、特技和试图绕过其护栏的尝试

来自 OpenAI 的新聊天机器人正在激发敬畏、恐惧、特技和试图绕过其护栏的尝试。 以下是 DALL-E 2 在给出提示时生成的内容,“采用 AI 聊天机器人形式的分布式语言超级大脑。” “A distributed linguistic superbrain that takes the form of an A.I. chatbot.” 信…

WPS文件转Excel文件怎么转?建议看看这些方法

小伙伴们平时在接收文件的时候,有没有发现有些文件是以WPS格式进行保存的。这种格式的文件,如果没有使用相关的软件是没办法直接打开的。这种时候,其实我们可以将WPS转成其它office格式就可以打开它,进行编辑了。那你们知道WPS转E…

面试官:你说说Springboot的启动过程吧(5万字分析启动过程)

文章目录前言一、Springboot是什么二、启动流程2.1 构建Spring Boot项目2.2 启动的日志2.3 启动流程分析说明2.3.1 第一部分:SpringApplication的构造函数A、webApplicationType(web应用类型)B、引导注册初始化器C、设置初始化器D、设置监听器…

嵌入式开发-STM32硬件SPI驱动TFT屏

嵌入式开发-STM32硬件SPI驱动TFT屏这次用到的TFT屏CubeMX设置代码编写增加的内容需要注意问题代码下载这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2.8英寸,分辨率320X240的液晶屏才20元,我为了图省事,多配…

[附源码]Nodejs计算机毕业设计基于JAVA快递配送平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

SpringBoot整合GitLab-CI实现持续集成

写在前面 🍁个人主页:微枫Micromaple ✨本期专栏:《0到1项目搭建》欢迎订阅学习~ 📌源码获取:GitCode、GitHub、码云Gitee 持续更新中,别忘了 star 喔~ 在企业开发过程中,我们开发的功能或者是修…

python之筛选图像中是否存在黑白背景

python之筛选图像中是否存在黑白背景 紧接上篇文章的需求,需要进行功能增加 某些图片存在背景丢失问题,出现黑白背景现象,这种需要排查,同样交给了自动化处理。 这次不比上次了,我搜罗了一堆资料,全是什么…

【实时数仓】DWD层需求分析及实现思路、idea环境搭建、实现DWD层处理用户行为日志的功能

文章目录一 DWD层需求分析及实现思路1 分层需求分析2 每层的职能3 DWD层职能详细介绍(1)用户行为日志数据(2)业务数据4 DWD层数据准备实现思路二 环境搭建1 创建maven工程2 修改配置文件(1)添加依赖&#x…

Faster RCNN精读

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks Faster R-CNN:使用区域建议网络实现实时目标检测 优异的网络模型总是经得起时间的推敲,Faster RCNN便是其中一员。 目录 一、摘要 二、结论 三、介绍和相关工作 …

R语言析因设计分析:线性模型中的对比

对比度可用于对线性模型中的处理进行比较。 常见的用途是使用析因设计时,除析因设计外还使用控制或检查处理。在下面的第一个示例中,有两个级别(1和2)的两个处理(D和C),然后有一个对照 处理。此…

周末来哥家小聚一下

欢迎关注勤于奋 每天12点准时更新国外LEAD相关技术 是的,周末来哥家小聚,他们这儿人不多,就是一些认识的人,没有外人,加上疫情,一般不聚集,大家都清楚没事。 在他家没事,就陪小朋友…

灵活的类加载器OSGI

灵活的类加载器OSGI 简介 OSGi中的每个模块(称为Bundle)与普通的Java类库区别并不太大,两者一般都以JAR格式进行 封装[2],并且内部存储的都是Java的Package和Class。但是一个Bundle可以声明它所依赖的Package(通 过I…

最近的一点杂感

这是学习笔记的第 2444篇文章最近居家办公几周了,除了工作也能想想生活的事情,说说最近自己比较深的几四点感受吧。熵增和待办事项最初居家办公的时候,我们也有日会,也会有一些频繁的沟通,但是总是感觉目标的达成效果上…

JavaScript大作业 基于HTML+CSS+JavaScript站酷静态页面官网7页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

超高质量堆排序详细讲解,图文并茂,看不懂打我

目录 一,题目 二,堆排序 1、堆排序基本介绍 2、堆排序基本思想 3、堆排序步骤图解说明 四,总结堆排序的整体思路 五,整体代码实现 1.普通版 2,STL版 一,题目 给定你一个长度为 n 的整数数列。 请你使用快堆排序对这个数列…

斐波那契数列问题【Java实现】

目录 题目: 背景: 方法一:暴力递归 复杂度O(2^N) 方法二:复杂度O(N) 方法三:O(logN)复杂度 两个矩阵相乘: 求矩阵m的p次方的代码实现: 用矩阵乘法求斐波那契数列第…

Linux | Posix信号量(semaphore) | 环形队列实现生产消费模型 | 线程池实现

文章目录POSIX信号量信号量接口讲解基于信号量和环形队列实现生产消费模型线程池的实现Posix信号量和System V信号量作用相同,都是用于共享资源的同步访问,Posix信号量通常用于线程间通信,而System V信号量常用于进程间通信,这篇博…

2022-12-09 Redis 学习

Redis简介 Nosql NOSQL:即Not-OnlySQL(泛指非关系型的数据库),作为关系型数据库的补充。 作用:应对基于海量用户海量数据前提下的数据处理问题 特征: 可扩容,可伸缩大量数据下高性能灵活的数…

记录在使用git进行上传本地文件到github上遇到的一些问题以及解决办法

1.warning: in the working copy of ‘XXX’, LF will be replaced by 这是一个警告错误,其实可以不用管他。 如果想要不出现这个警告可以参考这个博客:https://blog.csdn.net/Babylonxun/article/details/126598477 2.fatal: ‘origin’ does not app…