本文永久链接: https://www.xtplayer.cn/kubernetes/concepts-and-matters/
要完全理解该技术,您需要知道为什么使用容器编排工具以及 Kubernetes 是如何出现的。Kubernetes 的故事始于容器,为了解容器的好处,让我们看看软件部署机制是如何随着时间演变的。
在过去,软件部署相对困难,耗时且容易出错。要安装应用程序,需要购买许多物理机并为 CPU 和内存支付超出实际需要的费用。几年后,虚拟化成为主流。一台功能强大的裸机服务器可以托管多台虚拟机,CPU 和内存可以共享,因此您节省了一些成本。如今,机器可以比虚拟服务器分割成更小的部分 — 容器。容器仅在几年之间变得如此流行。那么,Linux 容器到底是什么?Docker 适合用在什么场景?
容器就像虚拟机一样提供一种虚拟化的实现,主机管理程序提供了硬件级别的隔离,而容器提供了进程级别的隔离。
为了理解这种差异,让我们回到示例中。
您决定使用容器,而不是为 Apache 和 MySQL 创建虚拟机。现在,您的堆栈如下图所示。
容器也是操作系统上的一组进程,容器通过 Linux 内核功能(例如:cgroups,chroot,UnionFS 和 命名空间)与其他进程/容器完全隔离。
这意味着您只需支付一台物理主机的费用,安装一个操作系统,尽可能多的运行容器从而提高资源利用率。减少在同一物理主机上运行所需的操作系统数量,意味着更少的存储,内存和 CPU 浪费。
2010 年,Docker 成立。Docker 可以指公司和产品。Docker 让用户和公司非常容易地利用容器进行软件部署。需要注意的一点是,Docker 并不是市场上唯一能够做到这一点的工具。还有其他应用程序,如 rkt、Apache Mesos、LXC 等,但 Docker 是最受欢迎的一个。
在同一个操作系统上以进程(也就是容器)的形式运行完整服务的能力是革命性的。它本身带来了很多可能性:
由于容器比虚拟机便宜得多,速度也快得多,所以大型应用程序现在可以被分解成小的、相互依赖的组件,每个组件都在自己的容器中运行。这种体系结构被称为微服务。
随着微服务体系结构越来越占主导地位,应用程序有了更大更丰富的自由。以前,单个应用程序一直在发展,直到达到一定的限制,使其变得笨拙、更难调试,并且非常难以重新部署。然而,随着容器的出现,要向应用程序添加更多特性,所需要做的就是构建更多的容器/服务。使用 IaC(基础设施即代码),部署就像对配置文件运行命令一样简单。
如今,服务不可访问已是不再可接受的。用户根本不在乎您的应用程序是否正在发生网络中断或群集节点崩溃。如果您的系统未运行,则用户将直接切换到您的竞争对手。
容器是过程,而过程本质上是短暂的。如果容器损坏了怎么办?
为了实现高可用性,您为每个组件创建多个容器。例如,Apache 的两个容器,每个容器都托管一个 Web 服务器。但是,其中哪一个将响应客户的请求?
当您需要更新应用程序时,您想利用每个服务的多个容器。您将在容器的一部分上部署新代码,重新创建它们,然后在其余容器上执行相同的操作。但是,手动执行此操作非常困难。更不用说容易出错。
容器配置。
维护正在运行的容器的状态(和数量)。
通过将容器从一个节点移动到另一个节点,将应用程序负载平均分配到硬件节点上。
承载相同服务的容器之间的负载平衡。
处理容器持久性存储。
确保即使推出更新,该应用程序始终可用。
以上所有内容都鼓励 IT 专业人员做一件事:创建尽可能多的容器。但是,这也有缺点:
例如,假设您有一个微服务应用程序,该应用程序具有运行 Apache,Ruby,Python 和 NodeJS 的多个服务。您使用容器来充分利用手头的硬件。但是,由于有很多容器分散在您的节点上而没有被管理,因此基础架构可能如下图所示。
因此,您需要一个容器编排引擎!
Kubernetes 是一个容器编排工具。编排是容器生命周期管理的另一个名称,容器编排引擎执行许多任务。
就像 Docker 并不是目前唯一的容器平台一样,Kubernetes 并不是市场上唯一的编排工具。还有其他工具,例如 Docker Swarm,Apache Mesos,Marathon 等。那么,什么使 Kubernetes 成为最常用的呢?
Kubernetes 最初是由软件和搜索巨头 Google 开发的,Kubernetes 是他们 Borg 项目的一个分支。自成立以来,Kubernetes 受到了开源社区的巨大推动,它是 Cloud Native Computing Foundation 的主要项目。一些最大的市场参与者正在支持它:Google,AWS,Azure,IBM 和 Cisco 等。
Kubernetes 是一个希腊单词,代表舵手或船长。它是你们集群的管理者,为了能够完成这项关键的工作,Kubernetes 以高度模块化的方式设计。该技术的每个部分都为依赖它的服务提供了必要的基础。下图展示了应用程序如何工作的概览,每个模块都包含在一个更大的模块中,该模块依赖于它的功能。让我们更深入地研究每一个问题。
也被称为控制平面,它是整个系统最核心的部分。它提供了许多 RESTful API,使集群能够执行其最基本的操作。核心的另一部分是执行,执行涉及许多控制器,如副本控制器、复制集、部署等。它还包括 kubelet,它是负责与容器运行时通信的模块。
核心还负责联系其他层(通过 kubelet)来全面管理容器。让我们简要地了解它们:
Kubernetes 使用容器运行时接口(CRI)来透明地管理容器,而不必知道(或处理)所使用的运行时。当我们讨论容器时,我们提到了 Docker,尽管它很受欢迎,但并不是唯一可用的容器管理系统。Kubernetes 默认使用 containerd 作为容器运行时。这就是你能够对 Kubernetes 容器发出标准 Docker 命令的方式。它还使用 rkt 作为替代运行时。在这一点上不要太困惑。这是 Kubernetes 的内部工作原理,尽管您需要理解它,但您几乎不必完全处理它。Kubernetes 通过其丰富的 api 对这一层进行了抽象。
正如我们前面所讨论的,容器编制系统负责管理容器和服务通信所通过的网络。Kubernetes 使用称为容器网络接口(CNI)的库作为集群和各种网络提供商之间的接口。Kubernetes 中可以使用许多网络供应商。这个数字是不断变化的。举几个例子:
这个清单太长了,在这里就不再一一列举。你可能会问: 为什么 Kubernetes 需要多个网络提供商来进行选择?Kubernetes 的设计主要用于部署在不同的环境中,Kubernetes 节点可以是裸金属物理服务器、虚拟机或云实例中的任何节点。有了这样的多样性,对于容器如何彼此通信,您实际上有无穷多的选择。这需要不止一个人来选择,这就是 Kubernetes 设计者选择将 CNI 背后的网络提供者层抽象出来的原因。
卷广义上是指将用于 Pod 的存储空间。 Pod 是由 Kubernetes 作为一个单元管理的一个或多个容器。因为 Kubernetes 被设计为部署在多个环境中,所以集群和底层存储之间存在一个抽象层。Kubernetes 还使用 CSI(容器存储接口)来与各种已经可用的存储插件进行交互。
Kubernetes 必须能够访问镜像仓库(无论是公共的还是私有的)才能获取镜像并创建出容器。
Kubernetes 可以部署在您可能想到的几乎任何平台上。但是,大多数用户喜欢使用 AWS,Azure 或 GCP 之类的云提供商,以节省更多成本。Kubernetes 依靠云提供商的 API 来执行可伸缩性和资源供应任务,例如:供应负载平衡器,访问云存储,利用节点间 VPC 网络等。
如果您要在用户数量较少的小型公司中配置 Kubernetes 集群,则身份验证不会成为大问题。您可以为每个用户创建一个帐户。但是,如果您在大型企业中工作,有成百上千的开发人员、操作员、测试人员、安全专业人员等,手动为每个人创建一个帐户可能会变成一场噩梦。Kubernetes 的设计人员在开发身份验证机制时就考虑到了这一点,只要集群使用OpenID connect,您就可以使用自己的身份提供程序系统对集群中的用户进行身份验证。
这也称为服务结构层。它负责集群的一些更高级别的功能:路由、自我修复、负载平衡、服务发现和基本部署(有关更多信息,请参考 https://kubernetes.io/docs/concepts/services-networking/ 和 https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)。
这就是应用策略执行选项的地方。在这一层中,执行指标收集和自动缩放等功能。它还控制授权和不同资源(如网络和存储)之间的配额。您可以访问此处了解更多关于资源配额的信息。
在这一层中,有用于与集群交互的面向客户端的工具,目前,kubectl 是最受欢迎的客户端程序。在后台,它向 Kubernetes 发出 RESTful API 请求,并根据提供的选项以 JSON 或 YAML 的形式显示响应。kubectl 可以很容易地与其他高级工具集成,以促进集群管理。
在同一领域还有 helm,它可以被认为是运行在 Kubernetes 之上的应用程序包管理器。使用 helm-charts,只需在配置文件中定义其属性/参数,就可以在 Kubernetes 上运行完整的应用服务。
Kubernetes 是最繁忙的开源项目之一。它有一个庞大的、充满活力的用户社区,它不断地变化以适应新的要求和挑战。Kubernetes 提供了大量的特性。尽管它只有几年的历史,但它能够支持几乎所有类型的环境。Kubernetes 在许多现代软件构建/部署实践中被使用,包括:
DevOps: 为测试和 QA 更容易、更快的提供临时环境;
CI/CD:使用 Kubernetes 管理的容器,构建持续的集成/部署,甚至交付管道也更加无缝连接。您可以轻松地将诸如Jenkins,TravisCI,Drone CI 之类的工具与 Kubernetes 集成在一起,以构建/测试/部署应用程序和其他云组件。
ChatOps:像 Slack 这样的聊天应用程序可以轻松地与 Kubernetes 提供的丰富 API 集集成,以监控甚至管理集群。
云托管的 Kubernetes:大多数云提供商都提供已安装 Kubernetes 的产品。例如,AWS EKS,Google GKE 和 Azure AKS。
GitOps:Kubernetes 中的所有内容都通过 YAML 文件进行管理。使用 Git 之类的版本控制系统,您可以轻松管理集群应用,甚至不必使用 kubectl。