如果您正在阅读此博客,那么您将大致了解什么是容器以及为什么要使用它们。 Docker使容器的实验变得容易,并且正逐渐使其在生产环境中的部署和管理变得更加容易。 但是,在Docker提供的产品(免费)上仍然存在很多空白,并且其他人已经加紧弥补了这些空白。
CoreOS就是这样一种选择。 它不仅是容器管理系统,而且是旨在运行容器的整个(基于Linux)操作系统。
CoreOS由执行特定功能的三个关键组件组成。
etcd是全局分布的键值存储,它允许集群中的节点彼此交换配置,并且还知道集群中可用的服务。 可以通过命令行实用程序或HTTP端点从etc信息。
fleet是一个集群范围内的init(运行所有其他进程的第一个进程)系统,它与在每个单独节点上运行的systemd init系统进行交互。 这意味着您可以从一个中心点启动和管理每个节点上的各个进程。
CoreOS中没有软件包管理器。 所有应用程序都在容器中运行。 这些可以使用Docker或CoreOS的本机容器引擎rkt(火箭)。
由于它是一个完整的操作系统,因此开始使用CoreOS意味着您需要在几个节点上安装OS才能对其进行正确测试。 如果您是Mac或Windows用户,则需要使用Vagrant或在托管提供商(例如AWS或Digital Ocean)上尝试预先配置的集群。
一旦安装了CoreOS,就需要在符合“ cloud-config”格式的配置文件中定义集群。 它提供了许多配置选项 ,您可以将它们发送到集群。 例如,我正在尝试Vagrant图片。 安装完成后,您将找到一个config.rb.sample文件,您可以对其进行重命名(更改为config.rb )并进行更改以匹配您希望在集群中使用的实例数。 例如:
$num_instances=3您还需要取消注释并更改CoreOS更新通道:
$update_channel='stable'在构建过程中,Vagrant脚本会将默认的cloud-config写入用户数据文件,因此请使用cp user-data.sample user-data复制提供的示例文件。
在启动Vagrant的情况下启动群集,然后在群集准备就绪时,可以使用vagrant ssh core-01 -- -A连接到节点。
!新的号召性用语
了解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来检查您的实例是否正在运行以及在何处运行。
群集中的所有计算机都与选举为群集中的领导者的节点保持定期联系。 如果一个节点发生故障,则将在该节点上运行的系统单元标记为可重新调度,就像有合适的替换节点可用时一样。 您可以通过以下方式模拟这种情况:登录到一个节点,使用sudo systemctl stop fleet进程,等待几分钟,然后使用sudo systemctl start fleet重新启动它。 您可以阅读车队日志sudo journalctl -u fleet以了解发生的情况。
现在,您可以将新服务添加到cloud-config文件的底部,以确保在systemd在计算机上启动时启动。
units: - name: mongo.service command: startFleet为高级设置提供了更多配置选项 ,例如在整个集群中运行一个单元或根据计算机的容量或位置来调度单元。
上面概述的组件是CoreOS的基本组件,但是对于基于容器的应用程序来说,还有一些其他有用的东西可以很好地与CoreOS一起使用。
Google创建的最受欢迎的容器管理系统在CoreOS上运行得更好,并提供了更高(更直观)的容器管理级别。 阅读CoreOS安装指南以获取更多详细信息。
讨论rkt本身是全文,但rkt是Linux本机容器运行时。 这意味着如果不使用虚拟机,它将无法在MacOS或Windows上运行。 它旨在更整洁地适应Linux生态系统,利用系统级初始化系统,而不是使用自己的自定义方法(如Docker)。 它使用appc标准 ,因此从理论上讲,大多数Docker映像也应与rkt一起使用。
如果您对Linux和init系统的概念很有经验,那么您可能会发现CoreOS是与Docker映像一起使用的引人注目的工具。 该项目(和团队)正在增长,最近由于新的资金来源而在欧洲开设了办事处。 我很想知道您对使用它的感觉。
翻译自: https://www.javacodegeeks.com/2016/09/an-introduction-to-coreos.html
















