博客:cbb777.fun

全平台账号:安妮的心动录

github: https://github.com/anneheartrecord

下文中我说的可能对,也可能不对,鉴于笔者程度无限,请君自辨。有问题欢送大家找我探讨

K8S概述

什么是K8S?

Kubernetes是一个可移植、可扩大的开源平台,用于治理容器化的工作负载和服务,可促成申明式配置和自动化。名字源于希腊语,象征"舵手"

k8s呈现的必要性

依照部署的形式来进行划分,咱们能够简略的划分成四个时代

传统部署时代

如图一一样,APP部署在OS上,OS跑在硬件上。这会导致一个问题,如果在同一台机器上运行多个应用程序,如果某一个APP占用了机器的大部分资源,那么就会影响到其余APP,造成性能抖动甚至饿死的严重后果

虚拟化部署时代

为了解决上述问题,虚拟化技术被引进了,虚拟化技术容许你在单个物理服务器的CPU上运行多台虚拟机(VM)。虚拟化能使应用程序在不通过的VM之间被彼此隔离,且能提供肯定水平的安全性,因为一个应用程序的信息不能被另一应用程序随便拜访。

虚拟化技术可能更好地利用物理服务器的资源,并且能够更加轻松地增加、更新应用程序,因而具备更强的可扩缩性,以及升高硬件老本等等的益处

容器部署时代

容器相似于VM,然而相比于VMWare生成的那种VM,容器更加轻量级,并且与VM相似,每个容器都具备本人的文件系统、CPU、内存、过程空间等等,容器之间能够共享OS。容器和基础架构是拆散的,因而能够跨云和OS发行版进行移植

容器的劣势

  • 麻利应用程序的创立和部署:相比于VM镜像更加简便,进步了容器镜像创立的简便性和效率
  • 继续开发、集成和部署:基于镜像不可变性,通过疾速简略的回滚,提供牢靠且频繁的容器镜像构建和部署
  • 关注开发和运维的拆散:在构建、公布时创立镜像,而不是部署的时候,从而将利用与基础架构进行拆散
  • 可察看性:不仅能够显示OS级别的信息和指标,还可能显示应用程序的运行状态、其余指标信号
  • 跨开发、测试和生产的环境一致性:在开发物理机上也能够和在云中运行一样的应用程序
  • 跨云和操作系统发行版本的可移植性:可在任意环境运行
  • 松耦合、分布式、弹性:一个大的单体被分解成较小的服务,并且能够动静的治理和部署,而不是在一台大型单机上整体运行
  • 资源隔离:可预测的应用程序性能
  • 资源利用:高效率和高密度

K8S能做什么

上文咱们说到,容器是打包和运行应用程序的很好的一种形式,而在生产环境中,咱们须要对很多容器(容器的集群)进行治理,保障服务不会出故障、确保服务的可靠性,稳定性。

例如一个容器产生故障,则须要把这个容器下掉,新增一个运行该服务的容器,再把它上线。而K8S就是帮忙咱们实现这个过程,简化操作流程的工具

K8S的性能

  • 服务发现与负载平衡:K8S能够应用DNS、或者本人的IP来裸露容器,如果进入容器的流量很大,K8S通过Kube-Proxy来实现的负载平衡,可反对的负载平衡算法有(轮询、起码链接、IP哈希),默认为轮询,通过负载平衡来调配网络流量,从而使部署更加稳固
  • 存储编排:K8S容许主动挂载你抉择的存储系统,例如本地存储、公共云提供商等
  • 主动部署和回滚:能够应用K8S形容已部署容器的所需状态,并管制状态更改的速率
  • 主动实现装箱计算:当K8S领有许多节点组成一个集群之后,在这个集群上运行容器化的工作时,能够告知K8S每个容器须要多少资源(CPU 内存等),K8S能够将这些容器按理论状况调度到节点上,以最佳形式利用调配的资源
  • 自我修复:K8S将重新启动失败的容器、替换容器、杀死不响应用户定义的健康检查的容器,并且在筹备好服务之前不将其通告给客户端
  • 密钥与配置管理:K8S容许你存储和治理敏感信息,例如明码、OAuth令牌和SSH密钥,能够在不重建容器镜像的状况下部署和更新密钥以及应用程序配置,也无需在堆栈配置中裸露密钥

