【K8S系列】深入解析控制器

news2024/11/15 8:04:04

 目录

序言

1 基础介绍

1.1 前情提要

1.2  Kube-controller-manager介绍

1.3 控制器类型

2 使用介绍

2.1 控制循环

2.2 Deployment控制器

实际状态:

期望状态:

PodTemplate:

3 总结

4 投票


序言

在你想要放弃的时候,想想是什么让你当初坚持走到了这里。

Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s 控制器。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

1 基础介绍

1.1 前情提要

回忆一下,我和你详细介绍了 Pod 的用法,讲解了 Pod 这个 API 对象的各个字段。而接下来,我们就一起来看看“编排”这个 Kubernetes 项目最核心的功能吧。

实际上,你可能已经有所感悟:Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已。

说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说,还是太过简单了。

这就好比,集装箱固然好用,但是如果它四面都光秃秃的,吊车还怎么把这个集装箱吊起来并摆放好呢?

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

Kubernetes 操作这些“集装箱”的逻辑,都由控制器(Controller)完成

1.2  Kube-controller-manager介绍

Kube-controller-manager是Kubernetes中的一个控制器,是Kubernetes系统中的一个组件,负责运行一些后台控制循环(controller loop),并监视系统中的各个资源的状态

kube-controller-manager通常运行在Master节点上。kube-controller-manager包含了多个控制器,每个控制器都负责处理不同的资源。

1.3 控制器类型

以下是kube-controller-manager中的一些重要控制器:

  1. Deployment控制器:用于确保Deployment对象所管理的Pod副本数量符合预期,并且进行滚动更新(Rolling Update)。

  2. ReplicaSet控制器:用于确保ReplicaSet对象所管理的Pod副本数量符合预期。

  3. DaemonSet 控制器:DaemonSet 控制器用于在集群中的每个节点上启动一个 Pod 副本,以便运行一些系统级别的守护进程,如日志收集器和监控代理。如果有新的节点加入集群,DaemonSet 控制器会自动在新节点上启动相应的 Pod 副本。

  4. StatefulSet控制器:用于确保StatefulSet对象所管理的有状态应用程序的副本数量符合预期。

  5. Node控制器:用于确保所有Node对象的状态都是最新的,并管理Node的状态。

  6. Service控制器:用于确保Service对象的状态符合预期,并处理Service的创建、更新和删除等操作。

  7. Namespace控制器:用于确保Namespace对象的状态符合预期,并处理Namespace的创建、更新和删除等操作。

  8. Endpoint控制器:用于确保Endpoint对象的状态符合预期,并处理Endpoint的创建、更新和删除等操作。

  9. Job控制器:用于确保Job对象所管理的任务成功完成,并对失败的任务进行重试。

  10. CronJob控制器:用于确保CronJob对象所管理的定时任务按照预期执行。

在kube-controller-manager中,每个控制器都是一个独立的进程,它们之间相互独立,互不影响。同时,kube-controller-manager会自动监视资源对象的状态变化,并触发相应的控制器处理,以确保系统状态的一致性和稳定性。

2 使用介绍

2.1 控制循环

了解具体的使用之前,需要先看下“循环控制”这个概念

在 Kubernetes 中,控制循环(control loop)是一种通用的编排模式,用于监控和控制集群中的资源

控制循环通过对比当前状态和期望状态之间的差异来确保集群的期望状态得以实现

具体而言,控制循环包括以下几个步骤:

  1. 监控资源状态:控制循环会定期检查集群中的资源状态,例如 Pod、Service、Deployment 等。

  2. 计算期望状态:根据 Kubernetes 集群的配置文件和用户提交的操作,控制循环会计算出资源的期望状态。例如,用户可能会提交一个 Deployment 的 YAML 文件,其中指定了需要部署的 Pod 数量和镜像版本等信息,控制循环就会根据这些信息计算出 Deployment 的期望状态。

  3. 对比当前状态和期望状态:控制循环会将当前状态和期望状态进行对比,找出二者之间的差异。例如,如果一个 Deployment 的期望 Pod 数量为 3,但是当前只有 2 个 Pod 在运行,那么控制循环就会发现这个差异。

  4. 执行调整操作:控制循环会根据差异来执行调整操作,使得当前状态逐渐接近期望状态。例如,控制循环会自动创建新的 Pod,以便使得 Deployment 中的 Pod 数量达到期望值。

  5. 重复执行:控制循环会一直重复上述步骤,直到当前状态和期望状态完全一致。

