Kubernetes架构及核心部件 (kubernetes)

技术教程 2025-05-08 09:02:37 浏览
Kubernetes架构及核心部件

Kubernetes架构及核心部件

2023-09-05 23:38:36Kubernetes有哪些核心部件,架构图和流程图又是怎样的,kubectl和kubelet经常分不清,声明式API和命令式API又有什么区别,本文一一详说。

1、Kubernetes集群概述

1.1、概述

Kubernetes 是一个容器编排平台,它使用共享网络将多个主机(物理 服务 或虚拟机)构建成集群。分为 Master Node(主节点)和Worker Node(工作节点),Master负责管理整个集群,Worker 负责接收请求并以Pod(容器集合)形式运行工作负载。下图为Kubernetes 集群工作模式示意图。

Master是集群的网关和中枢,负责为客户端提供API接口调用、确保各资源对象不断地接近用户期望的状态、并以最优的方式调度Pod到指定Node,以及编排其他组件之间的通信等任务,它是客户端访问集群的唯一入口。生产环境通常部署多个Master,为了冗余和负载均衡。

Worker Node负责接收来自 Master 下发的指令并相应创建或销毁Pod 对象,以及路由、流量转发等任务。在生产环境中,随着微服务的增多或者业务应用的扩容,Worker会随之增多。

概括来说,Kubernetes将所有工作节点的资源(CPU、磁盘、内存、网络等)集合在一起形成了一台更加强大的“服务器”,通过Master上的API接口暴露集群的计算和存储接口,再由 Master通过调度算法将客户端请求的工作负载指派至特定的Node上,并且Master 会自动处理因Worker Node的添加、故障、或移除等变动对 Pod 的影响。

Kubernetes是构建在底层主机集群之上的“云原生应用操作系统”,而容器是运行在其上的进程。

Kubernetes 中每个对象都使用 “名称”作为其唯一标识符,出于名称的隔离和复用、资源隔离的目的,使用“Namespace” 作为作用域。

1.2、通过声明式API即可

在开发云原生应用时,主要使用声明式API,这种方式简单易用,程序员朋友可以更好地集中精力开发业务。

在运行应用时,用户只需要通过 API声明业务应用的最终状态(例如为 Nginx 应用运行 6个实例等),Kubernetes 便能完成后续的所有任务,包括应用本身的运行实例数量、路由策略、访问策略以及存储等。

以下为某个声明式yaml的示例,Kubernetes 也支持使用命令行工具 kubectl 提交请求。

apiVersion: v1kind: Podmetadata:name: busyboxnamespace: testlabels:app: busyboxspec:containers:- name: busyboximage: busybox

2、Kubernetes 集群架构

Kubernetes 属于Server-Client架构,Master Node主要由API Server(kube-apiserver)、Controller-Manager(Kube-controller-manager)和Scheduler(kube-scheduler)这3个组件,以及一个用于存储集群状态的etcd 存储服务组成,它们构成整个集群的控制平面;

而Worker Node则主要包含kubelet、kube-proxy及容器运行时(以前Docker是常用的实现)3个组件,它们承载运行各类应用容器。各组件如下图所示:

2.1、Master 组件

Master是集群的大脑,它维护了Kubernetes 的所有对象记录,负责管理对象状态、并响应集群中各种资源对象的管理操作,以及确保各资源对象的 实际状态 与 所需状态 相匹配。控制平面各组件及其主要功能如下:

2.1.1、API Server

API Server 是Kubernetes 控制平面的前端,支持不同类型应用的生命周期编排,包括部署、缩放和滚动更新等。它还是整个集群的网关接口,用于接收、校验以及响应所有的REST请求,并将结果状态存储到(etcd)中。

2.1.2、集群状态存储

Kubernetes集群的所有状态信息都需要存储于etcd 中。etcd 是分布式键值存储,可用于服务发现、共享配置以及一致性保障 (如数据库主节点选择、分布式等)。

etcd还为其存储的数据提供了监听 (warch)机制,用于监听和推送变更。API Server是Kubernetes集群中唯一能够与etcd通信的组件,它封装了这种监听机制,并借此同其他各组件高效协同。这一点类似于多个应用服务器借助zookeeper协同。