K8S组件


上述是K8S运行的架构流程图,咱们能够看得出来,一个K8S集群次要由两局部组成,别离是Control Plane管制立体,老版本也叫做Master;Node工作节点,老版本也叫做Worker Node

咱们将一组工作机器称为节点,节点会运行容器化应用程序,每个集群至多有一个工作节点。工作节点会托管Pod,管制立体治理集群中的工作节点与Pod

整体的一个典型的工作流程如下:

  1. 用户应用K8S API与API服务器交互,公布应用程序的形容(如Pod Service等)
  2. 调度器依据应用程序的要求抉择适合的节点,并将工作指派给节点上的Kubelet
  3. Kubelet依据指令在节点上创立和治理容器,确保它们的状态与冀望的状态

管制立体组件

管制立体组件会为集群做出整体决策,比方资源的调度,以及检测和响应集群事件。能够了解成K8S集群的大脑,负责管理和管制整个集群的行为。

管制立体组件能够在集群中的任何节点上运行,通常来说为了简略起见,只会在同一个计算机上启动所有的管制立体组件,并且不会在这台机器上运行任何容器

kube-apiserver

API服务器是K8S管制立体的组件之一,提供了与K8S集群通信的接口,容许用户和其余组件通过HTTP RESTful API与K8S进行交互,这个组件负责公开K8S API,负责解决承受申请的工作,验证并配置API对象的数据,这些对象包含pods services replicationcontrollers等,为REST操作提供服务,能够将它简略了解为K8S管制立体的前端,其余所有组件都通过该前端进行交互。

同时,API SERVER还负责验证申请的身份和权限,通过Token UserName/Password TLS证书等进行确认和交互,验证用户或者组件的身份,一旦用户验证胜利,API Server会应用拜访控制策略进行角色受权

并且它负责资源管理,保护一组长久化存储(etcd)来存储资源的配置、状态和元数据

它还负责记录集群中的事件和日志信息,当资源对象发生变化或者呈现谬误的时候,它会生成事件并将其发送给订阅者

etcd

它是一个分布式的统一且高可用的键值存储,用作k8s所有集群数据的后盾数据库,存储集群的配置数据、元数据和状态信息的牢靠长久化存储。etcd提供了高可用性、一致性和分布式的个性,为K8S的管制立体组件提供了一个共享的数据存储,API Server、kube scheduler 和 CM 等组件通过应用etcd来存储和检索集群的配置信息、资源对象的状态以及各种元数据,这些信息包含Pod Service Namespace PersistentVolume等的定义和状态

etcd的一些要害性能

  • 分布式存储:etcd应用Raft一致性算法来实现数据的分布式存储,它将数据分片并复制到集群中的多个节点上,确保数据的可用性和容错性,这意味着即便一些节点生效,集群应该能够持续失常工作
  • 一致性:etcd的Raft算法保障了数据的一致性,所有的写操作都须要通过少数节点的确认,确保数据的正确复制和同步,这样能够防止数据损坏和不统一的状况产生
  • 高可用性:etcd具备高可用性,通过在集群中的多个节点上复制数据,提供了容错能力
  • 疾速读写:etcd通过在内存中保持数据的正本,实现了疾速的读写操作,应用B+树作为底层数据结构,提供高效的索引和检索性能
  • 监控和故障复原:etcd提供了一些监控和故障复原机制,能够监测节点的状态和健康状况。当节点产生故障或变得不可用时,集群能够主动进行从新选举,抉择新的领导者节点来接管工作

kube-scheduler

负责监督新创建的、未指定运行节点(node)的Pods,并抉择节点来让Pod运行在该节点上,以实现负载平衡、资源利用率最大化和高可用性

调度决策思考的因素包含:单个Pod及Pods汇合的资源需要、软硬件及策略束缚、亲和性及反亲和性标准、数据地位、工作负载间的烦扰及最初时限

