【探索 Kubernetes|作业管理篇 系列 11】控制器的核心功能

news2024/11/26 9:44:52

前言

大家好,我是秋意零。

上一篇结束了 Pod 对象的内容。

今天要探讨的内容是 “控制器”,它是 Kubernetes 编排最核心的功能。理解了 “控制器”,你就能理解 Deployment、StatefulSet、DaemontSet、Job、CroJob 控制器对象。

最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持!

获取方式:

  • 1.在我主页推广区域,如图:

在这里插入图片描述

  • 2.文章底部推广区域,如图:

在这里插入图片描述

👿 简介

  • 🏠 个人主页: 秋意零
  • 🧑 个人介绍:在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛”,并斩获多项奖项荣誉证书
  • 🎉 目前状况:24 届毕业生,拿到一家私有云(IAAS)公司 offer,暑假开始实习
  • 🔥 账号:各个平台, 秋意零 账号创作者、 云社区 创建者
  • 💕欢迎大家:欢迎大家一起学习云计算,走向年薪 30 万

在这里插入图片描述

系列文章目录


【云原生|探索 Kubernetes-1】容器的本质是进程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器进程的文件系统
【云原生|探索 Kubernetes 系列 4】现代云原生时代的引擎
【云原生|探索 Kubernetes 系列 5】简化 Kubernetes 的部署,深入解析其工作流程



更多点击专栏查看:深入探索 Kubernetes

文章目录

  • 前言
  • 系列文章目录
  • 一、控制器模型
  • 二、控制循环
  • 总结

正文开始

  • 快速上船,马上开始掌舵了(Kubernetes),距离开船还有 3s,2s,1s…

在这里插入图片描述

一、控制器模型

在 Kubernetes中,控制器模式是一种用于管理和维护资源对象的模式。控制器模式基于 Kubernetes 的声明式配置和自动化管理原则,通过监视资源对象的状态和变化,以及根据期望状态进行调谐和调整,实现对应用程序的自动化部署、扩展、修复和管理。

Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已。

更形象说明就是,“容器镜像” 虽然好用,但是容器这样一个 “沙盒” 的概念,对应用描述关联性来说,还是太简单了。好比,码头的集装箱好用,但是它四面都是光秃秃的,吊车怎么把它这个集装箱吊起来摆放好呢?(这个摆放过程可以看作编排)

因为,一个容器通常是一个应用 APP,但是现实中基本上不存在一个 APP 就能提供所有服务,必然要使用一些辅助程序,如:Redis、RabbitMQ、MySQL等等中间件;所以,对比到 “一个容器” ,它是不能满足现实中的情况的,因为需要辅助程序,这种情况下 Kubernetes 使用了 Pod。

Pod 对象,其实就是容器的升级版。它对容器进行了组合,添加了更多的属性和字段。这就好比给集装箱四面安装了吊环,使得 Kubernetes 这架 “吊车”,可以更轻松地操作它

而 Kubernetes 操作这些 “集装箱“ 的逻辑,都是控制器(Controller)负责完成。

现在,我们看一个 Deployment 控制器的栗子:

  • Deployment 通过 spec.selector.matchLabels 携带了 app=myapp 标签与 Pod 绑定,这样 Deployment 就能控制于它具有相同标签的 Pod 了;通过 spec.replicas 指定 Pod 期望个数,Deployment 控制器会将 Pod 一直保持在 3 个,少了会创建,多了会删除。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3  # 指定副本数量
  selector:
    matchLabels:
      app: myapp  # 选择标签为`app: myapp`的Pod进行管理
  template:
    metadata:
      labels:
        app: myapp  # Pod的标签
    spec:
      containers:
        - name: myapp-web
          image: nginx  # 指定应用程序的镜像
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80  # 应用程序监听的端口号

验证

[root@master01 yaml]# kubectl apply -f deploy-web.yaml
deployment.apps/myapp-deployment created
[root@master01 yaml]# kubectl get -f deploy-web.yaml
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
myapp-deployment   3/3     3            3           6s
[root@master01 yaml]#
[root@master01 yaml]# kubectl get pod |grep deploy
myapp-deployment-764dfc58c9-dbfrm   1/1     Running            0                 16s
myapp-deployment-764dfc58c9-jwghb   1/1     Running            0                 16s
myapp-deployment-764dfc58c9-z2n7t   1/1     Running            0                 16s

在这里插入图片描述

二、控制循环

上述的控制操作,是 kube-controller-manager 组件负责的,而所有的控制器都在 kubernetes/pkg/controller 中,如图:

在这里插入图片描述