注意,控制循环并不是一个线性的过程,而是由多个控制器(Controller)组成的复杂系统。每个控制器都会负责监控和管理一个或多个资源,例如 Deployment、StatefulSet、DaemonSet 等。不同的控制器之间还可以相互协作,以实现更复杂的功能。

2.2 Deployment控制器

我们曾经使用过 Deployment 这个最基本的控制器对象。现在,我们一起来回顾一下这个名叫 nginx-deployment 的例子:

apiVersion: apps/v1
kind: Deployment #资源类型
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

这个 Deployment 定义的编排动作非常简单,即:确保携带了 app=nginx 标签的 Pod 的个数,永远等于 spec.replicas 指定的个数,即 2 个

这就意味着,如果在这个集群中,携带 app=nginx 标签的 Pod 的个数大于 2 的时候,就会有旧的 Pod 被删除;反之,就会有新的 Pod 被创建。

这时,你也许就会好奇:究竟是 Kubernetes 项目中的哪个组件,在执行这些操作呢?

没错,就是今天介绍  kube-controller-manager 的组件。

那他具体怎么控制的呢?我们以这个 Deployment 为例,分析一下:

实际上,这个组件,是一系列控制器的集合。可以查看一下 Kubernetes 项目pkg/controller 目录:

$ cd kubernetes/pkg/controller/
$ ls -d */              
deployment/             job/                    podautoscaler/          
cloud/                  disruption/             namespace/              
replicaset/             serviceaccount/         volume/
cronjob/                garbagecollector/       nodelifecycle/          replication/            statefulset/            daemon/
...

这个目录下面的每一个控制器,都以独有的方式负责某种编排功能。而我们的 Deployment,正是这些控制器中的一种。

实际上,这些控制器之所以被统一放在 pkg/controller 目录下,就是因为它们都遵循 Kubernetes 项目中的一个通用编排模式,即:控制循环(control loop)。就是上面说的那个控制循环

比如,现在有一种待编排的对象 X,它有一个对应的控制器。那么,用一段 Go 语言风格的伪代码,描述这个控制循环

for {
  实际状态 := 获取集群中对象 X 的实际状态(Actual State)
  期望状态 := 获取集群中对象 X 的期望状态(Desired State)
  if 实际状态 == 期望状态{
    什么都不做
  } else {
    执行编排动作,将实际状态调整为期望状态
  }
}

实际状态:

在具体实现中,实际状态往往来自于 Kubernetes 集群本身

比如,kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它自己感兴趣的信息,这些都是常见的实际状态的来源。

期望状态:

而期望状态,一般来自于用户提交的 YAML 文件

比如,Deployment 对象中 Replicas 字段的值

很明显,这些信息往往都保存在 Etcd 中。接下来,以 Deployment 为例,简单描述一下它对控制器模型的实现:

  1. Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态

  2. Deployment 对象的 Replicas 字段的值就是期望状态

  3. Deployment 控制器将两个状态做比较,然后根据比较结果,确定是创建 Pod,还是删除已有的 Pod

PodTemplate:

其实,像 Deployment 这种控制器的设计原理,就是“用一种对象管理另一种对象”的“艺术”。

其中,这个控制器对象本身,负责定义被管理对象的期望状态。比如,Deployment 里的 replicas=2 这个字段。

被控制对象的定义,则来自于一个“模板”。比如,Deployment 里的 template 字段