2.1.3、控制器管理器

控制器负责实现客户端通过 API Server 提交的请求,它驱动API 对象的当前状态逼近期望状态。Kubernetes 提供了驱动 Node、Pod 、 Server、Endpoint、ServiceAccount 和 Token 等数十种类型对象的控制器。

2.1.4、调度器

Kubernetes 系统上的调度是指为 API Server 接收到的每一个Pod 创建请求,并在集群中为其匹配出一个最佳工作节点。kube-scheduler 是默认调度器程序,它调度时的考量因素包括:硬件、软件与策略约束、亲和与反亲和、污点等特征。

2.2、Worker Node 组件

Worker Node 组件是集群的体力劳动者,为了保证有足够的资源运行成百上千个容器化应用,一个集群通常会有多个 Worker Node 。每个Node 会定期向 Master 报告自身的状态变动,并接受 Master 的管理。

2.2.1、kubelet

kubelet 是 Kubernetes 中最重要的组件之一,是运行于每个 Node之上的“节点代理”服务,负责接收并执行 Master 发来的指令,以及管理当前 Node 上 Pod 对象的容器等任务。它支持从 API Server 接收 Pod 资源定义,并通过 容器运行时 去创建、启动和监视容器。

kubelet 会持续监视当前节点上各Pod 的健康状态,并在任何 Pod 出现问题时将其重建。同时也会及时跟Master通信,将自身情况上报于Master。

2.2.2、容器运行时环境

Pod 是一组容器集合,真正负责运行容器的是底层的 容器运行时 。kubelet 通过 CRI(容器运行时接口)可支持多种类型的 OCI 容器运行时,例如 docker、containerd、CRI-O、runC、Kata等。

2.2.3、kube-proxy

kube-proxy 是需要运行于集群中每个节点之上的服务进程,它把 API Server 上的Service 资源对象转换为当前节点上的 iptables 或(与)ipvs 规则,这些规则 能够将那些 发往Service 对象 ClusterIP 的流量 分发至它后端的 Pod 端点之上。

kube-proxy是 Kubernetes的核心网络组件,它本质上更像是Pod 的代理及负载均衡器,负责确保集群中 Node、Service 和Pod 对象之间的通信。

2.3、图解架构

如上图所示:

3、核心扩展部件

常用的核心扩展部件包括如下几个:

3.1、网络插件

网络插件是必要部件,常用的有Flannel、Calico等。我主要使用Calico ,云厂商一般是结合VPC有自己的一套实现。

3.2、CoreDNS

Kubernetes使用DNS应用程序实现名称解析和服务发现功能,它自1.11 版本起默认使用 CoreDNS。之前的版本中用到的是kube-dns。

3.3、Dashboard

一套WebUI,用于可视化 Kubernetes集群。Dashboard可用于获取集群中资源对象的详细信息,例如集群中的 Node、Namespace、 Volume、ClusterRole 和Job 等,也可以创建或者修改这些资源对象。

3.4、容器资源监控系统

监控系统是分布式应用的重要基础设施,Kubernetes常用的指标监控部件有Metrics-Server、PromeTheus 等。

3.5、集群日志系统

日志系统是构建可观测分布式应用的基础设施,有助于帮助开发人员发现和定位问题。Kubernetes 常用的日志系统是由ElasticSearch、Fluentd 和 Kibana(EFK) 组合提供的解决方案,或者使用ELK等方案。

3.6、Ingress Controller

Ingress资源是 Kubernetes 将集群外部 HTTP流量引入到集群内部的资源类型,它仅用于控制流量的规则和配置的集合,它不能进行“流量穿透”,要通过Ingress控制器发挥作用。常用的Ingress控制器有Nginx等。

在以上这些附件中,CoreDNS、监控系统、日志系统和 Ingress 控制器,这种基础支撑类服务一般安装在集群内部。而Dashboard是提高用户效率和体验的可视化工具,一般在集群外部独立安装。

4、小小疑问

4.1、声明式API和命令式API

一个注重结果,一个注重过程。

