【云原生】Kubernetes中的List-Watch机制详解与容器生命周期

news2024/11/15 11:35:41

目录

引言

一、List-Watch机制概述

(一)基本概念

(二)工作机制

1.List操作

2.Watch操作

(三)数据流向

1.按模块划分

2.按整体总结

二、Pod生命周期

(一)生命周期

1.创建

2.调度

3.初始化容器启动

4.镜像拉取

5.容器创建与运行

6.健康检查与就绪检测

7.重启策略

8.清理

9.终止

(二)生命周期状态

1.Pending

2.Running

3.Succeeded

4.Failed

5.Unknown


引言

在Kubernetes(K8s)这个庞大的分布式系统中,资源的实时更新和响应对于维持集群的稳定性和高效性至关重要。而List-Watch机制正是Kubernetes实现这一目标的核心手段。本文将详细介绍Kubernetes中的List-Watch机制,与容器的生命周期。包括其工作原理、应用场景以及性能优化等方面。

一、List-Watch机制概述

(一)基本概念

List-Watch是Kubernetes API Server提供的一种资源监控机制。它允许客户端通过API Server获取资源对象的列表(List),并通过建立长连接(Watch)来实时监控资源对象的变化。当资源对象发生创建、更新或删除等操作时,API Server会向订阅了相关资源的客户端发送事件通知,实现资源的实时同步和响应

(二)工作机制

List-Watch机制的工作原理可以简单概括为以下两个步骤

1.List操作

客户端向Kubernetes API Server发送List请求,指定要获取的资源类型和筛选条件。API Server根据请求返回符合条件的资源对象列表。客户端可以根据这个列表来初始化自己的状态或进行其他操作。

2.Watch操作

客户端在获取到资源对象列表后,可以继续向API Server发送Watch请求,建立与API Server的长连接。API Server会持续监控指定资源的变化,并将变化事件以流的形式发送给客户端。客户端可以解析这些事件通知,并触发相应的处理逻辑。

(三)数据流向

1.按模块划分

初始化阶段:Kubernetes的各种组件(如Controller Manager、Scheduler、kubelet等)在启动时,会与APIServer建立连接,并初始化List-Watch机制。

List操作:组件向APIServer发送List请求,获取当前集群中指定资源类型的所有资源对象列表。例如,Controller Manager可能会请求获取所有Pod的列表。APIServer处理List请求,查询etcd存储系统,并将结果返回给组件。

Watch操作:组件向APIServer发送Watch请求,建立一个长连接,用于监听指定资源类型的变化。APIServer处理Watch请求,并在内部与etcd建立Watch连接,以监听etcd中对应资源的变化。

事件触发:当etcd中的资源发生变化(如Pod的创建、更新或删除)时,etcd会发送一个事件通知给APIServer。APIServer接收到事件通知后,会将事件封装成HTTP响应,并通过之前建立的长连接发送给对应的组件。

组件处理:组件接收到APIServer发送的事件通知后,会解析通知中的信息,并根据事件的类型(如ADD、UPDATE、DELETE)执行相应的操作。例如,如果Controller Manager接收到Pod被创建的事件,它可能会触发相应的控制器逻辑,如ReplicaSet控制器会根据Pod的创建来调整副本集的状态。

数据同步:通过List-Watch机制,Kubernetes的各个组件能够实时感知集群中资源的变化,并据此进行相应的操作,从而保持数据的同步和一致性。

2.按整体总结

1)这里有三个 List-Watch,分别是 Controller Manager(运行在 Master),Scheduler(运行在 Master),kubelet(运行在 Node)。 它们在进程已启动就会监听(Watch)APIServer 发出来的事件

2)用户通过 kubectl 或其他 API 客户端提交请求给 APIServer 来建立一个 Pod 对象副本。

3)APIServer将Pod对象的元数据信息存入ETCD当中,待存储完毕后,APIServer会将确认信息返回给客户端,同时ETCD会将创建Pod副本的事件发送给APIServer

4)由于Controller-Manager 一直在监听(Watch,通过https的6443端口)APIServer 中的事件。此时 APIServer 接受到了Create(创建Pod副本)事件,又会发送给Controller Manager

5)Controller Manager 在接到 Create 事件以后,调用其中的 Replication Controller 来保证 Node 上面需要创建的副本数量。一旦副本数量少于 RC 中定义的数量,RC 会自动创建副本。总之它是保证副本数量的 Controller(PS:扩容缩容的担当)

6)在Controller-Manager创建Pod副本以后,APIServer会在ETCD中记录这个Pod的详细信息。例如Pod的副本数,Container的内容是什么

7)同样的ETCD会将创建Pod的信息通过事件发送给APIServer

