状态: 过时本文不再是当前文章。 如果你有兴趣为这篇文章写一个更新,请看 DigitalOcean 想要发布你的技术教程! 原因: 2016年12月22日,CoreOS 宣布不再维护车队。 Coreos 建议使用 Kubernetes 来满足所有的集群需求。 参见: 有关在没有舰队的 CoreOS 上使用 Kubernetes 的指导,请参见 CoreOS 文档中的 Kubernetes。

什么是 CoreOS?

Coreos 是一个功能强大的 Linux 发行版,用于在多种基础设施上简单管理大型、可伸缩的部署。 基于 chromeos 的构建,CoreOS 维护了一个轻量级的主机系统,并为所有应用程序使用 Docker 容器。 这个系统提供了移动应用进程隔离,并且允许应用程序轻松地在整个集群中移动。

为了管理这些集群,CoreOS 使用一个全局分布的键值存储,称为 etcd,在节点之间传递配置数据。 该组件还是服务发现的平台,允许根据共享资源提供的信息动态配置应用程序。

为了在整个集群中调度和管理应用程序,使用了一个名为 fleet 的工具。 Fleet 作为一个集群范围的 init 系统,可用于管理整个集群的流程。 这使得配置高可用性应用程序和从单点管理集群变得容易。 它通过绑定到每个单独的节点的 systemd init 系统来实现这一点。

在本指南中,我们将向您介绍一些关键的 CoreOS 概念,并介绍允许系统工作的每个核心组件。 在后面的指南中,我们将讨论如何开始使用 DigitalOcean 上的 CoreOS。

系统设计

一个 CoreOS 安装的总体设计是面向集群和集装箱化的。

主要的主机系统相对简单,放弃了许多传统服务器的共同“特性”。 事实上,CoreOS 甚至没有包管理器。 相反,所有其他应用程序都将作为 Docker 容器运行,从而实现服务的隔离、可移植性和外部管理。

在启动时,CoreOS 读取一个名为“ cloud-config”的用户提供的配置文件来进行一些初始配置。 该文件允许 CoreOS 与集群的其他成员连接,启动基本服务,并重新配置重要参数。 这就是为什么 CoreOS 能够在创建时立即加入集群作为工作单元。

通常,“ cloud-config”文件至少会告诉主机如何加入现有的集群,并命令主机启动两个服务,即 etcd 和 fleet。 所有这三个行动都是相关的。 它们允许新主机与现有服务器连接,并提供必要的工具来配置和管理集群中的每个节点。 基本上,这些是引导 CoreOS 节点到集群的需求。

Etcd 守护进程用于存储数据并将数据分发给集群中的每个主机。 这对于保持一致的配置非常有用,而且它还可以作为一个平台,服务可以通过这个平台宣布它们自己。 其他服务可以使用这种服务发现机制来查询信息,以便调整其配置细节。 例如,负载均衡器在启动时可以查询多个后端 web 服务器的 IP 地址。

舰队守护进程基本上是一个分布式 init 系统。 它通过挂钩到集群中每个独立主机上的 systemd init 系统来工作。 它处理服务调度,根据用户定义的标准约束部署目标。 用户可以将集群概念化为一个具有舰队的单个单元,而不必担心每个服务器。

现在您已经对整个系统有了一个大致的了解,接下来让我们详细了解一下每个特定组件的细节。 理解这些因素所起的作用是很重要的。

多克尔基本概述

是一个使用 LXC,也称为 Linux 容器,并且使用内核名称空间和 cgroups 来隔离进程的 Linux 集装箱化系统。

隔离有助于保持应用程序运行环境的清洁和可预测性。 不过,这个系统的主要优点之一是它使分发软件变得微不足道。 一个 Docker 容器应该能够运行完全相同的操作环境。 这意味着在笔记本电脑上构建的容器可以在数据中心范围的集群上无缝地运行。

