自2014年以来,Kubernetes(K8s)的采用率经历了巨大的增长。受Google内部集群管理解决方案Borg的启发,Kubernetes简化了应用程序的部署和管理。与所有容器编排软件一样,Kubernetes因其安全且简单而受到 IT专业人士的欢迎。
当然,与每个工具一样,了解其架构原理可以帮助你更有效地使用它。在本文中,小编简单介绍下Kubernetes架构的基础知识,从它是什么、它可以做什么以及为什么它很重要等一系列内容。
什么是Kubernetes架构?
Kubernetes架构是一个用于管理和部署容器的开源平台,它提供服务发现、负载均衡、再生机制、容器编排、容器运行时以及以容器为中心的基础架构编排。Google创建了适应性强的Kubernetes容器管理系统,该系统可以跨多种设置处理容器化应用程序。它有助于自动化容器化应用程序部署、进行更改以及扩展和缩减这些应用程序。
不过,Kubernetes不仅仅是一个容器编排器。同样,其桌面应用程序可以在MacOS、Windows或 Linux系统上运行。所以,它是云原生应用程序的操作系统,因为它充当这些程序的云平台。
什么是容器?
容器是打包应用程序及其依赖项的标准方法,以便应用程序可以轻松地跨运行时环境执行。使用容器,用户可以通过将应用程序的代码、依赖项和配置打包到单个易于使用的构建块中,采取必要的措施来减少部署时间并提高应用程序的可靠性。
企业应用程序中的容器数量可能变得难以管理,所以为了充分利用容器,Kubernetes可以帮助你编排它们。
Kubernetes是用来做什么的?
Kubernetes是一个适应性极强且可扩展的平台,用于运行容器工作负载。Kubernetes平台不仅提供了创建云原生应用程序的环境,而且还帮助管理和自动化其部署。它旨在减轻应用程序运营商和开发人员协调底层计算、网络和存储基础设施的工作,使他们能够专注于以容器为中心的自助服务操作流程。开发人员还可以创建专门的部署和管理程序,以及由多个容器组成的应用程序的更高级别的自动化。
Kubernetes可以处理所有重要的后端工作负载,包括单体应用程序、无状态或有状态程序、微服务、服务、批处理作业以及介于两者之间的所有内容。选择Kubernetes通常具有以下优点:
- Kubernetes的基础设施优于许多DevOps技术。
- Kubernetes将容器分解为更小的组件以进行精确管理。
- Kubernetes快速、定期地部署软件更新。
- Kubernetes提供了一个用于开发云原生应用程序的平台。
Kubernetes架构和组件
基本的Kubernetes架构由许多组件组成,也称为K8s组件,因此在开始之前,记住以下概念很重要。
- 基本的Kubernetes架构由管理节点的控制平面和执行容器化应用程序的工作节点组成。
- 虽然控制平面管理执行和通信,但工作节点实际上运行这些容器。
- Kubernetes集群是一组节点,每个集群至少有一个工作节点。
Kubernetes控制平面
控制平面是Kubernetes集群设计的中枢神经系统中心,容纳集群的控制组件,它还记录集群中所有Kubernetes对象的配置和状态。Kubernetes控制平面与计算单元保持定期通信,以确保集群按预期运行。控制器监视对象状态,并使系统对象的物理、观察到的状态或当前状态适应所需的状态或规范,以响应集群变化。
控制平面由几个基本元素组成,主要包括应用程序编程接口(API)服务器、调度程序、控制器管理器和etcd。这些基本的Kubernetes组件保证容器使用适当的资源运行,并且都可以在单个主节点上运行,但许多公司将它们复制到多个节点上以实现高可用性。
- Kubernetes API服务器;它是Kubernetes控制平面的前端,它通过为各种应用程序提供API管理来促进更新、扩展、配置数据和其它类型的生命周期编排。由于API服务器是网关,用户必须能够从集群外部访问它。在这种情况下,API服务器是通往Pod、服务和节点的隧道。用户通过API服务器进行身份验证。
- Kubernetes调度器;Kube-scheduler记录每个计算节点的资源利用率统计信息,评估集群是否健康,并决定是否应部署新容器以及在何处部署。调度程序评估集群的整体运行状况和Pod的资源需求,例如中央处理单元(CPU)或内存。然后,它会考虑资源限制或保证、数据局部性、服务质量要求、反亲和性或亲和性标准,选择合适的计算节点并调度任务、pod或服务。
- Kubernetes控制器管理器;在Kubernetes环境中,多个控制器管理端点(pod和服务)、令牌和服务帐户(命名空间)、节点和复制(自动缩放)的状态。kube-controller管理器通常称为云控制器管理器或控制器,是一个通过执行各种控制器职责来管理Kubernetes集群的守护进程。控制器在运行Kubernetes核心控制循环时监视集群中的对象。它通过API服务器监视它们的所需状态和现有状态。如果托管对象的当前状态和预期状态不匹配,控制器将采取纠正措施以使对象状态更接近所需状态。Kubernetes控制器还处理基本的生命周期任务。
- etcd;etcd是一个分布式、容错的键值存储数据库,用于保存配置数据和集群状态信息。尽管etcd可以独立设置,但它通常作为Kubernetes控制平面的一部分。此外,Raft共识算法用于将集群状态保存在etcd中。这有助于处理复制状态机上下文中的典型问题,并且需要许多服务器就值达成一致。Raft建立了领导者、候选人和追随者三种角色,并通过投票选出领导者来达成共识。因此,etcd是所有Kubernetes集群组件的单一事实来源,响应控制平面查询并收集有关容器、节点和Pod状态的不同信息。当然,etcd还用于存储配置信息,例如ConfigMap、子网、机密和集群状态数据。
Kubernetes工作节点
工作节点是运行控制平面管理的容器的系统,Kubelet(核心Kubernetes控制器)作为与控制平面交互的代理在每个节点上运行。此外,每个节点都运行一个容器运行时引擎,例如Docker或rkt。用于监视、日志记录、服务发现和可选附加功能的其他组件也在该节点上运行。
一些关键的Kubernetes集群架构组件如下。
- 节点;一个Kubernetes集群必须至少有一个计算节点,但根据容量要求,可以有更多节点。由于Pod是协调并调度在节点上执行的,因此需要额外的节点来增加集群容量。节点完成Kubernetes集群的工作。它们链接应用程序以及网络、计算和存储资源。另外,数据中心中的节点可能是云原生虚拟机(VM)或裸机云服务器。
- 容器运行时(container runtime)引擎;每个计算节点都使用容器运行时引擎来操作和管理容器生命周期。Kubernetes支持符合开放容器倡议的运行时,例如Docker、CRI-O和rkt。
- kubelet服务;每个计算节点上都包含一个kubelet,它是一个与控制平面通信的代理,以保证Pod中的容器正在运行。当控制平面要求在节点中执行特定操作时,kubelet通过API服务器获取pod规范并进行操作。然后,它确保相关容器处于良好的工作状态。
- Kube-proxy服务;每个计算节点都有一个称为kube-proxy的网络代理,它有助于Kubernetes网络服务。为了管理集群内部和外部的网络连接,kube-proxy要么转发流量,要么依赖操作系统的数据包过滤层。其进程在每个节点上运行,以确保服务可供其他方使用并应对特定的主机子网划分。它充当其节点上的网络代理和服务负载平衡器,处理用户数据报协议(UDP)和传输控制协议(TCP)流量的网络路由。实际上,它为所有服务端点路由流量。
- Pod;到目前为止,已经介绍了内部和基础设施相关的内容。然而,Pod对Kubernetes 至关重要,因为它们是开发人员与之交互的主要外向组件。Pod是Kubernetes容器模型中最简单的单元,代表应用程序的单个实例。每个Pod包含一个容器或几个紧密相关的容器,这些容器逻辑上组合在一起并执行管理容器功能的规则。Pod的使用寿命是有限的,最终会在升级或缩减后死亡。虽然是短暂的,但它们通过连接到持久存储来执行有状态的应用程序。此外,Pod还可以水平扩展,这意味着它们可以增加或减少运行的实例数量,并且还能够进行滚动更新和金丝雀部署。Pod一起在节点上运行,因此它们共享内容和存储,并且可以通过localhost与其它Pod进行通信。容器可以跨越多台计算机,pod也可以。单个节点可以运行多个Pod,每个Pod收集大量容器。
- Service:用于将一组Pod打包到一起,并为它们提供一个访问点。任何访问该Service的请求都将被负载均衡到Service下的其中一个Pod上。
在以上几个组件当中,可以说Pod是Kubernetes生态系统中的中央管理单元,充当共享资源和上下文的容器的逻辑边界。Pod分组方法允许多个相关进程同时运行,从而缩小了虚拟化和容器化之间的差异。目前有多种Pod在Kubernetes容器模型中发挥着至关重要的作用:
- 默认类型ReplicaSet保证给定数量的pod可以运行。
- Deployment是一种管理基于ReplicaSets的pod的声明式方法,这包括回滚和滚动更新机制。
- Daemonset确保每个节点运行一个Pod实例。使用健康监控、日志转发等集群服务。
- StatefulSet旨在管理必须承受或保留状态的Pod。
- Job和CronJob运行一次性或预定义的计划作业。
其它Kubernetes架构组件
Kubernetes维护应用程序的容器,但也可以管理集群中关联的应用程序数据。Kubernetes的用户可以在不了解底层存储基础设施的情况下请求存储资源。Kubernetes Volume是Pod可以访问和存储数据的目录。Volume类型决定了卷的内容、它的形成方式以及支持它的媒体。Persistent volumes(PV)是集群特定的存储资源,通常由管理员提供。PV的寿命也可能比给定的Pod长。
Kubernetes依赖于容器镜像,这些镜像存储在容器注册表中。它可能是第三方注册表或组织创建的注册表。
命名空间(NameSpace)是存在于物理集群内的虚拟集群,它们旨在为众多用户和团队创建独立的工作环境,并且还通过限制团队可以访问的Kubernetes对象来防止团队相互干扰。Pod内的Kubernetes容器可以通过 localhost与其他Pod进行通信,并共享IP地址和网络命名空间。
Kubernetes与Docker区别
Kubernetes和Docker都是提供容器管理和应用程序扩展的平台,Kubernetes提供了有效的容器管理解决方案,非常适合具有复杂设置的高需求应用程序。相比之下,Docker Swarm的构建是为了简单性,使其成为快速部署和维护的基本应用程序的绝佳选择。
- Docker Swarm比Kubernetes更容易部署和配置。
- Kubernetes提供基于流量的一体化可扩展性,而Docker Swarm则优先考虑快速扩展。
- 自动负载均衡在Docker Swarm中可用,但在Kubernetes中不可用。但是,第三方解决方案可能会将外部负载均衡器链接到Kubernetes。
所以,具体的使用需求决定了最终选择哪个工具。
容器编排解决方案
容器编排系统使开发人员能够启动多个容器来部署应用程序。IT经理可使用这些平台来自动管理实例、采购主机和连接容器。 以下是一些最好的容器编排工具,可促进部署、识别失败的容器实施及管理应用程序配置。
排名前5位的容器编排软件:
- Google Cloud Run
- Amazon Elastic Container Service(Amazon ECS)
- Mirantis Kubernetes Engine
- Google Kubernetes Engine
- Amazon Elastic Kubernetes Service(Amazon EKS)
Kubernetes架构最佳实践和设计原则
实施考虑安全、治理、监控、存储、网络、容器生命周期管理和编排的平台策略至关重要。然而,Kubernetes的采用和扩展面临着广泛的挑战,特别是对于同时管理本地和公共云基础设施的企业而言。为了简化它,下面介绍的是构建kubernetes集群时必须考虑的一些最佳实践。
- 确保始终拥有最新版本的Kubernetes。
- 投资于开发和运营团队的培训。
- 建立全公司治理,确保你的工具和提供程序与Kubernetes编排兼容。
- 通过将图像扫描技术纳入持续集成和交付(CI/CD)工作流程来提高安全性,应始终谨慎对待从GitHub存储库下载的开源代码。
- 在整个集群中实施基于角色的访问控制(RBAC),基于最小特权和零信任的模型应该成为常态。
- 仅使用非root用户并将文件系统设置为只读以进一步保护容器。
- 避免使用默认值,因为简单的声明不太容易出错并且可以更好地传达目的。
- 使用基本Docker Hub映像时要小心,因为它们可能包含恶意软件或包含不需要的代码。从精益、干净的代码开始,然后逐步提升。较小的图片增长得更快,占用的存储空间更少,并且提取图像的速度更快。
- 使容器尽可能简单,每个容器一个进程允许编排器报告该进程是否健康。
- 不要在失败时重新启动,因为Kubernetes将重新启动失败的容器。
- 要有描述性,描述性标签有利于现在和未来的开发人员。
- 说到微服务,不要太具体。逻辑代码组件中的每个函数都不能是其微服务。
- 在可能的情况下,自动化。你可以通过自动化CI/CD工作流程来完全跳过手动Kubernetes部署。
- 使用活力和就绪探针来协助管理Pod生命周期;否则,pod在准备好之前初始化或接收用户请求时可能会被终止。
如何选择你的容器
由于容器在企业中的广泛使用,以容器为中心的管理软件Kubernetes已成为部署和操作容器化应用程序的事实上的标准。Kubernetes架构简单直观。虽然它使技术经理能够更好地控制其基础架构和应用程序性能,但要充分利用该技术,还有很多东西需要学习。