声明式(declarative)编程:着重于最终结果,如何达成结果则要依赖于给定语言的基础组件能力,程序员只需要指定做什么而非如何去做;声明式编程常用于数据库和配置管理软件中,关系型数据库的SQL语言便是最典型的代表之一。

命令式(imperative)编程:称为过程式编程更合适,它需要由程序员指定做事情的具体步骤,更注重如何达成结果的过程。

4.2、区分kubectl和kubelet

kubernetes

初学者经常分不清kubectl和kubelet的区别,通过上文可以知道:

kubectl是一个Kubernetes轻量级的客户端,用于调用Api-Server的接口,一般安装在Master节点。

kubelet是安装在每个Node节点上的代理,用于与Master高效通信,以及完成Master下发的任务、以及上报任务和自身的情况。


MVC是设计模式吗?

MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。 使用MVC应用程序被分成三个核心部件:模型、视图、控制器。 它们各自处理自己的任务。 祥见:

简述80486CPU的内部结构,并说明每个部件功能

kubernetes

芯片上有一个指令和数据共用的8KB高速缓存。 INTEL DX4的高速缓存为16KB。 总线部件负责对内部单元与外部总线之间的指令预取、数据传输、控制功能等安排优先次序和进行协调。 对内部通过三条32位总线与指令预取部件和高速缓存通讯,对外则产生总线周期必需的各种信号。 支持突发读周期,可从主存取出16字节的数据和指令块。 还可以缓冲4个32位的存储器写周期,使产生该写请求的内部单元可以转而继续进行别的处理工作。 当总线部件不运行执行指令的总线周期时,指令预取部件就用它顺序地预先取出几条其它单元要用的指令。 取出的指令放在预取队列里,该队列可保存由总线部件取出的两个16字节指令和数据块。 这样做使得其它单元几乎不必等待便可得到下一条指令。 当每一条指令从预取队列取出时,就将其操作码部分送到译码器,将置换部分送到分段部件进行地址计算。 指令译码器把从预取队列中取出的指令转换成低级的控制信号和微码入口。 译码后的指令存放在指令队列里,一理控制器发出请求就将其发送给控制器。 控制器含有微处理器的微码(微处理器中的一组低级命令)。 控制器负责解释从指令译码器收到的控制信号和微码入口,并根据译码后的指令指挥整数部件、浮点部件、存储器管理部件等的活动。 浮点部件是将数学协处理器的功能集成在芯片上,负责解释32位、64位和80位浮点格式。 它使用一些专门的电路和寄存器来处理一些超越函数和复杂的实数运算。 由于将浮点部件集成在芯片内,使得其与其它的内部单元之间的接口效率大大提高。 此外,浮点部件和算术逻辑运算部件(ALU)可以并行操作,因而允许二者能同时执行指令。 通过这些改进,使得浮点部件的性能比提高了4倍。 整数部件由算术逻辑运算部件(ALU)、8个通用寄存器、若干个专用寄存器和一个桶形移位器组成。 它负责执行控制器指定的全部算术和逻辑运算,可以在一个时钟周期内执行加载、存储、加减、逻辑和移位等单条指令。 存储器管理部件通过建立一个简化的、运行多个应用程序的寻址环境来帮助操作系统的多任务操作。 存储器管理部件含有分段和分页电路,负责将每个内部逻辑地址转换成相应于主存储器的一个特定单元的外部物理地址。 分段是一种在主存储器中为每个程序提供它自己的地址空间(称为段)的技术,其目的是防止多个应用程序装入主存时各程序间造成相互干扰。 分段部件要将其它内部单元所用的内部逻辑地址转换为不分段的线性地址,按照称为段描述符的数据结构保持各个段的位置。 线性地址随后转发到分页部件。 如果不用分页,线性地址就等于物理地址。 分页是将主存划分成很多4KB的块(页),以支持虚拟存储器环境。 在虚拟存储环境下,是用少量的内存和磁盘存储器来模拟一个大的地址空间。 只将与当前运行的指令或读数据有关的页放入内存,而将程序其余部分放在磁盘上。 分页部件利用转换查寻表将来自分段部件的线性地址转换成物理地址。

LSH是什么意思?

LSH是远程缓冲区溢出漏洞

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