scheduler的次要性能如下

  1. 资源调度:scheduler依据容器的资源需要(如CPU 内存)和节点的资源利用率,决定将工作负载调度到哪个节点上运行
  2. 节点抉择:scheduler依据工作负载的要求,抉择适宜的节点进行调度,通过筛选和评分机制来抉择节点,同时scheduler还思考亲和性规定,以便将相干的工作负载调度到同一节点上,进步应用程序的性能和效率
  3. 拓展性和灵活性:scheduler具备可插拔的架构,容许用户依据本人的需要自定义和拓展调度算法,用户能够实现自定义的调度策略,通过调整评分函数和优先级规定来满足特定的业务需要
  4. 调度器扩大:k8s提供了灵便的调度器扩大机制,容许用户增加额定的带哦负气,这些调度器能够依据特定的需要和场景来实现自定义的调度逻辑

工作流程如下:

  1. 用户创立或者更新一个工作负载的形容,例如Deployment StatefulSet等
  2. 当新的工作负载被提交时,Scheduler接管到这个事件,并依据工作负载的需要和集群状态进行调度决策
  3. Scheduler遍历集群中的可用节点,评估每个节点的适宜水平,并为每个节点打分
  4. Schedulergenuine打分后果抉择最合适的节点,并将工作负载的调度决策告诉给相应的节点的Kubelet
  5. Kubelet在抉择的节点上启动和治理容器,并把容器的状态报告给管制立体

kube-controller-manager(cm)

负责运行控制器过程,实践上来说每个控制器都是一个独立的过程,然而为了升高复杂性,它们都被编译到一个可执行文件中,并且在同一个过程中运行。

这些控制器包含

  • 节点控制器(Node Controller):负责在节点呈现故障时进行告诉和响应
  • 工作控制器(Job Controller):监测代表一次性工作的JOB对象,而后创立Pods来运行这些工作直至实现
  • 端点分片控制器(EndpointSlice controller):填充端点分片对象,以提供给Service和Pod之间的链接
  • 服务账号控制器(ServiceAccount controller):为新的命名空间创立默认的服务账号

工作流程如下:

  1. CM启动时,它的各个控制器开始监督集群中的特定资源对象
  2. 控制器通过API Server获取资源对象的以后状态,并将其与所须要的冀望状态进行比照
  3. 如果二者不统一,那么控制器会触发相应的操作来使它们保持一致,这可能包含创立、更新或者删除资源对象
  4. 控制器通过API Server收回相应的操作申请,将更改利用于集群中的资源对象
  5. 控制器一直循环执行,以确保资源对象的状态和行为与冀望状态保持一致

cloud-controller-manager(ccm)

嵌入了特定的云平台管制逻辑,云控制器管理器容许将你的集群连贯到云提供商的API之上,并将与该云平台交互的组件同你的集群交互的组件拆散开来。

与cm相似,ccm将若干逻辑上独立的管制回路组合到同一个可执行文件中,供你以同一过程的形式运行。你能够对其执行程度扩容以晋升性能或者加强容错能力。

  • 节点控制器(Node Controller): 用于在节点终止响应后检察云提供商以确定节点是否已被删除
  • 路由控制器(Route Controller):用于在底层云基础架构中设置路由
  • 服务控制器(Service Controller):用于创立、更新和删除云提供商负载均衡器

工作流程如下:

  1. CCM组件在启动的时候与云平台的API进行认证和链接,并监督云资源对象的状态
  2. CCM的控制器通过与云平台的API进行交互,获取云平台资源对象的状态,并将其与K8S中的对象进行比拟
  3. 如果二者状态不统一,CCM的控制器会触发相应的操作,通过与云平台的API发出请求,将更改利用于云资源

工作节点组件

节点组件会在每个节点上运行,负责保护运行的pod并提供K8S运行环境

kubelet

kubelet会在集群中每个节点(node)上运行,它保障容器(containers)都运行在Pod中。