可以看到,Deployment 这个 template 字段里的内容,跟一个标准的 Pod 对象的 API 定义,丝毫不差。而所有被这个 Deployment 管理的 Pod 实例,其实都是根据这个 template 字段的内容创建出来的。

像 Deployment 定义的 template 字段,在 Kubernetes 项目中有一个专有的名字,叫作 PodTemplate(Pod 模板)。

这个概念非常重要,因为后面讲解到的大多数控制器,都会使用 PodTemplate 来统一定义它所要管理的 Pod。更有意思的是,我们还会看到其他类型的对象模板,比如 Volume 的模板。

至此,对 Deployment 以及其他类似的控制器,做一个简单总结了: 

 如上图所示,类似 Deployment 这样的一个控制器,实际上都是由

  • 上半部分的控制器定义(包括期望状态)
  • 下半部分的被控制对象的模板组成的

3 总结

在这篇文章中,以 Deployment 为例,详细分享了 Kubernetes 项目如何通过一个称作“控制器模式”(controller pattern)的设计方法,来统一地实现对各种不同的对象或者资源进行的编排操作。

这个实现思路,正是 Kubernetes 项目进行容器编排的核心原理。

在此后讲解 Kubernetes 编排功能的文章中,我都会遵循这个逻辑展开,并且带你逐步领悟控制器模式在不同的容器化作业中的实现方式。

4 投票

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

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

相关文章

常见的上采样操作以及其Pytorch实现

文章目录 常见的上采样操作以及其Pytorch实现一、[插值](https://www.cnblogs.com/zhaozhibo/p/15024928.html)1.最近邻插值2.双线性插值3.双三次插值 二、反卷积三、sub-pixel Convolution四、其它方法1.[superpoint](https://arxiv.org/abs/1911.11763)使用方法2.待补充 常见…

Word 设置标题编号

用到了多级列表,所谓多级列表,就是为段落标上编号,并不一定就要对文字使用, 教程参考自Word 多级列表编号方法总结(二)——自定义编号 - 知乎 直接看我的就好了 假设我们有一个需求 类似于这样的三级标题…

【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?

开头导语由Chatgpt完成 当今互联网行业中,Java后端开发岗位的竞争异常激烈,对于面试者来说,掌握一些技巧和知识点将有助于脱颖而出。而对于SpringBoot框架的使用和运行机制,更是Java后端开发岗位中不可或缺的技能点之一。在Spring…

Python里的元组、列表和字典区别

列表:可更改、有序、可重复、元素可以是任何对象 列表示例:[1,a,[2,3]] 元组:不可更改、有序、可重复、元素可以是任何对象 元组示例:(b,1,[2,3]) 字典:可更改、无序、键不可重复、键不可变、值可以是任何对象&…

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存雪崩) Redis两种持久化方案详情对比(RDB、AOF)

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存雪崩) & Redis两种持久化方案详情对比(RDB、AOF) 1)Redis 面试题1.1.高频面试题:缓存穿透、缓存击穿、缓存雪崩1.2.低频面试题&…

校友小程序定制开发 带我们回到那个学生时代

学生时代总是给人一种单纯美好的感觉,也会是每个人记忆深处最深刻的回忆,尤其是一起学习生活几年的同窗随着毕业不得不各奔东西,但是大家都对母校有着不一样的情怀,也想有一个什么东西能够把各个高校校友联系在一起。校友小程序开…

瑞芯微 Rockchip rknn 模型在线预编译

瑞芯微 Rockchip rknn 模型在线预编译 flyfish 主机Host环境 Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy开发板Target环境 RV1126一 主机连接开发板 用线连起来后,查看usb信息 没权限的提示 no permissions (…

微信小程序笔记(1)

小程序笔记 小程序一个页面为什么有四个文件? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVdz4I1W-1681982063887)(C:\Users\26387\AppData\Roaming\Typora\typora-user-images\image-20230419170019877.png)] wxss:写页…

对学历贬值的再观察