8)由于Scheduler在监听(Watch)APIServer,APIServer会将Create事件发送到Scheduler,Scheduler接收到事件后,会根据预选与优选策略,为该事件选择合适的node节点,

9)Scheduler 调度完毕以后会更新Pod的信息,此时的信息更加丰富了。除了知道Pod的副本数量,副本内容。还知道部署到哪个Node上面了。并将上面的Pod信息更新至API Server,

10) APIServer更新至ETCD中,保存起来

11)ETCD将更新成功的事件发送给 APIServer,APIServer 也开始反映此 Pod 对象的调度结果

12)kubelet是在Node上面运行的进程,它也通过List-Watch的方式监听(Watch,通过https的6443端口)APIServer发送的Pod更新的事件。kubelet会尝试在当前节点上调用Docker启动容器,并将Pod以及容器的结果状态回送至APIServer,同时kubelet会负责Pod的整个生命周期

13)最后,APIServer将Pod状态信息存入ETCD中。在ETCD确认写入操作成功完成后,APIServer将确认信息发送至相关的kubelet,事件将通过它被接受

注释:kubelet持续监控Pod状态,当kubectl发送删除、扩容、缩容等指令时,会将以上流程重复一遍,而后根据最新的情况,在node节点中调整部署资源

二、Pod生命周期

Pod的生命周期从创建开始,经历一系列阶段直至最终终止或被删除。

(一)生命周期

1.创建

用户通过创建一个新的Pod对象来请求Kubernetes调度器为Pod分配资源。

Kubernetes系统会赋予Pod一个唯一的ID(UID)。

2.调度

Pod被提交到集群后,调度器根据节点资源可用性和Pod的资源需求、亲和性/反亲和性规则等选择合适的节点,并将Pod绑定到该节点上。

3.初始化容器启动

若Pod定义中包含初始化容器(init containers),这些容器会在主容器启动前按顺序执行,用于设置运行主容器所需的条件或环境。

每个Init容器都必须在下一个Init容器启动之前成功完成。

如果Pod的Init容器失败,并且Pod的重启策略(restartPolicy)值为“Always”,则kubelet会不断地重启该Init容器直到该容器成功为止。但如果Pod的重启策略值为“Never”,则Kubernetes不会重新启动Pod。

4.镜像拉取

主容器对应的镜像如果没有在节点上,则kubelet负责从注册表中拉取镜像。

5.容器创建与运行

kubelet根据Pod Spec创建并启动主容器。

容器状态会经历从Pending(等待中)到Running(运行中)的变化。

6.健康检查与就绪检测

在容器运行期间,kubelet可以配置并执行健康检查(liveness probes)和就绪检查(readiness probes)以确保容器正常工作。

Liveness Probe用于判断容器是否存活,若失败则可能重启容器。

Readiness Probe用于决定容器是否准备好接收流量,只有当容器处于ready状态时,Service才会将其添加到服务端点列表中。

7.重启策略

根据Pod的重启策略(Always、OnFailure或Never),kubelet会决定在容器退出时应采取何种行动。

8.清理

当Pod被删除或者由于某种原因需要终止时,kubelet会按照预定义的优雅关闭策略通知容器停止服务,并等待一段时间让容器完成任何必要的清理操作。

清理完成后,kubelet会真正删除Pod及其相关的容器实例和其他资源。

9.终止

Pod完全从节点上移除。

此外,Pod生命周期中还包括容器启动后钩子(post-start hook)和停止前钩子(pre-stop hook),这些钩子允许在容器启动后和停止前执行特定的操作。

(二)生命周期状态

Pod的生命周期状态主要包括

1.Pending

Pod已经被Kubernetes系统接受,但是有一个或多个容器镜像尚未创建。

Pod等待被调度到一个节点上。可能涉及下载镜像、分配IP地址、执行初始化容器等操作。

如果Pod一直处于等待中,可能是由于资源不足、调度问题或其他原因导致。

2.Running

Pod已经被调度至某节点,所有容器都已经被kubelet创建完成,且至少有一个容器处于启动、重启或运行过程中。

3.Succeeded

Pod中的所有容器都已成功完成并退出。

通常适用于一次性或批处理作业。

4.Failed

Pod中的一个或多个容器由于某种原因失败。

这可能是由于容器的退出代码非零、初始化容器失败、依赖资源不可用等原因导致。

5.Unknown

由于某种原因,Pod的状态无法确定。

这可能是由于与API服务器的通信问题或其他异常情况导致。

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

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

相关文章

单片机方案开发个性定制

酷得智能是玩具企业合作方案商,致力于为玩具企业提供一站式的智能化解决方案。我们拥有丰富的行业经验和技术实力,能够根据客户的需求和市场趋势,为其量身定制最适合的智能玩具产品和解决方案。 主营业务: 东莞市酷得智能科技有限…