kubelet接管一组通过各类机制提供给它的PodSpecs,确保这些PodSpecs中形容的容器处于运行状态且衰弱,kubelet不会治理不是由k8s创立的容器,kubelet是k8s集群中的每个node上的次要组件之一,负责管理节点上的容器化工作负载,与管制立体交互,确保集群中的容器正确运行,并且保护节点的衰弱状态

次要性能:

  • 容器治理:kubelet负责在节点上创立、启动、进行和销毁容器,它通过与容器运行时(Docker Containerd)进行交互,执行容器的生命周期治理操作
  • 资源管理:Kubelet监控节点的资源应用状况,并依据预约义的资源配额和调度策略来分配资源给容器,它会定期向K8S管制立体报告节点上的资源状态
  • 健康检查:Kubelet定期对节点上的容器进行健康检查,包含容器的存活状态、资源利用率等,如果容器故障或者资源有余,Kubelet会尝试重启、复原或迁徙容器
  • 节点注册:Kubelet在节点启动时将本身注册到K8s管制立体,使管制立体可能治理和监控该节点上的容器化工作负载
  • 网络管理:Kubelet配置节点上的网络参数,包含容器网络和节点网络。它为容器调配IP地址,并配置容器之间和容器与内部的网络通信
  • 卷治理:Kubelet负责挂在和卸载容器中应用的长久卷,它与卷插件交互,使容器能拜访和应用长久化存储
  • 日志和监控:Kubelet收集和治理节点上容器的日志和监控数据,它能够将日志发送到集中式日志零碎,并提供容器的运行指标和事件信息

工作流程如下:

  1. Kubelet监听来自K8S管制立体的指令和命令
  2. K8S获取须要在节点上运行的pod列表,并依据指定的pod标准创立和治理容器
  3. 对于每个容器,Kubelet通过容器运行时(如Docker)来启动和进行容器,并监控其状态
  4. Kubelet定期向K8s管制立体报告节点的资源应用状况和容器状态
  5. Kubelet定期凑够管制立体获取Pod的更新和变更,并相应地执行容器的生命周期治理操作

kube-proxy

kube-proxy是集群中每个节点(node)上所运行的网络代理,实现k8s概念的一部分,它保护节点上的一些网络规定,这些网络规定会容许从集群外部或内部的网络会话与Pod进行网络通信。运行在每个节点上,并与K8S管制立体和节点上的网络组件进行交互,以实现服务的可拜访性和网络流量的转发

如果操作系统提供了可用的数据包过滤层,则kube-proxy会通过它来实现网络规定,否则,kube-proxy只做流量转发

次要性能:

  • 服务代理:Kube-proxy监听K8S管制立体中的服务和短空定义,并为它们创立对应的网络代理规定,这些规定通常基于IP Tables或者IPVS,依据服务的选择器和端口信息,将流量转发到相应的后端pod
  • 负载平衡:Kube-proxy实现了负载平衡性能,将来自集群外部和内部的网络申请平均地散发到后端的Pod。它能够基于轮询、随机抉择或起码连贯等算法来进行负载平衡
  • 服务发现:Kube-proxy监听K8S管制立体中国的服务和端口定义的变动,当服务的Pod正本数量发生变化、服务的标签或者端口信息产生变更时,Kube-proxy会相应地更新代理规定,以确保服务的拜访失常
  • 节点故障解决:Kube-proxy监测节点的衰弱状态,并在节点故障或网络中断的状况下自动更新代理规定,它会将流量从新路由到其余衰弱节点上的Pod,以保障服务的高可用性
  • 通明代理:Kube-proxy反对通明代理模式,能够在不批改利用程序代码的状况下,将应用程序流量转发到后端Pod。这种形式对应用程序是通明的,它们无需感知代理的存在

Kube-proxy的工作流程如下:

  1. Kube-proxy从K8S管制立体获取服务和端口定义,并为每个服务创立代理规定
  2. 当有新的服务或端口定义增加到集群中,或者现有的定义发生变化时,Kube-proxy监测到变动并相应地更新代理规定
  3. Kube-proxy监听来自服务裸露的端口上的网络流量
  4. 依据代理规定,Kube-proxy将流量转发到后端Pod上的容器,实现负载平衡和服务发现的性能

