【kubernetes】k8s各组件运行流程以及高可用

1 Master节点的组件

Master节点包含三个组件和存储组件(Master的组件不一定要跟存储组件部署在同一台机器):

  • apiserver:提供RESTful风格的操作的API,其它组件之间通过API进行交互
  • scheduler:调度器,负责决策将Pod安排到哪个Node节点上运行
  • controller-manager:控制器管理器,负责管理控制器,例如,RC,RS,Deployment等
  • etcd:所有的资源对象和状态都会存储到etcd

2 Node节点的组件

Node节点包含自身的两个组件以及容器组件:

  • kubelet:agent,负责管理容器的生命周期
  • kube-proxy:代理,负责代理服务
  • 容器运行时

3 请求的执行流程

kubectl是官方提供的管理集群的客户端,其实也是调用apiserver的API。那么,当使用kubectl创建Pod时,集群是如何完成该项工作的呢?

在使用kubectl发起请求时,可以设置选项–v=9查看发起的请求的详细内容

  • 当使用kubectl创建Pod时,kubectl向apiserver发起创建Pod的请求,例如,发起在love-test的Namespace创建Pod的请求:POST https://kubemaster.boss.com:6443/api/v1/namespaces/love-test/Pods 201 Created in 13 milliseconds
    在这行里面给出了发起请求的URL、方法、返回码和耗时,在POST的请求体中就是yaml文件的json格式。当apiserver返回201就认为Pod已创建。
  • 当apiserver收到创建Pod的请求,其实就做了两件事:对请求进行验证(权限认证等)以及将Pod的对象写入etcd
  • 当scheduler监听到(通过apiserver进行监听)etcd中没有关联Node节点的Pod,就会根据两阶段的调度策略选择合适的Node节点:预选(剔除掉不合适的Node节点)和优选(给Node节点打分,根据分数高低选择)。当scheduler确定了Pod要执行的Node后,会调用apiserver更新etcd中Pod的定义。
  • 当kubelet监听到(通过apiserver进行监听)etcd中有Pod的Node节点是自身,并且Node节点上并没有运行该Pod,就会调用容器运行时运行容器。

以上的流程中需要明确以下几点:

  • 不论是直接向apiserver发起请求,还是通过apiserver监听对象的状态变化,所有的组件的操作都只与apiserver交互
  • 当通过apiserver监听对象状态变化时,每当更新对象(虽然定义对象时没有定义对象状态,状态也属于对象中的属性)时,apiserver会将所有的监听者发送更新后的对象

4 controller-manager(控制器管理器)

控制器管理器负责管理所有的控制器,而几乎所有的资源都有对应的控制器,例如,Replication Controller Controller(RC是一种资源,而RCC是管理RC的控制器)、Deployment Controller等,Replication Controller负责维护Pod的副本数,当Pod的实际副本数少于期望的副本数,RC就会创建新的Pod。

每个控制器都可以理解为一个协程,在每个协程中执行一个无限循环,通过订阅apiserver的变更通知,获知监听的对象的状态变化,然后跟期望的状态进行对比,最后做出一些操作,使得对象的状态向期望状态靠近。例如,RCC的工作方式:RCC会监听Pod对象的个数,获取Pod对象期望的个数,如果少于期望的个数,RCC会调用apiserver创建新的Pod,当然实际的Pod的调度和创建还是交给scheduler和kubelet。

5 kubelet

kubelet是安装在Node节点上的agent,主要职能为:

  • 启动时在apiserver中注册Node对象资源
  • 监听是否有Pod分配到当前节点,然后运行容器
  • 上报容器的运行状态
  • 当Pod被删除时,终止容器

总之,kubelet主要是负责Node对象监控和容器的生命周期管理。

kubelet可以从apiserver得到要运行的Pod的定义,然后运行容器,同时,它还可以运行本机的Pod的定义,并管理容器。

6 kube-proxy