实时工业数据采集分析平台:推动工厂智能化的关键

在当今的工业领域,随着科技的飞速发展和竞争的日益激烈,实现工厂的智能化已成为企业追求持续发展的关键目标。而实时工业数据采集分析平台作为推动工厂智能化的重要力量,正发挥着重要的作用。 实时工业数据采集分析平台能够全方位、高精度地…

Linux 中的进程优先级管理

在 Linux 系统中,理解和管理进程优先级是维护系统性能的关键因素。本文将详细介绍进程优先级(priority)的基本概念、如何查看和调整进程优先级,以及 nice 值对优先级的影响。 基本概念 在多任务操作系统中,CPU 资源的…

JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解

字符串和相关API java不会字符串即凉一半 学好字符串很重要 API 为应用程序编程接口 获得字符串对象 1.直接赋值 空参构造 string s1“abc”; s1 记录的是串池里的地址 2.用new的方式 string s2new string(); new(在堆内存里开辟空…

JSON-RPC跨域通信:Python服务器端解决方案与Js客户端 Mozilla扩展程序

问题背景 构建一个 Mozilla 扩展程序,与远程服务器上的 Python 应用程序进行通信以发送和接收数据。Python 应用程序可以通过 Python 控制台使用 xml-rpc 调用。尝试设计一个 JSON-RPC 来联系同一个应用程序。开发 Python 服务器端,可以通过 python 控制…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线,回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息,但是ETH上下插针,杵在3.8k,微微下跌。定睛仔细一看,SEC批准了,但又没完全批准,这特么是薛定谔的批准哈&…

【多线程】线程安全

目录 1.观察线程不安全 2.线程不安全的原因 2.1 随机调度 2.2 修改共享数据 2.3 原子性 2.4 内存可见性 2.5 指令重排序 3.synchronized 加锁操作 3.1 synchronized是什么? 3.2 synchronized的特性 1) 互斥 2) 可重入 3.3 synchronized使用示例 3.3.1 针…

安卓手机APP开发__平台的架构

安卓手机APP开发__平台的架构 目录 概述 安卓软件栈 Linux内核 硬件抽象层(HAL) 安卓运行时 原生的C/C代码库 Java API框架 系统APP 概述 安卓是一个开源的,基于Linux的软件栈,它创建一个设备和形式因素的很宽的矩阵。 下图展示了安卓平台的所有…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

C字符串和内存函数介绍(二)——长度不固定的字符串函数

前面我们一起学习了strlen,strcpy,strcmp,strcat的使用以及它们的模拟实现,它们的特点是你传参的时候,传过去的是数组首元素的地址,然后无论是计算长度,实现拷贝,相互比较还是进行追…

布局、基本控件

一、as布局 布局文件 layout drawable 设置背景的文件 新建drawable-xhdpi文件 — 放一些item或图片 values: theme app风格,string 字符串(相当于宏定义,可以引用),colors颜色配置(可以引用…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具,它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象,并最终促进销售。新闻稿推广策略有哪些?接下来伯乐网络传媒就来给大家分享一下。 确定目标受众:在撰写新闻稿之前,明确你…

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接

前言 前段时间遇到一个需求:导出变量到Excel里面,这里给出一些命令,同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中,可以使用以下命令来读写Excel文件: 读取Excel文件: xlsread(filen…

文件加密软件排行榜前十:好用的文件加密软件推荐

文件加密软件是企业保护数据安全的有效手段。 选择文件加密软件时,不仅要考虑加密强度,还要兼顾易用性、兼容性及是否满足特定需求。 下面小编将推荐几款好用的文件加密软件,比如以下十款软件排行榜。 以下十款软件各有所长,有…

全能集成开发平台Team·IDE

三甲医院的床位太难等了。反正也是小手术,老苏周五在附近找了家二甲医院,幸运的是,门诊迅速为我开具了入院证。周六早晨就接受了手术,周日挂了一天水,周一下午就出院了。准备在家先休息两天。 2~4 周之后把支架取出来…

数据挖掘实战-基于余弦相似度的印度美食推荐系统

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

机器人非线性控制系统:相关知识点整理

机器人控制系统本质上是一个非线性系统。引起机器人非线性因素很多,机器人的结构、传动件、驱动元件等都会引起系统的非线性。 机器人控制系统是由多关节组成的一个多变量控制系统,且各关节间具有耦合作用。具体表现为某一个关节的运动,会对…

全球AI新闻速递527

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

机器人回调接口完善

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑封禁账号!!!本人不对任何工具的使用负责&am…