Container Runtime 容器运行时

容器运行环境是负责运行容器的软件,K8S反对许多容器运行环境,例如containerd CRI-O 以及K8S CRI的其余任何实现

Container Runtime(容器运行时)是 Kubernetes 中负责管理和运行容器的外围组件。它提供了创立、启动、进行和销毁容器的性能,以及治理容器的资源和隔离性。

Kubernetes 反对多种容器运行时,其中最罕用的是 Docker 和 Containerd。上面将具体介绍容器运行时的工作原理和性能:

  1. 容器生命周期治理:容器运行时负责与容器生命周期相干的操作。它能够依据容器镜像创立并启动容器,监控容器的运行状态,并在须要时进行或销毁容器。
  2. 容器隔离性:容器运行时应用 Linux 内核的命名空间和控制组(cgroup)等个性,为容器提供隔离的运行环境。每个容器都具备独立的文件系统、网络栈、过程空间和资源限度,从而实现容器之间的隔离和安全性。
  3. 容器网络:容器运行时负责设置和治理容器的网络。它为每个容器调配惟一的 IP 地址,并解决容器之间的网络通信。容器运行时还能够与网络插件协同工作,以实现更高级的网络性能,如跨主机的容器通信和负载平衡。
  4. 容器存储:容器运行时治理容器的存储。它能够为容器提供本地存储卷或挂载内部存储卷,使容器可能长久化存储和拜访数据。
  5. 容器镜像治理:容器运行时负责下载、治理和缓存容器镜像。它能够从容器镜像仓库中拉取镜像,并将其存储在本地节点上,以便在须要时疾速创立容器。
  6. 容器资源管理:容器运行时与 Kubernetes 的调度器和资源管理器交互,以确保容器在节点上失去适当的资源分配。它能够依据容器的资源需要和节点的可用资源进行调度和限度,以实现资源的偏心调配和利用。

容器运行时在 Kubernetes 中的工作流程如下:

  1. Kubernetes 管制立体下发容器启动的指令,包含容器镜像、资源要求等信息。
  2. 容器运行时依据指令从容器镜像仓库拉取镜像,并创立容器的运行时环境。
  3. 容器运行时应用 Linux 命名空间和控制组等性能,为容器提供隔离的运行环境。
  4. 容器运行时启动容器中的应用程序,并监控容器的运行状态。
  5. 容器运行时与容器网络 插件协同工作,为容器调配 IP 地址,并解决容器之间的网络通信。
  6. 容器运行时依据 Kubernetes 管制立体的指令,进行或销毁容器。

总之,容器运行时是 Kubernetes 中要害的组件之一,它负责管理和运行容器,提供容器的隔离性、生命周期治理、网络和存储性能,与其余 Kubernetes 组件协同工作,实现容器化应用程序的高效运行和治理。

node、kubelet、pod和container之间的分割

Node:是K8S集群中的工作节点,也被称为主机或者服务器,每个Node提供容器运行的基础设施,并承载运行着的容器

Kubelet:是运行在每个Node上的K8S组件之一,是Node上的代理程序,Kubelet负责管理和运行Node上的容器,并与K8S管制立体交互

Pod:Pod是K8S的最小调度和部署单元,它是一个逻辑上相干的容器组,能够蕴含一个或者多个容器,Pod提供了一个形象层,为容器提供共享的网络和存储资源,使容器之间能够进行通信和共享数据,Pod是在Node上进行调度和运行的

Container:容器是在Pod中运行的理论应用程序或服务,一个Pod能够蕴含一个或者多个容器,这些容器共享同一个网络命名空间和存储卷,容器被kubelet创立、启动、进行和销毁

通过这种形式,kubelet作为Node上的代理程序,负责与Kubernetes管制立体交互,并协调治理Node上的容器。Pod是在Node上调度和运行的最小单元,它能够蕴含一个或多个容器,这些容器共享同一个网络和存储环境。这种关系使得kubernetes能够以分布式和高可用的形式运行和治理容器化应用程序。