一文带你了解 kubernetes 的架构与组件!

2022-04-25 00:00:00 集群 节点 运行 调度 容器


kubernetes架构目标

kubernetes是生产级的,用于跨主机部署,扩展,管理和组合应用程序容器的基础设施。kubernetes不仅仅是“容器编排”,他更加主要的解决方向是消除协调计算资源,网络和存储的负担,使开发人员以容器为中心,实现自己出发主导资源操作流程。kubernetes还提供了一个稳定的,可移植的,用于构建定制的工作流和更别自动化的平台。
kubernetes主要针对多个容器构成的应用程序。因此kubernetes使用pod和label来构建松散或紧密的容器编队,以便管理和发现。

kubernetes在架构上包含哪些功能呢?

首先必须是可扩展的,可插入式的。因此在架构上,kubernetes被构建成为一个可插入组件和层的集合,能够替代日常开发中的调度程序,控制器,存储系统和分发机制。如果设计的足够好的话,在使用更别的Paas功能或者多层集群时,就无需改动源码。由于上述原因他在设计的api的时候不仅针对终使用kubernetes的用户,而且还针对工具和扩展开发人员。kubernetes的API旨在作为工具,自动化系统和更高API层面的开放生态系统。这种插件化的构造方式,使得kubernetes没有“内部”组件API这种东西。所有的API都是可见的和可用的,包括调度器scheduler,节点控制器node controller,副本控制器replication-controller和kubectl控制器。为了实现更加复杂的功能,完全可以通过组合访问这些低级别的API来实现。

kubernetes在架构上想达到哪些目标呢?

首先是“到处运行”,无论是共有云,还是私有云,裸金属机器或者笔记本电脑,kubernetes都会具有相同的功能。基于这个目标,kubernetes相关组件和工具在整个生态系统以及开发和生产环境之间都是可移植的。
其次是“一般性用途”,kubernetes具有可以承载所有类型工作负载的能力。包含有状态,无状态,微服务或者单体服务,批处理,前沿服务或者传统应用。
然后是“无需全部迁移”,kubernetes不仅适合纯原生的云应用,也能适合所有的用户需求。kubernetes专注微服务和云原生,但是提供一些机制来促进单体应用和遗留的传统程序的灵活迁移。kubernetes的众多功能可以按顺序来加入到工作中,而且可以灵活使用自定义的方案来替换内置的功能。
还有“可扩展”,kubernetes通过提供和内置功能相同的接口来添加所需的附加功能。
以及“自动化”,kubernetes的目标是大大减少手工操作的负担。通过API指定用户所需的意图来支持声明式控制,同时还支持编排和自动化的命令式控制。声明性方法是系统自愈和自主功能的关键。
后是“更加前沿”,kubernetes希望支持非云原生的应用程序,同时也希望提高云原生和DevOps相关的技术水平,例如让应用程序参与到kubernetes自己本身的管理当中。但是也不会强迫应用程序绑定到API中,因为比起兼容api,其实更好的方案是约定配置。

kubernetes架构细节

kubernetes包含节点代理(kubectl)和集群控制平面(aka master),集群状态由etcd支撑。
  • 集群控制平面(aka master)

Kubernetes控制平面被分割成一组组件,这些组件可以在单个主节点上运行,也可以复制以支持高可用性集群,甚至可以在Kubernetes本身(也称为自托管)上运行。
Kubernetes提供了REST API,它主要支持持久性资源上的CRUD操作,而持久性资源是其控制平面的中心。Kubernetes的API提供了类似IaaS的以容器为中心的原语,如pod、服务和入口,以及生命周期API,以支持常见类型工作负载的编排(自愈、缩放、更新、终止),如ReplicaSet(简单的可替换或者无状态的app-manager),部署(编排无状态应用的更新),作业(批处理)、cron Job(cron)、守护程序(群集服务)和StatefulSet(有状态应用程序)。我们故意将服务命名/发现和负载平衡从应用程序实现中分离出来,因为后者是多样的、开放的。
用户客户端和包含异步控制器的组件都与相同的API资源交互,API资源充当协调点、公共中间表示和共享状态。大多数资源都包含元数据,包括标签和注释、详细阐述的所需状态(spec),包括默认值和观察到的状态(status)。
控制器持续工作,将实际状态驱动到所需状态,同时为用户和其他控制器报告当前观察到的状态。
虽然控制器是基于基础级别的,以大限度地提高容错性,但它们通常会监视相关资源的更改,以小化反应延迟和冗余工作。这使得无需消息总线就可以进行分散和分离的编排式协调。
  • api server
API服务器提供Kubernetes API。它旨在成为一个相对简单的服务器,大多数业务逻辑都在单独的组件或插件中实现。它主要处理REST操作,验证它们,并更新etcd中的相应对象(可能终更新其他存储)。注意,出于许多原因,Kubernetes故意不支持跨多个资源的原子事务。
如果没有这个基本的API机制,Kubernetes将无法运行,它包括:
  • REST语义、监视、持久性和一致性保证、API版本控制、默认设置和验证
  • 内置的许可控制语义、同步许可控制挂钩和异步资源初始化
  • API注册和发现
