剑客
关注科技互联网

CoreOS 入门

【编者的话】本文是一篇 CoreOS 入门文章。分别介绍了 CoreOS 的三个主要组件——配置和服务发现、应用程序管理和调度以及应用程序,对一些概念进行了解释,并初步介绍了一些 CoreOS 的高阶组件供读者探索。

如果你正在阅读这篇博客,那么你大概知道容器是什么以及为何要使用它们。 Docker 通过容器使得实验更加容易,在生产环境中部署和管理容器正逐渐变得更加容易。 然而,Docker 所提供的(免费的)服务仍然留下了很多空白,已经有公司开始填补这些空白。

CoreOS 就是一个这样的选择; 它不只是一个容器管理系统,而是一个设计用于运行容器的完整(基于 Linux 的)操作系统。

CoreOS 组件

CoreOS 由执行特定功能的三个关键组件组成。

配置和服务发现

etcd
是一个全局分布式键值存储,它允许集群中的节点相互交换配置,并且还可以探知集群中可用的服务。 可以通过命令行实用程序或通过 HTTP 端点从 etc
中获取信息。

应用程序管理和调度

fleet
是一个集群范围的 init(运行所有其他进程的第一个进程)系统,它与每个节点上运行的 systemd
init 系统交互。 这意味着可以从中心点启动和管理每个节点上的各个进程。

应用程序

CoreOS 中没有包管理器, 所有应用程序在容器内运行。 这些应用程序可以使用Docke r或者 CoreOS 原生容器引擎 — rkt(Rocket)。

入门

由于 CoreOS 是一个完整的操作系统,开始使用 CoreOS 意味着你需要在几个节点上安装操作系统以便测试。 如果你是 Mac 或 Windows 用户,则需要使用 Vagrant
或在托管提供商(如 AWS
Digital Ocean
)上尝试预配置的集群。

一旦安装了 CoreOS,需要在符合 “cloud-config” 格式的配置文件中定义集群, 它提供了很多可以发送到集群的 配置选项
,比如,我正在试验的Vagrant图像。 一旦安装,你会发现一个 config.rb.sample
文件,可以重命名(如 config.rb
)和更改,以匹配在集群中的预想的实例数量。 例如:

$num_instances=3

还需要取消注释并更改CoreOS更新渠道:

$update_channel='stable'

在构建过程中,Vagrant 脚本会将默认云配置写入用户数据文件,所以要复制一份示例文件: cp user-data.sample user-data
使用 Vagrant 启动群集,当群集就绪时,可以通过 vagrant ssh core-01 - -A
连接到的节点。

部署应用

要弄明白 CoreOS 如何起到辅助作用的最好方法是实现一个例子。 在CoreOS中可以使用所熟悉的 Docker 镜像、容器和命令。

docker run --name mongo-db -d mongo

此命令将启动名为 mongo-db
的MongoDB容器实例。 虽然这是标准的Docker操作,但它不能帮助你发挥 CoreOS 的全部功能和灵活性。 如果 Mongo 实例崩溃或者实例重启怎么办? 这时就需要Fleet及其对 systemd
的控制来发挥作用。

要使用 systemd
,需要创建一个代表所要运行的应用程序的服务, 这称之为单元文件。 在集群其中一台机器上,在 / etc / systemd / system
中创建 mongo.service

ini [Unit] Description=MongoService After=docker.service Requires=docker.service

[Service] TimeoutStartSec=0 ExecStartPre=-/usr/bin/docker kill mongo-db ExecStartPre=-/usr/bin/docker rm mongo-db ExecStartPre=/usr/bin/docker pull mongo ExecStart=/usr/bin/docker run --name mongo-db -d mongo

[Install] WantedBy=multi-user.target

启用并启动服务:

sudo systemctl enable /etc/systemd/system/mongo.service sudo systemctl start mongo.service

现在可以使用常用的 docker ps
来查看正在运行的容器。 这仍然与集群中的单个节点相关,启动集群上的服务,而不必担心它在哪里运行,需要使用fleet:

fleetctl start mongo.service

查看已启动的容器:

fleetctl list-units

阅读 文档
了解单元文件的更高级的概念。

可用性传播

如果要确保服务上的实例在单个节点上运行,请将服务文件重命名为 mongo @ .service
,并将下面代码添加到文件底部:

ini ... [X-Fleet] Conflicts=mongo@*.service

现在,可以启动多个服务实例,每个机器上运行一个实例:

fleetctl start mongo@1 fleetctl start mongo@2

并再次使用 fleetctl list-units
来检查实例的运行情况。

集群中的所有机器都与在集群中被选为leader的节点保持常规联系。 如果一个节点发生故障,当合适的替换可用时,在其上运行的系统单元将被标记为重新调度。 通过登录到一个节点,使用 sudo systemctl stop fleet
停止队列进程,等待几分钟后使用 sudo systemctl start fleet
重新启动,来模拟节点故障的情况。 可以通过 sudo journalctl -u fleet
读取fleet日志,以获得更多的内部细节。

现在可以将新服务添加到cloud-config文件,以确保机器上的 systemd
启动时服务也能启动。

units: - name: mongo.service command: start

Fleet 为高级设置提供了更多配置选项,例如在整个群集中运行单元或运行基于机器的容量或位置的调度单元。

进阶

上面列出的组件是 CoreOS 的基本组件,但还有其他几个组件对于基于容器的应用程序很有用,可与 CoreOS 一起使用。

Kubernetes

由 Google 创建的最流行的容器管理系统,在 CoreOS 上运行得更好,并提供了更高(和更可视化)级别的容器管理。 有关更多详细信息,请阅读 CoreOS安装指南

R(oc)k(e)t

关于rkt的讨论
本身是一篇完整的文章,但 rkt 是一个 Linux 原生容器运行时, 这意味着不使用虚拟机就不能在 MacOS 或 Windows 上工作。 它旨在更整齐地融入Linux 生态系统,利用系统级初始化系统,而不是使用自己的自定义方法(如Docker)。 它使用 appc 标准,所以在理论上,大多数 Docker 镜像应该与rkt一起结合使用。

原文链接: An Introduction to CoreOS
(翻译: 李加庆

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址