最近在求职市场上观察到这样一个现象,有些4年前硕士学历就能进入的职业,现在都要博士了,不免让人有一种4年书白读的感觉。所以想再观察一下学历贬值,平复一下心情(不是)。 学历贬值的原因:供大于…

day1 Flappy bird项目介绍

项目介绍 功能分析: 1、按下空格小鸟上升,不按下落; 2、搭建小鸟需要穿过的管道; 3、管道自动左移和创建; 4、小鸟触碰到管道游戏结束; 知识储备: 1、C语言; 2、数据结构 -…

【Vue2源码】响应式原理

【Vue2源码】响应式原理 文章目录 【Vue2源码】响应式原理Vue响应式的核心设计思路整体流程响应式中的关键角色检测变化注意事项响应式原理数据观测重写数组7个变异方法增加__ob__属性__ob__有两大用处: Vue.js 基本上遵循 MVVM(Model–View–ViewModel&…

[oeasy]python0135_变量名与下划线_dunder_声明与赋值

变量定义 回忆上次内容 变量 就是 能变的量上次研究了 变量标识符的 规则 第一个字符 应该是 字母或下划线合法的标识符可以包括 大小写字母数字下划线 还研究了字符串(str)的函数 isidentifier查询字符串 是否为合法标识符 最后发现 这个isidentifier函数有时候不好使&…

实战iOS App 重签名

熟悉iOS开发的同学都知道,iOS应用的上架流程主要分为以下几步: 创建开发者账号借助辅助工具appuploader创建证书,描述文件iTunes connect创建App打包IPA上传App Store等待审核在签名的流程中,有一个App重签名的步骤,主要针对的是一些大公司有多个App的情况,多个App一个申…

Linux设备驱动开发 - S3C2440时钟分析

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 系统框架图FLCK,HCLK,PCLK时钟源的选择 时钟体系流程流程分析驱动中的clk 系统框架图 2440是一个SOC(system on …

【网络编程】网络编程 和 Socket 套接字认识

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🎧一. 网络编程基础🎺1. 为什么需要网络编程?🎷2. 什么是网络编程🎸3. 网络编程中的基础概念 🎿二. So…

继续学习Easyx

画圆角矩形函数:roundrect,前四个参数是和矩形一样的,表示先画一个矩形,然后就是要画它的圆角了,要怎么画它的圆角?这里使用四个一样的椭圆来将它的四个角画出来,而在这个里面的椭圆不再需要四个…

MySQL8.0.33主从复制配置记录

目录 1. 下载2. 解压3.重命名4.创建存储数据文件5. 设置用户组并赋权6. 初始化MySQL7.配置文件8. 启动MySQL9. 设置软连接,并重启MySQL10. 登录并更改密码11. 开放远程连接12. 连接工具测试连接MySQL13. 开机自启配置14.从服务器配置15. 主库配置16. 从库配置17. 测…

功率MOS管烧毁,有这些原因

功率MOS管烧毁的原因以及相应的预防措施。在本文中,我将会介绍功率MOS管的基本结构、工作原理,以及可能导致功率MOS管烧毁的原因,并提供相应的解决方案。 1. 功率MOS管的基本结构和工作原理 功率MOS管是一种常用的功率电子器件,…

SpringBoot集成MyBatis-plus

SpringBoot集成MyBatis-plus 一、Mybatis-Plus简介1.简介2.特性3.官网及文档地址 二、入门案例1.开发环境2.创建数据库及表3.创建Springboot项目导入依赖4.配置application.yml5.启动类6.实体类7.添加mapper8.添加UserController9.日志配置 三、CURD1.BaseMapper2.通用Service …

事件主循环

一、事件主循环 1、事件处理主流程 libevent的事件循环主要是通过event_base_loop函数来完成,其主要的操作如下: 1、根据timer-heap中的事件最小超时时间,计算系统I/O demultiplexer的最大等待时间。例如:当底层使用的是Linux提供…