当前位置: 首页 > news >正文

k8s 自身原理 2

前面我们说到 K8S 的基本原理和涉及的四大组件,分享了前两个组件 etcd 和 ApiServer

这一次我们接着分享一波:

  • 调度器 scheduler
  • 控制器管理器 controller manager

调度器 scheduler

调度器,见名知意,用于调度 k8s 资源的,那么这个调度器具体主要是调度啥资源呢?

实际上看我们 k8s 中运行的一个一个的 pod,这些 pod 在我们创建的时候,还记得我们有分享过是可以指定即将要生成的 pod 默认被调度了指定节点吗?

一般情况下,我们也没有去刻意指定 pod 要调度到哪个节点,但是最终 pod 一定会被调度到集群中的某一个节点

实际上,这就是调度器在起作用了,没错,调度器就是调度 pod 资源到对应的节点上

咱们的调度器也是利用了 API 服务器的监听机制来新创建 pod 资源的,创建好的 pod 资源,会将其调度到资源充足,甚至没有 pod 的节点上

那么你是否会认为是调度器直接控制节点来运行指定的 pod?

nonono,并不是这样的,前面我们有说到过基本上很多的组件都是通过 ApiServer 来进行处理的

调度器在这里也不例外,

这里的是调度器是通过 ApiServer 来更新 pod 的定义,然后 ApiServer 再去通知 Kubelet 这个 pod 已经被调度器调度过了,这个时候,实际对应节点上的 Kubelet 发现自己节点上有 pod 被调度过来,那么 kubelet 就会创建并且运行 pod 中的容器

那么 k8s 默认是如何调度 pod 的?总有一个优先级吧

是的没错,总会有一定的规则,咱们画个图来感受一下:

例如一开始集群中有 4 个节点,在运行过程中,节点 2 和 节点 3 变为不可用了,接下来,若有新的 pod 需要调度,那么调度器会从可用的 2 个节点里面选择一个最优的节点,

例如磁盘,内存空间较大,或者 pod 资源个数较少的,会按照综合优先级递减排序,

例如就会生成 pod 调度到节点 4

那么问题就来了,k8s 是如何找到满足需求的可用节点呢?

当然 k8s 找到可用节点的条件也是不少了,不是随便一个节点就可以接得住的,例如 k8s 会检查这些条件

  • 节点的资源是否被耗尽了
  • pod 是否设置了一定要 / 一定不要 调度到某一个节点上
  • 如果这个 pod 需要绑定主机的端口,那么该节点的端口是否被占用了
  • 节点可以满足创建 pod 对应硬件资源的要求吗
  • 该节点上有没有和我们即将要创建的 pod 参数和规格一致的标签呢
  • pod 若需要特定的卷,该节点支持吗
  • … 等等

以上的条件都必须要满足,才有机会将 pod 调度到这个节点上来

我们是否可以设置 pod 全部集中在一个节点,或者分散到多个节点中去呢?

实际上我们知道管理 pod 的资源是 RS / RC,一般情况下 他们会尽可能的将 pod 分散到不同的节点上面,但是也不能保证每一次都是这样的

如果我们自己有需求,可以在 pod 模板中设置 pod 的亲缘性 和 非亲缘性来设置定,pod 调度到哪些符合要求的节点上去

总的来说,pod 分散到不同的节点可以降低风险,增强健壮性,若其中一个节点挂掉,并不会应 pod 提供的服务

之前说到 etcd ,ApiServer 都可以是多个的,那么这里的调度器仍然可以是多个,若是真的只有一个调度器,服务多了之后他也扛不住嘞

我们也可以看到 kube-system 命名空间中

这些核心组件都是以 pod 的方式运行的,如果我们需要多个 scheduler,那么就多创建几个就好了

但是我们在创建 pod 的时候,如果没有指定使用哪一个调度器去调度的话,那么 k8s 中会使用默认的调度器,如果我们有需求,实际可以在 pod 模板中使用 shedulerName 关键字来指定调度器的名字

控制器管理器 controller manager

控制器管理器 controller manager 见名知意,他是一个管理器 manager,管理的对象是控制器 controller

Replication 管理器,我们可以理解为资源管理器,也就是我们之前学过的 RC ,ReplicationController