Docker 允许您分发具有所有必要依赖项的工作软件环境。 Docker 容器可以与其他容器并排运行,但充当单独的服务器。 与虚拟化相比,Docker 容器的优势在于 Docker 不寻求模拟整个操作系统,它只实现让应用程序运行所需的组件。 正因为如此,Docker 有许多虚拟化的好处,但不需要大量的资源成本。

Coreos 利用 Docker 容器来处理基础安装中包含的小集合之外的任何软件。 这意味着几乎所有的东西都必须在一个容器中运行。 虽然这一开始看起来有点麻烦,但是它使集群编排变得非常容易。 Coreos 的设计主要是在集群级别操作,而不是在单个服务器级别操作。

这使得分发服务和分散您的负载在 CoreOS 上变得容易。 所包含的工具和服务将允许您在所提供的约束内的任何可用节点上启动流程。 Docker 允许这些服务和任务作为自包含的块分布,而不是必须在每个节点上配置的应用程序。

Etcd 的基本概况

为了向集群中的每个节点提供一组一致的全局数据,并启用服务发现功能,开发了一个名为 etcd 的服务。

Etcd 服务是一个高度可用的键值存储,每个节点可以使用它来获取配置数据、查询正在运行的服务的信息以及发布其他成员应该知道的信息。 每个节点都运行自己的 etcd 客户端。 这些配置用于与集群中的其他客户机通信,以共享和分发信息。

希望从存储中检索信息的应用程序只需连接到本地机器上的 etcd 接口。 每个节点上的所有 etcd 数据都是可用的,不管它实际存储在哪里,每个存储的值都将在整个集群中自动分布和复制。 领导人选举也是自动处理的,使得管理的关键存储相当琐碎。

要与 etcd 数据进行交互,您可以使用简单的 http / json API (默认情况下可以在 http://127.0.0.1:4001/v2/keys/ 访问) ,或者您可以使用一个名为 etcdctl 的内置实用程序来操作或读取数据。 Etcdctl 命令和 HTTP API 都是与存储交互的简单和可预测的方式。

认识到运行在 Docker 容器中的应用程序也可以访问 HTTP API 是很重要的。 这意味着单个容器的配置可以考虑存储在 etcd 中的值。

船队基本概况

为了实际编排您正在构建的 CoreOS 集群,使用了一个名为 fleet 的工具。 一个相当简单的概念,fleet 充当一个集群范围的 init 系统。

集群环境中的每个单独节点都操作自己的传统 systemd init 系统。 这用于启动和管理本地计算机上的服务。 简单地说,fleet 所做的就是为控制集群成员的每个 systemd 系统提供一个接口。

您可以启动或停止服务,或者获取有关在整个集群中运行进程的状态信息。 然而,舰队做了一些重要的事情,使这更可用。 它处理进程分发机制,因此可以在不太繁忙的主机上启动服务。

还可以为正在运行的服务指定放置条件。 您可以坚持服务必须或不必在某些主机上运行,这取决于它们位于何处、它们已经在运行什么等等。 因为 fleet 利用 systemd 启动本地进程,所以定义服务的每个文件都是 systemd 单元文件(带有一些自定义选项)。 您可以将这些配置文件传递到 fleet 中一次,并为整个集群管理它们。

这种灵活性使得设计高可用性配置变得简单。 例如,您可以要求将每个 web 服务器容器部署在单独的节点上。 类似地,您可以确保只在运行父容器的节点上部署帮助器容器。

任何成员节点都可以使用 fleetctl 实用工具来管理集群。 这允许您调度服务、管理节点和查看系统的一般状态。 Fleetctl 程序将是您与集群的主要接口。

总结

Coreos 可能不同于您可能熟悉的大多数其他 Linux 发行版。 在作出每个设计决策时,都考虑到了集群管理和应用程序的可移植性。 这导致了一个重点突出、功能强大的发行版,以满足现代基础设施和应用程序扩展的需求。

要了解更多关于如何开始的信息,请查看我们的指南,关于如何让 CoreOS 集群在 DigitalOcean 上运行。