kube-proxy的主要功能是负责服务的代理,当前的主要工作方式如下:

  • 当kubectl创建一个服务后,Service控制器会分配一个虚拟IP,并创建Endpoint对象,而Endpoint控制器会根据Endpoint对象的配置填充其中的IP:Port
  • kube-proxy会在Node节点上配置iptables,将虚拟IP的请求转发给Endpoint中的IP:Port
  • 当某个容器访问某个服务时,数据包的目的地是虚拟的IP和端口,而在发送到网络之前,内核会根据iptables配置修改目的地为Endpoint中的IP:Port(选择的规则是随机的)

7 kubernetes集群的高可用

7.1 客户应用的高可用

如果客户应用可以水平扩展(接入层和逻辑层),可以使用Deployment保证应用的副本数以及应用的滚动更新。

如果客户应用不能水平扩展(存储层),就需要采用选举机制,区分主从,其中的从要么只是等待主宕机,要么只能执行读操作。在kubernetes中,可以使用sidecar容器的机制进行选举,确认客户应用集群的主。

7.2 集群自身的高可用

kubernetes集群自身的高可用跟上面客户应用的高可用比较类似:

  • apiserver:无状态,直接运行多副本即可,不过前面要加上负载均衡
  • scheduler和controller-manager:它们会根据监听的对象的状态做出相应的行为,如果运行多个实例会造成竞争,因此,这两个组件需要采用选举机制,多个实例时只有其中一个实例工作
  • etcd:本身就是高可用的分布式键值存储系统,因此部署3+个奇数个节点即可
7.3 scheduler和controller-manager的高可用

当启动多个scheduler和controller-manager时,系统已经做了选举,同一时刻只会有一个组件工作(其中的--leader-elect选项,默认为true)。而它们使用的选举机制是通过创建Endpoint对象实现的:

  • 当启动组件时,会创建Endpoint对象:通过kubectl get endpoints kube-scheduler -n kube-system -o yaml命令查看,其中的control-plane.alpha.kubernetes.io/leader就是注册的信息
  • control-plane.alpha.kubernetes.io/leader主要包含两个信息:holderIdentity(当前的主),renewTime(最后更新时间)。成功创建Endpoint对象的组件会将自己的信息写入holderIdentity字段,并更新renewTime时间,之后会定期更新renewTime
  • 如果主挂掉后,不会更新renewTime,当其它的从组件发现没有更新,就会尝试将自己的信息写入holderIdentity字段,并更新renewTime,从而会成为新的主
7.4 高可用部署小结

下面对kubernetes集群的部署做个小结:

  • 通常的高可用集群至少有3个节点(Master节点)
  • 3个Master节点上部署kubelet,然后用crontab、systemd进行管理
  • 3个Master节点上用kubelet读取本地的apiserver、scheduler、controller-manager、etcd的Pod的文件创建三个Master节点,所有的Master组件以容器运行
  • Node节点同样需要部署kubelet,另外还需要部署kube-proxy,而kube-proxy同样以容器的方式运行

总之,所有的组件中,只有kubelet以宿主机进程运行,其它的组件都以容器运行

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

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

相关文章

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样,它是独立安装和部署的,下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

Linux基本命令,基础知识

进到当前用户目录:cd ~ 回到上级目录:cd .. 查看当前目录层级:pwd 创建目录:mkdir mkdir ruanjian4/linux/zqm41 -p级联创建文件夹(同时创建多个文件夹需要加-p) 查看详细信息:ls -l (即 ll) 查看所有详细信息:ls -al 隐藏文件是以.开头的 查看:l…

Spring Boot中Tomcat服务器参数解析及高并发控制

Spring Boot中Tomcat服务器参数解析及高并发控制 Spring Boot 集成了多种服务器,默认使用了Tomcat 服务器。在高并发情况下,合理地配置 Tomcat 服务器参数对于控制请求量和提高系统的稳定性至关重要。本文将解释 Spring Boot 中涉及 Tomcat 服务器的一些…

Springboot整合分页插件pagehelper

首先需要有一定的springbootmybatis的基础&#xff0c;才能使用顺畅 项目结构如下 引入依赖&#xff0c;springboot版本选的是2.7.16版本&#xff0c;jdk选的17&#xff0c; <!--分页插件--> <dependency><groupId>com.github.pagehelper</groupId><…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路&#xff1a; 数组充当哈希表…

