[转载] 什么是K8s架构?看完了解
K8S架构定义
K8S是一个开源的容器部署和管理平台。它提供容器编排、容器运行时、以容器为中心的基础设施编排、负载平衡、自我修复机制和服务发现。K8S体系结构,有时也称为K8S应用程序部署体系结构或K8S客户端-服务器体系结构,用于跨主机集群组成、扩展、部署和管理应用程序容器。
运行K8S的环境由以下基本组件组成:控制平面(K8Scontrolplane)、用于保持集群状态一致性的分布式密钥值存储系统(etcd)和集群节点(Kubelets,也称为工作节点或小黄人)。
图中描绘了一个K8S体系结构图,其中包含不同的组件,如控制平面、节点、pod等等。
有关K8S技术的相关技术讲解, 你可以在虚拟化容器技术Docker+K8s课程中找到。课程收益包括但不限于Kubernetes(K8s)的架构与应用;掌握基于Docker和Kubernetes的企业应用架构;掌握基于虚拟化容器Docker与Kubernetes的体系架构、管理、部署,以及相应组件的原理和应用场景;让学员具备部署基于企业虚拟化云平台环境的能力。以下是有关K8S架构的常见问题:
什么是K8S架构?
K8S集群是K8S部署体系结构的一种形式。K8S的基本架构分为两部分:控制平面和节点或计算机。每个节点可以是物理机,也可以是虚拟机,并且是自己的Linux环境。每个节点还运行由容器组成的pod。
K8S架构组件或K8s组件包括K8S控制平面和集群中的节点。控制平面机组件包括K8Sneneneba API服务器、K8S调度程序、Kuberneses控制器管理器等。K8S节点组件包括一个容器运行时引擎或docker、一个Kubelet服务和一个K8S代理服务。
K8S控制平面
控制平面是控制集群的K8S集群架构组件所在的神经中枢。它还维护集群所有K8S对象的配置和状态的数据记录。
K8S控制平面与计算机保持持续联系,以确保集群按配置运行。控制器响应集群更改来管理对象状态,并驱动系统对象的实际、观察到的状态或当前状态以匹配所需的状态或规范。
几个主要组件包括控制平面:API服务器、调度程序、控制器管理器等等。这些核心K8S组件确保容器在足够数量的必要资源下运行。这些组件都可以在一个主节点上运行,但许多关心容错的企业会在多个节点上复制它们,以实现高可用性。
K8S API服务器
作为K8S控制平面的前端,API服务器通过为各种类型的应用程序提供API来支持更新、扩展和其他类型的生命周期编排。客户端必须能够从集群外部访问API服务器,因为它充当网关,支持每个阶段的生命周期编排。在这个角色中,客户端使用API服务器作为通向pod、服务和节点的隧道,并通过API服务器进行身份验证。
K8S调度器
K8S调度器存储每个计算节点的资源使用数据;确定集群是否健康;并确定是否应该部署新容器,如果应该,则确定它们应该放置在哪里。调度器通常会考虑集群的健康状况以及pod的资源需求,例如CPU或内存。然后,它选择适当的计算节点并调度任务、pod或服务,同时考虑资源限制或保证、数据位置、服务质量要求、反亲和性和亲和性规范以及其他因素。
K8S控制器管理器
K8S生态系统中有各种控制器,它们驱动端点(pod和服务)、令牌和服务帐户(命名空间)、节点和复制(自动缩放)的状态。控制器管理器——有时被称为云控制器管理器或简称为控制器——是一个使用多个控制器函数运行K8S集群的守护进程。
控制器在运行K8S核心控制循环时监视它在集群中管理的对象。它通过API服务器观察它们的期望状态和当前状态。如果被管理对象的当前状态和所需状态不匹配,则控制器采取纠正措施将对象状态推向所需状态。K8S控制器还执行核心生命周期功能。
ETCD
分布式和容错etcd是一个开源的键值存储数据库,用于存储配置数据和有关集群状态的信息。etcd可以在外部配置,尽管它通常是K8S控制平面的一部分。
etcd基于Raft一致性算法存储集群状态。这有助于处理在复制的状态机上下文中出现的常见问题,并涉及多个服务器就值达成一致。Raft定义了三个不同的角色:领导者、候选人和追随者,并通过选举领导者来达成共识。
通过这种方式,etcd充当所有K8S集群组件的单一真值源(SSOT),响应来自控制平面的查询,并检索容器、节点和pods状态的各种参数。etcd还用于存储配置详细信息,如ConfigMaps、子网和Secrets,以及集群状态数据。
K8S集群体系结构
由控制平面管理的集群节点是运行容器的机器。每个节点运行一个代理,用于与控制平面通信,kubelet是主K8S控制器。每个节点还运行容器运行时引擎,如Docker或rkt。该节点还运行用于监视、日志记录、服务发现和可选附加的其他组件。
下面是一些重点关注的K8S集群组件:
节点
K8S集群必须至少有一个计算节点,尽管它可能有许多计算节点,这取决于对容量的需求。已编排并计划在节点上运行Pods,因此需要更多节点来扩展集群容量。
节点为K8S集群执行工作。它们连接应用程序和网络、计算和存储资源。
节点可以是数据中心中的云本机虚拟机(VM)或裸机服务器。
容器运行时引擎
每个计算节点使用容器运行时引擎运行和管理容器生命周期。K8S支持开放容器计划兼容的运行时,如Docker、CRI-O和rkt。Kubelet服务
每个计算节点都包括一个kubelet,这是一个与控制平面通信的代理,以确保pod中的容器正在运行。当控制平面需要在节点中发生特定操作时,kubelet通过API服务器接收pod规范并执行该操作。然后,它确保相关的容器是健康和运行的。
Kube代理服务
每个计算节点都包含一个称为kube代理的网络代理,该代理有助于K8S网络服务。kube代理要么自己转发流量,要么依赖操作系统的数据包过滤层来处理集群内外的网络通信。
kube代理在每个节点上运行,以确保服务对外部方可用,并处理单个主机子网。它在其节点上充当网络代理和服务负载均衡器,管理UDP和TCP数据包的网络路由。事实上,kube代理为所有服务端点路由流量。
Pods
到目前为止,我们已经涵盖了内部和以基础设施为重点的概念。相比之下,pod是K8S的核心,因为它们是开发人员交互的关键外向结构。
pod表示应用程序的单个实例,也是K8S对象模型中最简单的单元。然而,pod是K8S的核心和关键。每个pod由一个容器或一系列紧密耦合的容器组成,这些容器在逻辑上结合在一起,以及控制容器运行方式的规则。
吊舱的寿命有限,在升级或缩小规模后最终会死亡。然而,尽管pod是短暂的,但它们可以通过连接到持久存储来运行有状态的应用程序。
Pods还能够水平自动缩放,这意味着它们可以增加或减少运行的实例数量。它们还可以执行滚动更新和金丝雀部署。
pod在节点上一起运行,因此它们共享内容和存储,并可以通过localhost访问其他pod。容器可能跨越多台机器,因此吊舱也可能。一个节点可以运行多个pod,每个pod收集多个容器。
pod是K8S生态系统中的核心管理单元,是共享资源和上下文的容器的逻辑边界。pod分组机制减轻了虚拟化和容器化方面的差异,该机制允许同时运行多个依赖进程。
通过创建副本集在运行时实现pod的扩展,副本集通过不断维护预定义的pod集来提供可用性,确保部署始终运行所需数量。服务可以向外部或内部消费者公开单个pod或复制集。
服务将特定的标准与pod相关联,以实现它们的发现。播客和服务通过称为选择器和标签的键值对进行关联。pod标签和选择器之间的任何新匹配都将由服务自动发现。
其他K8S Web应用程序体系结构组件
K8S管理应用程序的容器,但它也可以管理集群附加的应用程序数据。K8S用户可以在不了解底层存储基础结构详细信息的情况下请求存储资源。
K8S卷只是pod可以访问的目录,pod可以保存数据。卷的内容、形成方式以及支持它的介质由卷类型决定。永久卷(PV)是特定于集群的,通常由管理员提供,并绑定到现有存储资源中。因此,PV可以比特定吊舱更耐用。
K8S依赖于存储在容器注册表中的容器映像。它可以是第三方注册中心,也可以是组织配置的注册中心。
命名空间是物理集群中的虚拟集群。它们旨在为多个用户、团队提供虚拟分离的工作环境,并通过限制他们可以访问的K8S对象来防止团队相互阻碍。
在pod级别,pod中的K8S容器可以通过localhost访问其他端口,并共享它们的IP地址和网络名称空间。
K8S架构最佳实践
K8S体系结构以可用性、可扩展性、可移植性和安全性为前提。它的设计旨在更有效地在可用资源中分配工作负载,从而优化基础设施的成本。
高可用性
大多数容器编排引擎都提供应用程序可用性,但K8S的高可用性架构旨在实现应用程序和基础设施的可用性。
K8S体系结构使用复制控制器、副本集和宠物集确保了应用程序前端的高可用性。用户可以随时设置运行pod的最小数量。如果pod或容器崩溃,声明性策略可以将部署返回到所需的配置。使用pet集配置有状态工作负载以实现高可用性。
K8S HA架构还支持各种存储后端的基础设施可用性,从谷歌计算引擎持久磁盘和亚马逊弹性块存储(EBS)等块存储设备,到GlusterFS和网络文件系统(NFS)等分布式文件系统,以及Flocker等专用容器存储插件。
此外,每个K8S集群组件都可以进行高可用性配置。运行状况检查和负载均衡器可以进一步确保容器化应用程序的可用性。
可扩展性
部署在K8S中的应用程序是微服务,由许多容器组成,这些容器以pod的形式分组成一系列。每个容器在逻辑上都被设计为执行单个任务。
K8S 1.4支持集群自动伸缩,谷歌云上的K8S也支持自动伸缩。在自动扩展过程中,当没有可用的节点可以扩展pod时,K8S和底层基础设施会协调向集群添加额外的节点。
便携性
K8S旨在为云平台、容器运行时、操作系统、处理器架构和PaaS提供选择。例如,您可以在各种Linux发行版上配置K8S集群,包括CoreOS、Red Hat Linux、CentOS、Fedora、Debian和Ubuntu。它可以部署为在裸金属环境中本地运行;以及在基于vSphere、KVM和libvirt的虚拟化环境中。K8S的无服务器架构可以在Azure、AWS和Google cloud等云平台上运行。还可以通过在本地和跨云提供商混合和匹配集群来创建混合云功能。
安全
K8S应用程序体系结构在多个级别上进行了安全配置。有关K8S Security的详细信息,请参阅此处的讨论。
配置K8S架构安全性
为了保护K8S集群、节点和容器的安全,有几个基于DevOps实践和云原生原则的最佳实践需要遵循:
将K8S更新到最新版本:只有最新的三个版本的K8S才支持针对新发现的漏洞的安全补丁。
安全地配置K8S API服务器:停用匿名/未经身份验证的访问,并对API服务器和kubelets之间的连接使用TLS加密。
安全蚀刻:etcd本身是一个受信任的源,但仅通过TLS为客户端连接提供服务。
固定kubelet:停用对kubelet的匿名访问。使用–匿名auth=false标志启动kubelet,并使用NodeRestriction准入控制器限制kubelet可以访问的内容。
在容器生命周期的早期嵌入安全性:确保DevOps和安全团队之间有共同的目标。
使用K8S本机安全控制降低操作风险:在可能的情况下,利用本机K8S控件来强制执行安全策略,这样您自己的安全控件和协调器就不会发生冲突。
如何更好的学习K8S?
Docker和K8s在容器化领域至关重要,彻底改变了应用程序部署、可扩展性和管理。本质上,Docker和K8s一起为应用程序开发和部署实践的现代化做出了重大贡献,使它们成为不断发展的云计算和容器化领域中的关键技术。如果你希望更系统地学习,可以考虑参加虚拟化容器技术Docker+K8s培训课程。可以点击-小编头像,进入小编主页了解更多相关信息