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

news2024/9/21 5:30:51

前言

大家好,我是秋意零。

上一篇结束了 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…

在这里插入图片描述

一、控制器模型

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/659593.html

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

相关文章

Windows 安装 Podman Desktop

Windows 安装 Podman Desktop podman 简介概述和范围Roadmap 路线图Rootless 无根 podman 安装说明Podman for Windows前置条件安装 podman自动 WSL 安装机器初始化过程启动 machine Rootful & Rootless安装 podman desktop podman 命令介绍podman -hpodman machine -h 参考…

2023最新最全!蓝队护网初级面试题大合集!必看!

前言 1.先来个自我介绍 答:本人从事网络安全工作10年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。 随着网络安全被列为国家安全战略的一部分&#xff0c…

deepstream指北——安装配置篇

目录 一、机器配置二、安装教程1. 软件对应版本要求2. 安装 三、运行示例 参考博客:https://blog.csdn.net/m0_73702795/article/details/127940733 (ps: deepstream的参考资料太少了-_-||,上面这个是我见过最详细的) 一、机器配…

SDN是什么?详解软件定义网络技术原理与应用

目录 一、引言 二、SDN原理 三、SDN优势 四、SDN应用前景 五、最后的话 一、引言 SDN,即Software-Defined Networking,即软件定义网络技术,是近年来新兴的网络技术,其主要思想是将网络的控制平面和数据平面进行分离&#xff…

阿里巴巴最新出版的 Java 面试参考指南(泰山版)开源了!

谈到 Java 面试,相信大家第一时间脑子里想到的词肯定是金三银四,金九银十。好像大家的潜意识里做 Java 开发的都得在这个时候才能出去面试,跳槽成功率才高!但 LZ 不这么认为,LZ 觉得我们做技术的一生中会遇到很多大大小…

html 前端笔记常用样式和方法

目录 textarea宽高固定 Js获取文本框中鼠标选中文本 Js设置鼠标选中文本 Js追加/清空表格 自定义CheckBox 颜色 多选框选中和反选操作多次后attr()不生效 JS转Json 选择器 textarea宽高固定 style"resize: vertical" resize: vertical 宽固定none 宽高固定bo…

Windows系统如何将frp或其他应用配置为service服务并开机自启?

本文使用WinSW实现service服务配置 WinSW(Windows Service Wrapper)是一个开源的 Windows 服务包装器,它可以将任何可执行文件(如 Java 应用程序、Python 脚本、Ruby 脚本等)转换为 Windows 服务,并为其提供…

绩点计算 - C/C++ 语法基础

某大学的GPA(绩点)计算规则如下: 课程百分制成绩90分对应绩点4.0,超过90分的,按90分计;如不足90分,则课程绩点 4.0 * 分数/90。 学生综合绩点按该生已修的各门课程绩点结合学分加权平均而得。 现有步步同学入学后的已…

关于VPN的一些总结和理解

关于VPN的一些总结和理解 前言一、VPN的概述二、VPN的原理2.1 原理概述2.2 虚拟网卡2.3 点对点隧道的建立 三、其他3.1 vpn和vlan的区别?3.2 vpn和web代理的关系? 参考 前言 同样的机缘巧合,最近看了一些关于vpn的内容,总结一下&a…

NVM安装使用

电脑重装了系统,需要重新安装软件应用,顺便记录一下安装过程。 NVM是一个Node的版本管理工具,通过NVM可以方便的切换Node的版本 安装 下载,去github下载 Releases coreybutler/nvm-windows 运行安装程序 使用 接下来使用…

局域网内海量文件快速复制方法

遇到的问题:最近需要不同磁盘和服务器间大文件(一个文件夹几十 T,里面有很多小文件)的快速复制,直接通过默认复制卡死。 解决方法:FastCopy,官网:FastCopy ,测试速度能能…

vue2旧项目 极速打包实践

背景 公司项目的体量较大,每次serve需要1分钟左右,build需要3分多钟,这是在电脑资源空闲时的速度,如果浏览器开了10几个标签啥的,更慢了。每次改点东西打包发测试环境都很难受。 项目技术栈 // package.json{"d…

百万粉丝都在看的Python上手教程----滚雪球学Python

前言: Hello大家好,我是Dream。 今天为大家带来一本书:《滚雪球学Python》 一起来看看吧~ 《滚雪球学Python》之所以这样命名本书,是希望大家用滚雪球的思维学习编程语言,“滚”的第一遍,从全局掌握Python技…

大话Stable-Diffusion-Webui-动手开发一个简单的stable-diffusion-webui(三)

文章目录 原理文生图API组件的输入TypeScript响应式数据文生图API调用Axios安装使用配置代理文生图API调用调用结果处理图片渲染安装swiper代码仓库原理 上一篇内容中,我们已经将文生图功能的整体UI界面设计好了,这一篇内容将通过调用sd的API,使得我们设计的UI与sd进行联动…

多域名实现单点登录详解

Hi I’m Shendi 多域名实现单点登录详解 简介 在很久以前给自己的网站制作了登录系统,但因为个人备案等原因没有需要用到登录的地方,于是就没有特意去完善这部分功能,仅仅是将用户部分抽取出来作为一个微服务 最近编写一个转换工具&#xf…

unittest教程__认识unittest(1)

unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件。 使用unittest前需要了解该框架的五个概念: 即test case,test suite,test loader,test runner,test fixture。 …

【多线程】锁策略、CAS、Synchronized

目录 常见的锁策略 乐观锁 vs 悲观锁 悲观锁: 乐观锁: 读写锁 重量级锁 vs 轻量级锁 自旋锁(Spin Lock) 公平锁 vs 非公平锁 可重入锁 vs 不可重入锁 CAS 什么是 CAS CAS 是怎么实现的 CAS 有哪些应用 1) 实现原子类 2) 实现自…

从0到1使用NodeJS编写后端接口的实战案例(仅供参考)

目录 一、项目简介 1、使用技术 2、实现的主要功能 3、项目结构 二、开发环境准备 1、安装node.js 2、安装 MYSQL 数据库 3、安装 node.js 的 mysql 驱动 4、安装 Express 框架 5、Node 格式化时间模块Silly-datetime 6、安装 nodemon 三、后端代码 1、入口文件 —…

帝国cms城市分站系统开发:首页友情链接和分站友情链接分开调用

第一步:phome_enewslink 增加myarea字段 字段类型:int,长度6,非null字段,默认值0 或者在帝国cms后台执行 sql语句: alter table [!db.pre!]enewslink add myarea int(6) not null; 第二步:修…

二次封装NavLink(React实现)

实现思路: 1、定义一个普通组件 2、普通组件内使用NavLink 3、传递参数给定义的普通组件并实现效果 代码实现: App.jsx import React, { Component } from "react"; import About from "../src/Pages/About"; import Home fro…