qemu+docker在服务器上搭建linux内核调试环境

基于docker和qemu的操作系统实验环境 参考以上文章实现。 其中 docker run -it --name linux_qemu qemu /bin/bash #从qemu镜像启动一个容器linux_qemu,进入shell 要改为 docker run -it --name linux_qemu 3292900173/qemu /bin/bash另外&#xff0c;在vscode运行过程中,ssh远…

useCallBack

React.memo 保证了只有props发生变化时&#xff0c;该组件才会重新渲染 &#xff08;当然组件内部的state 和 context 变化也会导致组件重新渲染&#xff09;&#xff0c;但咱们只要将咱们的子组件包裹&#xff0c;便可以保证Child组件在props不变的情况下&#xff0c;不会重新…

795. 区间子数组个数

795. 区间子数组个数 给你一个整数数组 nums 和两个整数&#xff1a;left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组&#xff0c;并返回满足条件的子数组的个数。 生成的测试用例保证结果符合 32-bit 整数范围。 示例 1&#xff1a;…

【C语言】指针经典笔试题(上)

C语言的一大重头戏就是指针。 对于指针有一些认识&#xff1a; 1.指针是存放变量的地址&#xff0c;一般说的指针和指针变量是一个概念。 2.地址的单位是字节&#xff0c;大小在不同编译器环境下有所不同&#xff0c;32位机器是4个字节&#xff0c;64位机器是8个字节。 3.数组名…

错误处理函数 / 模板上下文处理函数

app.errorhandler(404) # 传入要处理的错误代码 def page_not_found(e): # 接受异常对象作为参数user User.query.first()return render_template(404.html, useruser), 404 # 返回模板和状态码对于多个模板内都需要使用的变量&#xff0c;我们可以使用 app.context_proces…

学会使用Git 和 GitHub

Git 和 GitHub 都是程序员每天都要用到的东西 —— 前者是目前最先进的 版本控制工具&#xff0c;拥有最多的用户&#xff0c;且管理着地球上最庞大的代码仓库&#xff1b;而后者是全球最大 同性交友 代码托管平台、开源社区。 在没有这两个工具时&#xff0c;编程可能是这样的…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看&#xff1a;最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图&#xff0c;并且一次只能从网络中找源点到任何一个节点的最短路径&#xff0c;而Floyd算法的应用更加广泛&#…

【C刷题】day3

一、选择题 1、已知函数的原型是&#xff1a; int fun(char b[10], int *a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…

MySQL列大小写敏感

一、背景知识 字符集COLLATE 1、字符集是一套符号和编码&#xff0c;COLLATE是在字符集内用于比较字符的一套规则。通常的字符集都是utf8mb4&#xff08;8.0默认&#xff09;。 2、在mysql中&#xff0c;字符类型的列&#xff0c;比如&#xff1a;char、text、varchar等类型…

算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

文章目录 83. 删除排序链表中的重复元素&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 83. 删除排序链表中的重复元素&#xff1a; 给…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

注解,自定义注解

一、什么是注解 二、自定义注解 /*** 自定义注解*/public interface MyAnnotation {String aaa();boolean bbb() default true;String ccc(); }MyAnnotation ( aaa "牛魔王",ccc "sss") public class Test {MyAnnotation ( aaa "aaa",ccc &q…

vue 使用cornerstone解析 .dcm 文件

// 首先下载依赖 npm install --save cornerstone-core cornerstone-math cornerstone-tools hammerjs cornerstone-web-image-loader 下载之后再package.json中可以看到最后图片的依赖// 下面是完成的组件代码 <template><div id"dicom_canvas" refdicom_c…

第75步 时间序列建模实战:多步滚动预测 vol-3(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上两期&#xff0c;我们讲了多步滚动预测的第两种策略&#xff1a; 对于重复的预测值&#xff0c;取平均处理。例如&#xff0c;&#xff08;1,2,3&#xff09;预测出3.9和4.5&#xff0c;&#xff08;2,3,4&#xff09;预测出5.2和6.…