k8s创建资源对象过程

我们都知道,K8S中一切皆资源,在使用K8S时,所有的pod或者controller都是通过yaml文件进行创建的。

那么接下来,就和大家一起看一下K8S是如何创建资源的。

创建资源对象的过程

Deployment是一种常见的资源对象。在Kubernetes系统中创建资源对象有很多种方法。本节将对用kubectl create命令创建Deployment资源对象的过程进行分析。kubectl资源对象创建过程如图所示。

图片

使用kubectl创建资源对象是Kubernetes中最常见的操作之一,内部运行原理是客户端与服务端进行一次HTTP请求的交互。Kubernetes整个系统架构的设计方向是通用和具有高扩展性,所以以上功能在代码实现上略微复杂。

创建资源对象的流程可分为:

  1. \1. 实例化Factory接口
  2. \2. 通过Builder和Visitor将资源对象描述文件(deployment.yaml)文本格式转换成资源对象。
  3. \3. 将资源对象以HTTP请求的方式发送给kube-apiserver,并得到响应结果。
  4. \4. 最终根据Visitor匿名函数集的errors判断是否成功创建了资源对象。

1. 编写资源对象描述文件

Kubernetes系统的资源对象可以使用JSON或YAML文件来描述,一般使用YAML文件居多。下面提供了一个简单的Deployment Example资源对象文件:

本文主要了解k8s创建资源对象的过程,因此代码使用截图代替。

图片

通过kubectl create命令与kube-apiserver交互并创建资源对象,执行命令如下:

kubectl create -f nginx-deployment.yaml

2. 实例化Factory接口

在执行每一个kubectl命令之前,都需要执行实例化cmdutil.Factory接口对象的操作。Factory是一个通用对象,它提供了与kube-apiserver的交互方式,以及验证资源对象等方法。cmdutil.Factory接口代码示例如下:

源码使用最新版本k8s进行阅读: vendor/k8s.io/kubectl/pkg/cmd/cmd.go:332

f := cmdutil.NewFactory(matchVersionKubeConfigFlags)

vendor/k8s.io/kubectl/pkg/cmd/util/factory.go:40

图片

cmdutil.Factory接口说明如下:

  • • DynamicClient:动态客户端。
  • • KubernetesClientSet:ClientSet客户端。
  • • RESTClient:RESTClient客户端。
  • • NewBuilder:实例化Builder,Builder用于将命令行获取的参数转换成资源对象。
  • • Validator:验证资源对象。

cmdutil.Factory接口封装了3种client-go客户端与kube-apiserver交互的方式,分别是DynamicClient、KubernetesClientSet(简称ClientSet)及RESTClient。3种交互方式各有不同的应用场景。

关于三种客户端的介绍,将会在下一篇文章详细介绍client-go客户端的使用。

PS:动动小手关注我,后续继续学习crd与client-go的使用。

3. Builder构建资源对象

Builder用于将命令行获取的参数转换成资源对象(Resource Object)。它实现了一种通用的资源对象转换功能。Builder结构体保存了命令行获取的各种参数,并通过不同函数处理不同参数,将其转换成资源对象。Builder的实现类似于Builder建造者设计模式,提供了一种实例化对象的最佳方式。代码示例如下: vendor/k8s.io/kubectl/pkg/cmd/create/create.go:251

图片

首先通过f.NewBuilder实例化Builder对象,通过函数Unstructured、Schema、ContinueOnError、NamespaceParam、FilenameParam、LabelSelectorParam、Flatten对参数赋值和初始化,将参数保存到Builder对象中。最后通过Do函数完成对资源的创建。