此外,API服务器充当集群的网关。根据定义,API服务器必须由集群外部的客户机访问,而节点(当然还有容器)可能不可访问。客户机对API服务器进行身份验证,并将其用作节点和pod(和服务)的堡垒和代理/隧道。
  • cluster state store
所有持久集群状态都存储在etcd的一个实例中。这提供了一种可靠地存储配置数据的方法。有了watch支持,协调组件可以很快地收到更改通知。
  • controller-Manager server
大多数其他集群级功能,目前由一个单独的进程执行,称为控制器管理器。它执行生命周期功能(例如,命名空间创建和生命周期、事件垃圾收集、终止的pod垃圾收集、级联删除垃圾收集、节点垃圾收集)和API业务逻辑(例如,由复制集控制的pod缩放)。
应用程序管理和组合层,提供自愈、扩展、应用程序生命周期管理、服务发现、路由以及服务绑定和供应。
这些功能终可能被分割成不同的组件,以使它们更容易扩展或替换。
  • scheduler
Kubernetes允许用户请求集群运行一组容器。调度程序组件自动选择要在其上运行这些容器的主机
调度器根据请求资源的可用性、服务质量要求、关联和反关联规范以及其他约束,监视未计划的pod并通过/binding pod子资源API将其绑定到节点。
Kubernetes支持用户提供的调度程序和多个并发集群调度程序,使用Omega首创的共享状态方法。除了Omega论文所描述的悲观并发的缺点之外,两级调度模型对上层调度程序隐藏信息,需要在下层调度程序中实现所有上层调度程序所需的相同功能,以确保它们的调度请求能够被所需的可用资源满足。

kubernetes节点

Kubernetes节点具有运行应用程序容器和从主系统进行管理所必需的服务。
  • kuberlet
Kubernetes中重要和突出的控制器是Kubelet,它是驱动容器执行层的Pod和节点api的主要实现者。如果没有这些API,Kubernetes将只是一个由键值存储支持的面向CRUD的REST应用程序框架(也许API机器终将作为一个独立的项目剥离出来)。
Kubernetes执行独立的应用程序容器作为其默认的本地执行模式,而不是进程和传统的操作系统包。应用程序容器不仅彼此隔离,而且还与它们在其上执行的主机隔离,这对于将单个应用程序的管理彼此分离以及与底层群集物理/虚拟基础设施的管理分离是至关重要的。
Kubernetes提供的pod可以承载多个容器和存储卷,作为其基本的执行原语,以便为每个容器打包单个应用程序、将部署时间关注点与构建时间关注点分离以及从物理/虚拟机迁移提供便利。Pod原语是收集在现代云平台(如Kubernetes)上部署的主要好处的关键。
API许可控制可以拒绝pod或向pod添加额外的调度约束,但是Kubelet是pod可以和不能在给定节点上运行的终仲裁者,而不是调度器或守护程序。
Kubelet目前也链接在cAdvisor资源监控代理中。
  • 容器运行时
每个节点运行一个容器运行时,该运行时负责下载图像和运行容器。
Kubelet不在基本容器运行时中链接。相反,我们定义了一个容器运行时接口来控制底层运行时并促进该层的可插入性。为了保持清晰的组件边界、方便测试和促进可插入性,需要这种分离。目前支持的运行时,无论是上游运行还是forks运行,至少包括docker(用于Linux和Windows)、rkt、cri-o和frakti。
  • kuber Proxy
服务抽象提供了一种在公共访问策略(如负载平衡)下对pod进行分组的方法。这个实现创建了一个虚拟IP,客户端可以访问它,并且它透明地代理到服务中的pods。每个节点运行一个kube代理进程,该进程对iptables规则进行编程,以捕获对服务ip的访问并将其重定向到正确的后端。这提供了一个高可用的负载平衡解决方案,通过平衡来自同一节点上某个节点的客户端流量,从而降低了性能开销。
服务终结点主要通过DNS找到。

以上就是kubernetes的架构。下面是简化总结:
kubernetes各个组件的核心功能:
  • etcd:集群状态
  • kube-apiserver:资源操作入口,认证授权控制,api注册和发现
  • kube-controller-manager:维护集群状态,
  • kube-schedluer:资源调度
  • kubelet:维持容器的生命周期,volume(cvi)和网络(cni)的管理
  • container runtime:容器的真正运行(CRI)
  • kube-proxy:svc提供集群内部的服务发现和负载均衡


作者:seymour

来源:juejin.cn/post/6931747243821105159

版权申明:内容来源网络,仅供分享学习,版权归原创者所有。



相关文章