控制器的话就比较多了,之前我们学过的大部分资源,都有对应的控制器进行管控,例如:

  • Node 控制器
  • Service 控制器
  • Endpoints 控制器
  • Namespace 控制器
  • ReplicaSet 控制器
  • DaemonSet 控制器
  • Job 控制器
  • Deployment 控制器
  • StatefulSet 控制器
  • PersistentVolume 控制器

为啥需要控制器管理器?

之前分享的各个组件中,他们就好像只管好自己就可以独善其身了,总得有一个角色为大家负重前行吧

比如说, ApiServer 只去和 etcd 交互,然后通知监听的客户端有变更 , 调度器 Scheduler 又仅仅是给 pod 分配节点

那么对于资源的扩缩容,以及资源的期望状态,又谁来进行监听和处理呢?

那就得 控制器管理器了

那么我们上述的控制器主要是干啥?

首先通过控制器的名字,我们应该是知道这些控制器主要是控制自己对应资源的状态的

然而不仅仅是这一点哦,控制器做的事情就稍微杂一点,综合能力比较强

例如:

  • 控制器会监听 ApiServer 资源变更
  • 执行相应的操作,例如创建,编辑,删除,查看等等

这里的控制器也是不会相互通信的,都是和 ApiServer 交互,可以理解为 控制器一直在做满足别人期望的事情,是一个调和的角色

例如,我们将期望的副本数,改变了,那么控制器便会去处理,直到满足期望后,将最新的状态写入资源的 status

那么 Replication 管理器又是何方神圣?

刚才有说到他是管理控制器的,控制器又那么多,可以把他看做控制器的管家吧

官方定义,启动 ReplicationController 资源的控制器叫做 Replication 管理器

那么对于 RC 的行为我们应该心里都有数吧,当修改了 RC 的副本数之后,RC 回去调和 pod 的数量

这个实际动作,其实是 Replication 管理器 这个幕后大佬做的

之前我们说到 RC 的时候,当我们修改这个副本数,大家是否会认为, k8s 中会有一个轮询机制,当获取到 RC 的副本变化的时候,会去满足期望?

实际上也是和 ApiServer 那一块分享的类似,此处也是用到了监听机制,控制器会通过监听机制订阅可能会影响期望副本数的变更事件

若有变更事情时,则会做出相应动作

RC 会实际去运行 pod 吗?

看到这里,是否还会有疑问,既然 RC 会去满足期望,那么是 RC 直接去运行的 pod 吗?

并不是的

当出现当前数量和期望副本数量不一致的时候, RC 回去创建新的 pod 清单,并发布到 APiServer 上,最终会让调度器和节点上的 Kubelet 来调度 pod 并运行 pod

管理器管理那么多的控制器,肯定有一个统一管理资源的管理流程的,具体的简单流程如下:

image-20220219122523501

简单来说,就是 Replication 管理器会监听具体的资源,然后通过 ApiServer 来操作对应的资源对象,最终达到更新的目的

当然,其他控制器也是这样的,都是监听资源,通过 ApiServer 进行更新资源

每一种控制器,实际上我们在分享到其对应资源的时候,基本都有分享到他们的行为,这里就不再重复了

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

相关文章:

k8s 自身原理 2

前面我们说到 K8S 的基本原理和涉及的四大组件,分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波: 调度器 scheduler控制器管理器 controller manager 调度器 scheduler 调度器,见名知意,用于调度 k8s 资源的&…...

解决hbase节点已下线,但在status中显示为dead问题

工作中需要下线4台hbase小节点,下线完成后使用status 命令查看,有一台为dead状态: 使用status detailed 查看,发现“hd-03"这台节点是dead。 检查各节点配置文件无误,并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重启两个…...

深入理解Python装饰器:解析高阶函数与代码美学