源码的 kubernetes/pkg/controller 目录下,保存的都是控制器。它们都遵循 Kubernetes 项目中的一个通用编排模式,即:控制循环(control loop)

Go 语言伪代码表示控制循环:

  • 获取对象的两种状态的值,从而对两种状态的值做比较,等于什么都不做,不等于就让 Pod 保持到期望状态的个数。
for {
  实际状态个数 := 获取集群中对象X的实际状态(Actual State)
  期望状态个数 := 获取集群中对象X的期望状态(Desired State)
  if 实际状态个数 == 期望状态个数{
    什么都不做
  } else {
    执行编排动作,将实际状态调整为期望状态
  }
}

1.实际状态:

  • 实际状态个数,就是 Kubernetes 集群中,真实运行的受 Deployment 控制器管理的 Pod 的个数。这个值可以通过 kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,来获取。

2.期望状态:

  • 期望状态,来自于用户提交的 YAML 文件中的 spec.replicas 字段的值。

现在,我们还是以 Deployment 为例,看看控制器实现过程:

  • 1.Deployment 控制器从 Etcd 中获取所有携带 “app: myapp” 标签的 Pod,统计它们的数量,这就是实际状态个数。
  • 2.获取 Deployment 对象的 spec.replicas 字段的值,这就是期望状态个数。
  • 3.Deployment 控制器将这两个状态的值做比较,根据是否相等来判断实际状态个数是否达到期望状态的个数,如果没有就判断是增加 Pod 还是删减 Pod。

可以看到,一个 Kubernetes 对象的主要编排逻辑,实际上是在第三步的 “对比” 阶段完成的。

这个操作,通常被叫作调谐(Reconcile)。这个调谐的过程,则被称作“Reconcile Loop”(调谐循环)或者“Sync Loop”(同步循环)。它们其实指的都是同一个东西:控制循环。

被这个循环控制的部分,是 Deployment 中的 spec.template 字段,template 字段这个在 Deployment 中是 PodTemplate(Pod 模板)。如下图所示,类似 Deployment 这样的一个控制器,实际上都是由上半部分的控制器定义(包括期望状态),加上下半部分的被控制对象的模板组成的。

下图中,Deployment (nginx-deployment)是直接控制 Pod(nginx)的吗?其实不是 Deployment 直接控制 ReplicaSet,ReplicaSet 再次控制 Pod 对象。

在这里插入图片描述
通过这种被谁是谁的控制对象的概念,其实是通过 API 对象的 Metadata 里,都有一个字段叫作 ownerReference, 用于保存拥有者 API 对象(Owner)的信息来分辨的。

  • 图中,我们查看了,通过 Deployment 控制器所创建的 Pod 的信息,可以看到框出的部分 ownerReference 的 API 对象是 ReplicaSet。

在这里插入图片描述

  • 我们再来验证查看 RplicaSet 的 ownerReference 是不是 Deployment,如图:

在这里插入图片描述

总结

今天,说明了 ”控制器模式“ 的方法。

如:Deployment 它的控制循环是如何工作的,这个部分我们介绍了一个 Go 语言的伪代码。

接着,简单介绍了,Kubernetes 是如何来区分谁是谁的控制对象的,答案是:使用 ownerReference 用于保存拥有者 API 对象(Owner)的信息来分辨的。

最后:技术交流、博客互助,点击下方或主页推广加入哦!!

在这里插入图片描述

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

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

相关文章

使用parcel搭建threejs开发环境

一、什么是parcel parcel官网:https://www.parceljs.cn/ Parcel是一个快速、零配置的Web应用打包器,可将JavaScript、CSS、HTML和图像等静态文件打包到一个捆绑文件中。它的主要目标是简化Web应用程序的打包过程,使开发人员可以更快速地创建…

测试开发工是做什么的?2023年往后测试之路发展前景?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 现在公司企业对测…

Linux目录分类说明

在Linux根目录下一般包括如下目录,这里就这些目录的特点做一些归纳。(centos8为例) 一、/var目录 /var目录是一个包含经常变化的文件的目录。它是Variable的缩写,也有些人解释为Versioned Archives。通常包含以下内容:…

Groovy基础教程

一、概述 Groovy是一种基础JVM(Java虚拟机)的敏捷开发语言,他结合了Python、Ruby和Smalltalk的特性,Groovy代码能够于Java代码很好的结合,也能用于扩展现有代码。由于其运行在JVM的特性,Groovy可以使用其他Java语言编写法的库。 …

电源ATE测试系统-电源模块自动化测试软件ATECLOUD-Power

