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

目录

引言

一、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.mzph.cn/bicheng/16910.shtml

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

相关文章

5款好用的AI写作软件,一键生成高质量文章

在当今信息快速发展的时代,AI写作软件逐渐成为创作者们的得力助手。它们能够凭借先进的技术和算法,一键生成高质量的文章,为创作者们节省大量的创作时间和精力。以下是5款备受好评的AI写作软件,下面在本文中分享给大家&#xff0c…

kettle学习之表的输入输出

需求 把表A里的数据传送到表B中,在此之前,清空表B内的数据 表输入 执行SQL脚本 表输出

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽,大家好呀!这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名,并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器,并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…

探索自动化办公的新境界:批量操作与智能管理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、自动化办公的必要性与价值 二、基础操作与自动化脚本 三、Python在自动化办公中的应用…

Meme币总市值突破630亿美元 以太坊ETF获批意味着代币化资产“完全安全”

近日,数字货币市场再次掀起轩然大波。一方面,Meme币总市值突破了630亿美元,令人瞠目结舌;另一方面,以太坊ETF的获批也引发了市场的广泛关注,被视为代币化资产的“完全安全”标志。 Meme币总市值飙升 Meme币…

深圳比创达电子EMC|EMC电磁兼容性行业:挑战与机遇并存

随着电子技术的迅猛发展,电磁兼容性(EMC)已成为各行各业不可忽视的关键问题。EMC是指设备或系统在其电磁环境中能正常工作且不对该环境中任何事物构成不能承受的电磁骚扰的能力。 一、EMC电磁兼容性行业的现状 EMC电磁兼容性行业作为电子技…

[数据集][目标检测]道路井盖下水道井盖开关闭和检测数据集VOC+YOLO格式407张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):407 标注数量(xml文件个数):407 标注数量(txt文件个数):407 标注类别…

构建php环境、安装、依赖、nginx配置、ab压力测试命令

目录 php简介 官网php安装包 选择下载稳定版本 (建议使用此版本,文章以此版本为例) 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…

深入理解一下栈

1、栈:数据结构 为什么 main()方法 最先执行,最后结束? 当然是因为 main()方法入栈啦。 2、栈:栈内存,主管程序的运行,生命周期和现成同步; 线程结束,栈内内存也就释放了&#xff0c…

STM32_RCC

1、RCC RCC即Reset and Clock Control,复位和时钟控制。通过stm32f10x结构图可以看出RCC控制着stm32的AHB系统总线,而AHB总线又桥接APB1和APB2,分别通过它们控制不同的片上外设。如果要使用某个片上外设的功能,必须先通过…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新,追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

CDGP|数据治理策略揭秘:因企制宜,实现精准管控新高度

随着信息化、数字化的深入推进,数据已经成为企业最重要的资产之一。如何高效、安全地管理和利用数据,成为企业面临的重要课题。数据治理策略的制定与实施,成为解决这一问题的关键所在。本文将探讨如何因企制宜,制定符合企业实际情…

23种设计模式全面总结 | 快速复习(附PDF+MD版本)

本篇文章是对于23种设计模式的一个全面的总结,受限于文章篇幅无法对每个设计模式做到全面的解析,但几乎每个设计模式都提供了案例和类图结构,非常适合快速复习和在学习设计模式之前的全预习把握。 💡文章的 pdf markdown 版本可通…

JSP期末要点复习

一、JSP工作原理 1.客户端请求JSP页面:用户通过浏览器发送一个请求到服务器,请求一个特定的JSP页面。这个请求被服务器上的Web容器(如Apache Tomcat)接收。 2.JSP转换为Servlet:当JSP页面第一次被请求时&#xff0…

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

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

数据安全革命:Web3带来的隐私保护创新

随着数字化时代的发展,数据安全和隐私保护问题日益突出。传统的中心化数据存储和管理方式已经无法满足日益增长的数据安全需求,而Web3作为下一代互联网的新兴力量,正以其去中心化、加密安全的特性,引领着一场数据安全革命。本文将…

pyinstaller打包提示“文件所在的卷已被外部更改,因此打开的文件不再有效。”

环境 anaconda : 24.1.2python : 3.7.13pyinstaller : 5.13.0 问题描述 之前使用pyintaller执行spec文件打包都是能成功,今天打包报了“文件所在的卷已被外部更改,因此打开的文件不再有效。”的错误 Traceback (most recent call last):File "C…

想提升,应该学PMP还是NPDP?

NPDP(新产品开发专业认证)是由美国产品开发与管理协会(PDMA)发起的国际认证,涵盖新产品开发的理论、方法和实践,为公司提供全方位的知识体系支持。通过考试获得NPDP认证证书,能够提升个人工作能…

粒子爱心特效||轻松实现浪漫效果||完整代码

关注微信公众号「ClassmateJie」有完整代码以及更多惊喜等待你的发现。 简介/效果展示 你是否曾经想过,在特殊的日子里给你的爱人一个惊喜?或者在朋友的生日派对上,给他们展示一个充满爱意的特效?今天,我要分享一个我…