其中,FilenameParam函数用于识别kubectl create命令行参数是通过哪种方式传入资源对象描述文件的,kubectl目前支持3种方式:

  • • 第1种,标准输入Stdin(即cat deployment.yaml|kubectl create-f);
  • • 第2种,本地文件(即kubectl create-f deployment.yaml);
  • • 第3种,网络文件(即kubectl create-f http:///deployment.yaml)。

4. Visitor多层匿名函数嵌套

在Builder Do函数中,Result对象中的结果由Visitor执行并产生,Visitor的设计模式类似于Visitor访问者模式。Visitor接口定义如下:

vendor/k8s.io/cli-runtime/pkg/resource/interfaces.go:94

图片

Visitor接口包含Visit方法,实现了Visit(VisitorFunc) error的结构体都可以成为Visitor。其中,VisitorFunc是一个匿名函数,它接收Info与error信息,Info结构用于存储RESTClient请求的返回结果,而VisitorFunc匿名函数则生成或处理Info结构。

Visitor的设计较为复杂,并非单纯实现了访问者模式,它相当于一个匿名函数集。在Kubernetes源码中,Visitor被设计为可以多层嵌套(即多层匿名函数嵌套,使用一个Visitor嵌套另一个Visitor)。直接阅读Visitor源码,会比较晦涩,为了更好地理解Visitor的工作原理,这里提供了代码示例。Visitor Example代码示例如下:

图片

图片

图片

在Visitor Example代码示例中,定义了Visitor接口,增加了VisitorList对象,该对象相当于多个Visitor匿名函数的集合。另外,增加了3个Visitor的类,分别实现Visit方法,在每一个VisitorFunc执行之前(before)和执行之后(after)分别输出print信息。Visitor Example代码执行结果输出如下:

图片

通过Visitor代码示例的输出,能够更好地理解Visitor的多层嵌套关系。在main函数中,首先将Visitor1嵌入VisitorList中,VisitorList是Visitor的集合,可存放多个Visitor。然后将VisitorList嵌入Visitor2中,接着将Visitor2嵌入Visitor3中。最终形成Visitor3{Visitor2{VisitorList{Visitor1}}}的嵌套关系。

根据输出结果,最先执行的是Visitor1中fn匿名函数之前的代码,然后是VisitorList、Visitor2和Visitor3中fn匿名函数之前的代码。紧接着执行VisitFunc(visitor.Visit)。最后执行Visitor3、Visitor2、VisitorList、Visitor1的fn匿名函数之后的代码。整个多层嵌套关系的执行过程有些类似于递归操作。

多层嵌套关系理解起来有点困难,如果读者看过电影《盗梦空间》的话,该过程可以类比为其中的场景。每次执行Visitor相当于进入盗梦空间中的另一层梦境,在触发执行了visitFunc return后,就开始从每一层梦境中苏醒过来。

回到Kubernetes源码中的Visitor,再次阅读源码时,就容易理解了。Visitor中的VisitorList(存放Visitor的集合)有两种,定义在vendor/k8s.io/cli-runtime/pkg/resource/visitor.go中,代码示例如下:

图片

  • • EagerVisitorList:当遍历执行Visitor时,如果遇到错误,则保留错误信息,继续遍历执行下一个Visitor。最后一起返回所有错误。
  • • VisitorList:当遍历执行Visitor时,如果遇到错误,则立刻返回。

Kubernetes Visitor中存在多种实现方法,不同实现方法的作用不同

图片

下面将资源创建(kubectl create-f yaml/deployment.yaml)过程中的Visitor多层匿名函数嵌套关系整理了出来:

EagerVisitorList{FileVisitor{StreamVisitor{FlattenListVisitor{FlattenListVisitor{ContinueOnErrorVisitor{DecoratedVisitor{result.Visit{}}}}}}}}

EagerVisitorList是Visitor集合,集合中包含FileVisitor和StreamVisitor,执行FileVisitor和StreamVisitor并保留执行后的error信息,然后继续执行下面的Visitor。FileVisitor和StreamVisitor将资源对象描述文件(deployment.yaml)的内容通过infoForData函数转换成Info对象。FlattenListVisitor将资源对象描述文件中定义的资源类型转换成Info对象。ContinueOnErrorVisitor将Visitor调用过程中产生的错误保留在[]error中。DecoratedVisitor会执行注册过的VisitorFunc,分别介绍如下。

  • • resource.SetNamespace:设置命名空间(Namespace),确保每个Info对象都有命名空间。
  • • resource.RequireNamespace:设置命名空间,并检查资源对象描述文件中提供的命名空间与命令行参数(–namespace)提供的命名空间是否相符,如果不相符则返回错误。
  • • resource.RetrieveLazy:如果info.Object为空,则根据info的Namepsace和Name等字段调用Helper获取obj,并更新info的Object字段。

由result.Visit执行createAndRefresh:第1步,通过Helper.Create向kube-apiserver发送创建资源的请求,Helper对client-go的RESTClient进行了封装,在此基础上实现了Get、List、Watch、Delete、Create、Patch、Replace等方法,实现了与kube-apiserver的交互功能;第2步,将与kube-apiserver交互后得到的结果通过info.Refresh函数更新到info.Object中。最后逐个退出Visitor,其过程为

DecoratedVisitor→ContinueOnErrorVisitor → FlattenListVisitor →FlattenListVisitor → StreamVisitor →FileVisitor→EagerVisitorList。

最终根据Visitor的error信息为空判断创建资源请求执行成功。

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

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

相关文章

高精度算法笔记·····························

目录 加法 减法 乘法 除法 高精度加法的步骤&#xff1a; 1.高精度数字利用字符串读入 2.把字符串翻转存入两个整型数组A、B 3.从低位到高位&#xff0c;逐位求和&#xff0c;进位&#xff0c;存余 4.把数组C从高位到低位依次输出 1.2为准备 vector<int> A, B, …

考研机试题收获——高精度进制转换

代码的第一遍真的很重要&#xff0c;在第一次打的时候尽量把问题思考全面&#xff0c;不要漏打少打&#xff0c;尽量不要留bug给之后de。 一、基础方面 一、处理输出的结束问题 scanf和cin默认都不会读取空格 ①scanf()&#xff1a;如果从文件中读取数据&#xff0c;当scanf()…

小红书达人投放策略分析,品牌方必看

小红书已经成为品牌营销的重要战场&#xff0c;达人投放作为小红书营销的核心环节&#xff0c;其策略的精准与否直接关系到营销效果的好坏。本文伯乐网络传媒将对小红书达人投放的重要性、投放策略以及监测与优化进行深入探讨&#xff0c;以期为品牌提供更具实操性的营销建议。…

Python(36):调试过程中遇到的问题记录

错误1&#xff1a;TypeError: object of type NoneType has no len() 原因&#xff1a;这个错误是因为我们试图迭代那个不可迭代的对象。 原来方法&#xff1a;for i in rlen(data_list) 解决办法&#xff1a; for i in range(len(data_list)): 在循环中使用 range() 函数解决了…

Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式|混入(mixin)|插件)