ATECLOUD-Power测试应用场景 研发测试、产线测试、老化测试、一测二测等 ATECLOUD-Power解决测试痛点 ☁ 人工手动测试,效率低,需要提高测试效率和准确性; ☁ 测试产品种类繁多,测试方法多样,客户需要灵活的解决方案…

六、SpringBoot集成elasticsearch

目录 官网API介绍 1、新建maven项目 2、检查elasticsearch依赖的版本 3、配置RestHighLevelClient对象 4、使用springboot-test测试API的使用 官网API介绍 Java API Client https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html …

TypeScript基础使用方法

Author: 德玛玩前端 Date: 2023-06-07 TypeScript 一、Typescript介绍 1.1、TypeScript产生的原因 旧JS是弱类型语言,一个变量先后可以保存不同类型的数据,所以不可靠。旧JS是解释执行语言,一边解释,一边执行,一些低…

python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

简介 上一篇和大家一起科普扫盲接口后,知道什么是接口,接口类型等,对其有了大致了解之后,我们就回到主题-接口测试。 什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各…

7.SpringCloudAlibaba 整合 Sentinel

一、分布式系统遇到的问题 1 服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100%是可用的。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致调用服务瘫痪。 由于服务…

SDP协议是什么,详解SDP协议

一、SDP协议简介 SDP(Session Description Protocol)是一种会话描述协议,用于描述多媒体会话的参数。它是一种文本协议,通常用于VoIP(Voice over Internet Protocol)和视频会议等应用中。SDP协议定义了一种…

【自监督论文阅读 1】SimCLR

文章目录 一、摘要二、引言三、方法3.1 主要框架3.2 训练一个大的batchsize 四、数据增强4.1 实验一 数据增强的组合对学习好的特征表达非常重要4.2 对比学习需要更多的数据增强 五、一些实验证明5.1 大模型更有利于无监督对比学习5.2 非线性层的预测头增加了特征表示5.3可调节…

使用vtkWindow报错Debug Assertion Failed ... mfc140d.dll

环境:VS2022VTK7.1.1,还使用了MFC 报错信息 Debug Assertion Failed! Program: C:\WINDOWS SYSTEM32 mfc140d.dll File. D: a work 1 s src vctools VC7Libs ship ATLMFCnclude afxwin1.inLine: 21 For information on how your program can cause an a…

2023年智能优化算法之——能量谷优化器 Energy valley optimizer(EVO),附MATLAB代码和文献

能量谷优化器(EVO)是一种新的元启发式算法,它的算法是受到了关于稳定性和不同粒子衰变模式的先进物理原理的启发。在文献中,作者与CEC函数中最先进的算法进行了比较,并且证明该算法确实很强劲。算法原理大家请参考文献。 [1] Azizi M , Aic…

考研算法第27天:直接插入排序 【插入排序】

插入排序算法介绍 老规矩我们来模拟一遍样例: 其思想简单来说就是将旧数组的每个数放入到新数组中 但是每次放入都要遵守下面的原则:如果前面有比当前数大的数便把它放到当前数的后面去。 过程如下面这张图 https://ts1.cn.mm.bing.net/th/id/R-C.1d…

GPT-4满分通过MIT本科数学考试!这套提示词火了

量子位 | 公众号 QbitAI 万万想不到啊,MIT数学考试,被GPT-4攻破了?! 突然有人在最新论文工作中高调宣布: GPT-4在MIT的数学和EECS(电气工程和计算机科学系)本科学位考试中,表现出…

电商超卖,从业务到设计

编辑导语:超卖这一概念的定义可以从不同层面进行阐述,比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行,则容易让用户体验“打折”。为什么有时电商超卖的现象会发生?可以从哪些角度来降低超卖导致的风险&#…

Stable diffusion WebUI LoRA使用教学

在Stable Diffusion网络中,通常会下载社区中的LoRA模型,并对CLIP模型和Unet的CrossAttention的线性层进行微调。相应的被微调的层会有 lora_up 和 lora_down 两组参数,分别对应上述的 A 和 B 矩阵。参考高手的代码,只需根据LoRA保…

【Unity Shader】从入门到感慨万千(1)基本概念:什么是网格?什么是材质和Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如上图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则…

ShowMeBug与极狐(GitLab)战略合作,推动DevOps人才高效甄选

近日,ShowMeBug与领先的开放式一体化安全DevOps平台提供商极狐(GitLab)达成深度合作协议,双方将致力于共同打造具有行业强认可度以及高实用性的DevOps岗位题型,助力企业通过更为专业、标准的技术笔试题型,提升DevOps岗位人才筛选效…