文章目录 🍀引言🍀什么是装饰器?🍀装饰器的基本用法🍀带参数的装饰器🍀类装饰器🍀总结 🍀引言 当谈到Python编程中的高级特性时,装饰器(decorators&#xff0…...

构建之法 - 软件工程实践教学:每天都向前推进一点点

作者:福州⼤学 汪璟玢⽼师 汪老师:每次都向前推进一点点,哪怕只有一点点,也好过什么都不做。 ​邹老师:对,几个学期下来,就已经超过那些“空想”的团队很远了。坚持下去! 汪老师&…...

CSS transform:rotate;无效问题

CSS设置旋转 transform:rotate无效。 今天遇到一个奇怪的问题,CSS给 icon图标设置一个hover 旋转180deg的效果,不生效。 一度任务样式被覆盖了,样式不生效没选中元素的class。但是设置hover改变大小是生效的。奇怪了? 为什么会无…...

华为新版ENSP PRO模拟器测评:性能表现与功能扩展一览

一、引言 在网络领域不断涌现的新技术和复杂的网络拓扑要求,推动了网络设备模拟器的持续发展和创新。华为作为一家领先的通信技术解决方案提供商,不断致力于为网络工程师和技术从业人员提供更优秀的仿真环境。最近,华为推出了ensp pro模拟器的…...

BBS-个人博客项目完整搭建、BBS多人博客项目基本功能和需求、项目程序设计、BBS数据库表结构设计、创建BBS表模型

一、BBS-个人博客项目完整搭建 项目开发流程 一、项目分类 现在互联网公司需要开发的主流web项目一般分为两类:面向互联网用户,和公司内部管理。面向互联网用户: C(consumer)端项目 公司内部管理:B(business)端项目还有一类web应用&#xff…...

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性,帮助企业降低运营成本、提高生产效率,并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响: …...

取证--实操

2022年美亚杯个人赛 运用软件DB Browser for SQLite (一款用于查看SQLlite数据库文件的浏览器工具) 火眼,盘古石手机取证系统等 案件详情 于2022年10月,有市民因接获伪冒快递公司的电邮,不慎地于匪徒架设的假网站提…...

react组件化开发详解

React是一个流行的JavaScript库,用于构建用户界面,并且以组件化的方式进行开发。下面将详解React组件化开发的概念和步骤: 组件化思维: 组件化开发是将复杂的用户界面划分为独立、可重用的小部件(组件)。…...

【JVM】对String::intern()方法深入详解(JDK7及以上)

文章目录 1、什么是intern?2、经典例题解释例1例2例3 1、什么是intern? String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用&#…...

7.1 C/C++ 实现动态数组

动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在不浪费空间的情况下根据需要…...

iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)

文章目录 前言开发环境问题描述问题分析1. 定位问题2. 逆向分析2.1. IDA Free2.2. Hopper Disassembler Demo 3. 模拟器日志4. supportedArchs 解决方案最后 前言 最近新需求很多,项目改动很大,开发完成后想测一遍在低版本iOS系统上的兼容性&#xff0c…...

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1:自定义水滴头像(自定义标注覆盖物、Overlay覆盖类) 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…...

R语言生存分析(机器学习)(2)——Enet(弹性网络)

弹性网络(Elastic Net):是一种用于回归分析的统计方法,它是岭回归(Ridge Regression)和lasso回归(Lasso Regression)的结合,旨在克服它们各自的一些限制。弹性网络能够同时考虑L1正则…...

【Docker】使用 Docker Registry 搭建自己的 Docker 镜像仓库

使用 Docker Registry 搭建自己的 Docker 镜像仓库 在使用 Docker 进行应用程序的开发和部署时,使用 Docker 镜像仓库是一个很好的实践。它允许集中存储和管理 Docker 镜像,方便团队协作和版本控制。在本文中,将介绍如何使用 Docker Registr…...

Spring 是什么框架?

Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java 企业…...

Azure添加网络接口

添加网络接口的意义 在 Azure 上,为虚拟机添加网络接口的意义包括以下几个方面: 扩展网络带宽:通过添加多个网络接口,可以增加虚拟机的网络带宽,提高网络传输速度和数据吞吐量。实现网络隔离:每个网络接口…...

Linux 内核第一版 (v0.01) 开源代码解读

探索Linux v0.01的内部结构,Linux内核经常被认为是一个庞大的开源软件。在撰写本文时,最新版本是v6.5-rc5,包含36M行代码。不用说,Linux是几十年来许多贡献者辛勤工作的成果。 Linux 内核首个开源版本 (v0.01) 的体积非常小&…...

tp6 v3微信退款

/*** Notes:退款* param $out_trade_no 支付时候订单号(order表 original_bn)两个参数选一个这个要选对* param $out_refund_no 退款订单号* param $total 订单金额* param $refund 退款金额* Time: 2023-08-10*/public function refundMoney($out_trade…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...