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信息为空判断创建资源请求执行成功。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低代码-详情页组件设计

效果图 详情页数据结构定义 layout:{// 按钮数据buttonLayout:{headButton:[], // 页头按钮footButton:[] // 页脚按钮},// 详情页表单配置config:{}, // 配置组件列表detailLayout:[]}默认行为 进表单初始化,只展示表单属性,隐藏通用、数据、事件tab项…

springboot第50集:File类,IO流,网络编程,反射机制周刊

image.png FileReader、FileWriter的使用 FileInputStream、FileOutputStream的使用 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png 服务器内存优化是一个复杂的过程,通常需要综合考虑…

存储系统——Ceph

目录 存储基础 单机存储设备 单机存储的问题 分布式存储(软件定义的存储 SDS) 分布式存储的类型 Ceph 概述 Ceph 优势 Ceph 架构 RADOS 基础存储系统 LIBRADOS 基础库 高层应用接口 应用层 Ceph 核心组件 OSD(Object Storage D…

实现歌词滚动效果

文章目录 需求源码 需求 有一段音频和一个字符串格式的歌词&#xff0c;现欲将二者结合做到歌词随音乐播放歌词滚动的效果&#xff0c;如下图所示 源码 目录结构 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&…

windows PyCharm远程同步Linux服务器上的项目文件,以及远程连接Linux服务器上的python环境

&#xff08;1&#xff09;上传项目文件到Linux服务器和前置说明 &#xff08;1-1&#xff09;本地项目文件地址&#xff1a;D:\Python_Work\XXX &#xff08;1-2&#xff09;阿里云服务器项目文件地址&#xff1a;/home/XXX &#xff08;1-3&#xff09;Pycharm必须是专业版…

杨中科 .NETCORE EFCORE第七部分 一对一,多对多

一对一 一对一关系配置 1、builder.HasOne(o >o.Delivery).WithOne(d>d.Order).HasForeignKey(d>dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 多对多…

Qt中ComboBox的简单使用

1.相关说明 combobox中item的文字、data、图片设置 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete …

怎么修改或移除WordPress后台仪表盘概览底部的版权信息和主题信息?

前面跟大家分享『WordPress怎么把后台左上角的logo和评论图标移除&#xff1f;』和『WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除&#xff1f;』&#xff0c;其实在WordPress后台仪表盘的“概览”底部还有一个WordPress版权信息和所使用的…

【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!

最近学习MetaGPT&#xff0c;用到了 pip install -e . 安装命令&#xff0c;这个安装命令是从源代码安装包。 从源代码安装包有几个好处&#xff1a; 包内的代码是可见的&#xff0c;是白盒&#xff0c;不是黑盒&#xff0c;可以直接在项目中看源码断点调试可以直接断到源码里…

看看通义天问AI的水平怎么样?

写在前面 我问了通义千问一个问题&#xff1a;gooey项目改名后的新名字是什么&#xff1f; 这个问题很模糊&#xff0c;它把gooey理解为一个python库&#xff0c;这很正常&#xff0c;毕竟该项目知名度大。 随着对话的进展&#xff0c;我补充了相关信息&#xff0c;将上下文领…

QT软件在线安装与维护

一.安装 安装QT开发环境分离线安装和在线安装两种方式&#xff0c;具体步骤如下&#xff1a; QT官网注册账号----下载安装包-----安装-----选择要安装的版本与开发包----版本维护 注意&#xff1a;Qt5.14.2是最后提供二进制安装包的版本&#xff0c;后面的版本都需要在线安装…

力扣hot100 爬楼梯 线性DP

Problem: 70. 爬楼梯 复杂度 时间复杂度: O ( n ) O(n) O(n) Code class Solution {public int climbStairs(int n){int[] f new int[n 1];f[0] 1;f[1] 1;for (int i 2; i < n; i)f[i] f[i - 1] f[i - 2];return f[n];} }

保证Kafka消息有序性

一、Kafka特性 写入同一个partion分区中的数据是一定有顺序的kafka中一个消费者消费一个partion的数据&#xff0c;消费者取出数据时&#xff0c;也是有顺序的 二、保证消息Kafka消息有序性 在生产者端&#xff0c;应保证消息被写入同一分区。可以在构造消息时指定消息的key…

【技术科普】四大主流芯片架构及其主要优势!

在“算力时代”&#xff0c;数字经济蓬勃发展下数据量呈现爆发式增长&#xff0c;数据价值凸显&#xff0c;从数据的产生到数据的传输、再到计算、处理&#xff0c;都离不开计算芯片&#xff0c;影响着计算芯片的芯片架构到底是什么&#xff1f;有什么作用&#xff1f;今天我们…

Springboot使用参数解析器HandlerMethodArgumentResolver,解析请求头里的数据

HandlerMethodArgumentResolver 是 Spring MVC 中的一个接口&#xff0c;它允许你自定义方法参数的解析过程。当处理请求时&#xff0c;Spring MVC 需要将请求中的信息映射到控制器方法的参数上&#xff0c;而 HandlerMethodArgumentResolver 允许你在这个过程中进行自定义操作…

群晖搭建LDAP服务器实现一个账号登录DSM、Gitea、jellyfin

文章目录 前言安装LDAP Server新建群组新增用户 DSM加入LDAPDSM使用LDAP登录 Gitea配置登录取消其登录权限 Jellyfin配置登录 总结 前言 LDAP&#xff08;轻量级目录访问协议&#xff09;是一种用于访问和管理分布式目录服务的协议&#xff0c;它具有以下好处&#xff1a; 集…

【USTC】verilog 习题练习1-5

1 编写 Verilog 代码&#xff0c;使电路输出信号1 输入格式 无输入 输出格式 输出1&#xff0c;位宽为1 module top_module(output out );// Write your code hereassign out 1; endmodule 2编写 Verilog 代码&#xff0c;使电路输出信号0 输入格式 无输入 输出格式 …

虚拟ip可以解决所有的安全问题吗

虚拟IP&#xff08;Virtual IP&#xff09;是一种网络技术&#xff0c;可以把多台物理服务器或设备组合成一个逻辑集群&#xff0c;并且使用同一个IP地址对外提供服务。虚拟IP具有负载均衡、故障切换和高可用性等优势&#xff0c;同时还可以作为一种安全措施来增加系统的抗攻击…

S32K3系列 --- 硬件I2C Mcal配置

前言 网上看到很多I2C的教程,基本都是模拟I2C,现在S32K3的芯片支持硬件I2C,我想着就配一个硬件的出来吧,这边记录一下,供大家学习。 一、I2C原理 这里主要教大家如何去配置,去使用。 原理的话可以参考这篇文章: 一文搞懂I2C通信总线_i2c通信的详细讲解-CSDN博客 I2…

详解React与Vue的性能对比

React 和 Vue 是当前最流行的前端开发框架之一。它们都具有高度的灵活性和可扩展性&#xff0c;但在某些方面有所不同。在本篇文章中&#xff0c;我将详细介绍 React 和 Vue 这两个技术&#xff0c;并比较它们的优点和缺点。 目录 1. React&#xff1a; 1.1 优点&#xff1a; …