文章目录 前要&#xff1a;前端路由的概念与原理1&#xff09;什么是路由2&#xff09;SPA与前端路由3&#xff09;什么是前端路由4&#xff09;前端路由的工作方式 一、Vue-router简单使用1&#xff09;什么是vue-router2) vue-router 安装和配置的步骤① 安装 vue-router 包②…

Chrome 浏览器插件 cookies API 解析

Chrome.cookie 前端开发肯定少不了和 cookie 打交道&#xff0c;此文较详细的介绍下 chrome.cookie 的 API 以及在 popup、service worker、content 中如何获取的 一、权限&#xff08;Permissions&#xff09; 如果需使用 Cookie API&#xff0c;需要在 manifest.json 文件…

信驰达科技参与《汽车玻璃集成UWB数字钥匙发展研究白皮书》编制工作

为进一步探索汽车数字钥匙技术路线及开发思路&#xff0c;中国智能网联汽车产业创新联盟&#xff08;CAICV&#xff09;、福耀玻璃工业集团股份有限公司联合发起了《汽车玻璃集成UWB数字钥匙发展研究白皮书》研究工作。 2023年12月20日&#xff0c;由中国智能网联汽车产业创新…

PLSQL 把多个字段转为json格式

PLSQL 把多个字段转为json格式 sql Select cc.bm, cc.xm, json_arrayagg(cc.hb) jgFrom (Select aa.bm, aa.xm, json_object(aa.ksbh, aa.wjmc) hbFrom (Select 001 bm, 老六 xm, 0001 ksbh, 文具盒 wjmcFrom dual tUnion AllSelect 001 bm, 老六 xm, 0002 ksbh, 毛笔 wjmcFr…

【C语言】详解文件与文件操作

1.什么是文件 文件是记录在外存上的相关信息的命名组合&#xff0c;但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1.1程序文件 程序文件包括&#xff1a; 源程序文件 &#xff0…

AI嵌入式K210项目(9)-DMA

文章目录 前言一、DMA是什么&#xff1f;二、K210的DMA实验过程总结 前言 本章我们来介绍K210的DMA控制器&#xff0c;大家应该都知道在大数据量传输时&#xff0c;如果CPU全程参与&#xff0c;是非常浪费资源的&#xff0c;于是芯片内置了DMAC用做传输控制&#xff0c;CPU仅仅…

Vue面试之v-if与v-show的区别

Vue面试之v-if与v-show的区别 DOM渲染初始渲染性能切换开销标签配合源码实现 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ 作为Vue中两种条件性渲染元…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(16)——可变数据类型&#xff08;var&#xff09;的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

上位机编程:ASCII码精讲

一 ASCII码介绍&#xff1a; ASCII&#xff08;American Standard Code for Information Interchange&#xff09;码是一种使用数字来表示字符的编码标准。它是一种字符编码&#xff0c;将常见的字符映射到数字&#xff0c;以便计算机能够理解和处理文本数据。 ASCII码最初是为…

十大排序算法模板

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

本地一键部署grafana+prometheus

本地k8s集群内一键部署grafanaprometheus 说明&#xff1a; 此一键部署grafanaPrometheus已包含&#xff1a; victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…

户外火光如何玩转?智能酒精壁炉安全使用攻略大揭秘!

在户外使用智能酒精壁炉是一个别致而令人惬意的选择&#xff0c;但在享受户外炉火带来的温馨时&#xff0c;也需要注意一些安全和使用细节。下面将介绍智能酒精壁炉在户外使用需要注意的事项。 智能酒精壁炉需放置在平坦、通风的户外场地&#xff0c;远离易燃物体&#xff0c;确…

Maven 搭建私服

一、Maven 私服简介 1.1 私服简介 Maven 私服是一种特殊的 Maven 远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 当然也并不是说私服只能建立在局域网&#xff0c;也有很多公…

网络部署实战具体学习内容总结

网络部署实战具体学习内容总结 &#x1f4bb;网络部署实战课程通常旨在教授学生如何规划、配置、维护和优化计算机网络。这些课程涵盖了广泛的主题&#xff0c;以确保学生具备网络部署和管理所需的技能。 网络部署实战课程具体学习内容&#x1f447; 1️⃣网络架构设计及网络原…

第一个Python程序_获取网页 HTML 信息[Python爬虫学习笔记]

使用 Python 内置的 urllib 库获取网页的 html 信息。注意&#xff0c;urllib 库属于 Python 的标准库模块&#xff0c;无须单独安装&#xff0c;它是 Python 爬虫的常用模块。 获取网页 HTML 信息 1) 获取响应对象 向百度&#xff08;http://www.baidu.com/&#xff09;发起…

九州金榜|孩子厌学是家庭教育原因还是学校教育原因?

孩子厌学&#xff0c;这是一个让所有家长的头疼的问题&#xff0c;尤其在看到别人家孩子是学霸的时候&#xff0c;就更会有种莫名其妙的伤感&#xff0c;然后回想自己的孩子&#xff0c;仿佛全都是缺点&#xff0c;家长要是有这种想法那就大错特错了&#xff0c;其实每个孩子都…