金钱(警告)
** 状态:** 被贬值
** 原因:** 2016 年 12 月 22 日,CoreOS 宣布将不再维护车队;它将收到安全更新和错误修复,直到 2017 年 2 月,当时它将从CoreOS 中移除。
** 参见相反:** 若要了解如何在没有舰队的 CoreOS 上使用 Kubernetes,请参阅 Kubernetes on CoreOS Documentation。
介绍
CoreOS 提供了跨多服务器环境管理 Docker 容器的绝佳环境,使这个群集管理变得简单的最重要组件之一是名为 fleet 的服务。
Fleet 允许用户管理 Docker 容器作为整个集群的服务。它通过在每个集群成员的 systemd init 系统中作为接口和抽象级别来工作。用户可以设置影响服务运行条件的限制。
在本指南中,我们将探索舰队和fleetctl
实用程序,允许您控制戴蒙。
前提条件
要跟随本指南,你应该有一个CoreOS集群可用。
我们在本指南中使用的集群可以通过遵循我们的指南创建 如何在DigitalOcean上创建CoreOS集群。
已配置的集群有三个节点. 它们配置为使用私有网络接口相互通信。 每个节点都可以使用公共接口来运行公共服务。
- coreos-1
- coreos-2
- coreos-3
当您的集群准备好后,继续了解更多关于舰队的信息。
使用服务单元文件
在我们进入fleetctl
工具之前,我们应该谈谈服务单元文件。
systemd
init 系统使用单元文件来描述每个可用的服务,定义管理它所需的命令,并设置依赖性信息,以确保系统在每个服务启动时处于可操作状态。
要深入了解fleet
单元文件,请遵循我们关于此主题的 deep dive。 对于本指南,我们将简单地概述这些文件的格式。 我们还将提供一个例子单元文件,您可以使用来了解fleetctl
。
舰队单元档案
大多数单元文件将具有的基本部分是:
- 单元:本节用于提供不依赖单元
类型
的单元的通用信息。这将包括元数据信息和依赖信息。本节主要用于舰队
提供描述并指定该单元与其他服务单元相连的位置。 - 单元类型部分:
舰队
戴蒙可以采取不同类型的单元,包括:
- 服务
- 接口
- 设备
- 安装
- 自动
- 计时器
- 路径 MKK1
如果类型有特定选项,则允许关联类型的部分。服务
部分类型是最常见的。此部分用于定义特定类型属性。对于服务
单元,这通常涉及定义开始和停止命令,以及可能执行相关操作的预先和后开始或停止命令。
- X-Fleet:本节用于提供车队特定的配置选项,这主要意味着您可以根据机器ID、当前服务运行、元数据信息等标准指定服务必须或不应该以某种特定方式安排。
单元文件的一般格式将是:
1[Unit]
2Generic_option_1
3Generic_option_2
4
5[Service]
6Service_specific_option_1
7Service_specific_option_2
8
9[X-Fleet]
10Fleet_option_1
11Fleet_option_2
示例服务单元文件
要开始使用本教程,我们会给你一个单元文件来使用。 这是从 CoreOS quickstart 页面作为一个示例。
1vim hello.service
内部,输入我们的示例服务文件:
1[Unit]
2Description=My Service
3After=docker.service
4
5[Service]
6TimeoutStartSec=0
7ExecStartPre=-/usr/bin/docker kill hello
8ExecStartPre=-/usr/bin/docker rm hello
9ExecStartPre=/usr/bin/docker pull busybox
10ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
11ExecStop=/usr/bin/docker stop hello
让我们快点谈谈这件事是什么。
在[单位]
部分,设置了描述,我们告诉systemd
,此服务只能在docker.service
单元启动后运行。
在[服务]
部分中,我们禁用启动时间,然后设置一些操作在启动服务之前运行。ExecStartPre
在主要ExecStart
操作之前执行。如果这些操作被称为=-
,则意味着该操作可能会失败,而不会影响服务的完成。这是必要的,因为我们的预启动操作基本上会破坏任何可能已运行的服务。如果没有找到任何服务,则会失败,我们不想阻止我们的服务开始,因为这只是一个清理程序。
最后一个预启动操作将下载我们执行命令的基本 busybox 图像. 由于这是必要的,我们不会使用 =-
语法. 然后,我们将以无限循环开始一个容器,以此图像,每秒打印一次Hello World
。
如果您想要更多关于如何开发舰队文件的信息,请参阅 我们关于舰队单元文件的指南。
基本机器管理指令
我们要做的第一件事是向您介绍fleetctl
实用程序. 作为一个群集管理员,这个工具将是您管理机队的主要界面。
首先,我们可以通过键入所有集群成员的列表:
1fleetctl list-machines
1MACHINE IP METADATA
214ffe4c3... 10.132.249.212 -
31af37f7c... 10.132.249.206 -
49e389e93... 10.132.248.177 -
正如你所看到的,您的每台机器都被列为可用。当每个会员使用云配置文件启动时,它会生成一个独特的机器ID,用于识别每个节点。
默认情况下,舰队将使用机器的公共IPv4地址与其他成员进行通信,但是,在我们的云配置文件中,我们告诉舰队使用我们的私人接口进行通信。
METADATA
列目前在上面的示例中是空的,但是,我们可以在云配置中添加metadata
属性下任意的关键值对。
1#cloud-config
2. . .
3coreos:
4 fleet:
5 public-ip: $private_ipv4
6 metadata: region=europe,public_ip=$public_ipv4
如果您在云配置中设置此设置,以便启动所有机器,您的输出将更像是这样的:
1MACHINE IP METADATA
214ffe4c3... 10.132.249.212 public_ip=104.131.36.200,region=europe
31af37f7c... 10.132.249.206 public_ip=104.131.15.192,region=europe
49e389e93... 10.132.248.177 public_ip=104.131.15.192,region=europe
这些额外的数据有助于从管理角度快速获取有关节点的信息,但也可以用于服务定义,以针对特定主机。
要连接到集群中的特定机器,您可以使用fleetctl ssh
命令,这将允许您根据其机器ID或与提供的单位名称相关联的机器来识别要连接的机器。
例如,如果您有一个名为nginx.service
的运行单元,您可以通过键入以下方式连接到运行该服务的任何主机:
1fleetctl ssh nginx
您还可以在远程主机上运行单个命令,就像在正常的 ssh
可执行时一样。例如,要获取 CoreOS 设置的 COREOS_PRIVATE_IPV4
和 COREOS_PUBLIC_IPV4
变量值(基于云配置参数和可用的网络接口),您可以键入:
1fleetctl ssh nginx cat /etc/environment
1COREOS_PRIVATE_IPV4=10.132.249.212
2COREOS_PUBLIC_IPV4=104.131.29.80
服务管理
通过fleetctl
提供的大多数其他命令都是基于服务管理的。
开始服务
启动一个服务需要几个步骤。服务文件必须上传到舰队
,以便它知道该单元。 然后它必须安排在集群中的特定机器上。 然后它可以启动。 每个单元都有fleetctl
的命令,对后一个步骤负责的命令在必要时也会执行前一个。
您可以使用提交
命令将您的单元文件提交到舰队
。这将简单地导致舰队
将文件内容阅读到内存中,使其可用于进一步的操作。
1fleetctl submit hello.service
您的hello.service
文件现在被称为fleet
。 要查看已提交的单元文件,您可以键入:
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 inactive inactive -
正如你所看到的,单元文件存在,但没有在任何主机上计划或启动。
要查看fleet
知道的单元文件的内容,您可以键入:
1fleetctl cat hello.service
1[Unit]
2Description=My Service
3After=docker.service
4
5[Service]
6TimeoutStartSec=0
7ExecStartPre=-/usr/bin/docker kill hello
8ExecStartPre=-/usr/bin/docker rm hello
9ExecStartPre=/usr/bin/docker pull busybox
10ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
11ExecStop=/usr/bin/docker stop hello
这将允许您查看当前的文件,而舰队
知道。
** 注意**:提交命令是idempotent,这意味着如果您重新提交该单元文件,‘fleet’ 将更新内存单元文件,如果您需要更新单元文件,您必须完全删除它,然后重新提交它。
一旦您的单元提交,下一步是将其安排在一台机器上。计划单元涉及舰队
引擎观察单元,以决定在集群中传输单元的最佳机器。这将根据单元的X-Fleet
部分的条件预测,以及集群中的每个机器的当前工作量。
使用加载
命令来加载和安排单位:
1fleetctl load hello.service
1Unit hello.service loaded on 14ffe4c3.../10.132.249.212
如果您之前没有手动加载您的设备,它将通过在当前目录中搜索相应的文件名自动加载作为此过程的一部分。
现在,如果我们检查我们的单元文件,我们可以看到它已经被加载了,我们甚至可以看到它计划在哪台机器上:
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 loaded loaded 14ffe4c3.../10.132.249.212
這也是我們第一次檢查「列表單位」命令的機會,這個命令用來顯示任何正在運行或預定單位及其狀態:
1fleetctl list-units
1UNIT MACHINE ACTIVE SUB
2hello.service 14ffe4c3.../10.132.249.212 inactive dead
要实际启动一个单元,你可以使用开始
命令,这将通过执行单元文件中定义的启动命令来启动该单元的机器:
1fleetctl start hello.service
1Unit hello.service launched on 14ffe4c3.../10.132.249.212
再一次,我们应该检查列表单元文件
:
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 launched launched 14ffe4c3.../10.132.249.212
在上述输出中,我们可以看到该服务已经启动了。DSTATE
列表示所需状态
,STATE
列表示实际状态。
我们也应该再次看看列表单元
:
1fleetctl list-units
1UNIT MACHINE ACTIVE SUB
2hello.service 14ffe4c3.../10.132.249.212 active running
这给了我们有关systemd
状态的信息,它是直接从本地大门收集的,所以这是一个更好地了解本地系统如何看待服务状态的图像。
停止服务
上面的每一个命令都有一个伴侣命令,可以逆转状态。
例如,要阻止服务运行,请使用停止
命令,这将导致本地机器的systemd
实例执行该单元中定义的停止命令:
1fleetctl stop hello.service
1Unit hello.service loaded on 14ffe4c3.../10.132.249.212
正如你所看到的,该服务已经恢复到已加载
状态,这意味着它仍然在机器的systemd
中加载,但目前还没有运行。
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 loaded loaded 14ffe4c3.../10.132.249.212
要从该机器的系统d中删除该单元,但在舰队
中保持其可用性,您可以卸载
该单元。
1fleetctl unload hello.service
如果我们检查状态,我们可以看到它现在被标记为不活跃。
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 inactive inactive -
如果我们想完全从舰队
中删除该单元,我们可以使用摧毁
命令,如果需要,将停止和卸载该单元,然后从舰队
中删除该单元:
1fleetctl destroy hello.service
如果你修改一个单元文件,你必须在 fleet
中摧毁当前单元,然后再提交或启动它。
获得单位地位
您已经看到了一些获取有关单位状态信息的方法。
例如,我们涵盖了列表单元
如何列出目前在机器上安排的所有单元:
1fleetctl list-units
1UNIT MACHINE ACTIVE SUB
2hello.service 14ffe4c3.../10.132.249.212 active running
列表单元文件
提供了所有舰队
知道的单元列表,还提供有关所需和实际状态的信息:
1fleetctl list-unit-files
1UNIT HASH DSTATE STATE TMACHINE
2hello.service 0d1c468 launched launched 14ffe4c3.../10.132.249.212
有关已启动的单元的更具体信息,还有一些其他命令。状态
命令将运行该单元的主机上的服务的systemctl status
结果传回:
1fleetctl status hello.service
1● hello.service - My Service
2 Loaded: loaded (/run/fleet/units/hello.service; linked-runtime)
3 Active: active (running) since Mon 2014-09-08 21:51:22 UTC; 3min 57s ago
4 Process: 7630 ExecStartPre=/usr/bin/docker pull busybox (code=exited, status=0/SUCCESS)
5 Process: 7618 ExecStartPre=/usr/bin/docker rm hello (code=exited, status=0/SUCCESS)
6 Process: 7609 ExecStartPre=/usr/bin/docker kill hello (code=exited, status=0/SUCCESS)
7 Main PID: 7638 (docker)
8 CGroup: /system.slice/hello.service
9 └─7638 /usr/bin/docker run --name hello busybox /bin/sh -c while true; do echo Hello World; sleep 1; done
10
11Sep 08 21:55:11 coreos-3 docker[7638]: Hello World
12Sep 08 21:55:12 coreos-3 docker[7638]: Hello World
13Sep 08 21:55:13 coreos-3 docker[7638]: Hello World
14Sep 08 21:55:14 coreos-3 docker[7638]: Hello World
15Sep 08 21:55:15 coreos-3 docker[7638]: Hello World
16Sep 08 21:55:16 coreos-3 docker[7638]: Hello World
17Sep 08 21:55:17 coreos-3 docker[7638]: Hello World
18Sep 08 21:55:18 coreos-3 docker[7638]: Hello World
19Sep 08 21:55:19 coreos-3 docker[7638]: Hello World
20Sep 08 21:55:20 coreos-3 docker[7638]: Hello World
正如你所看到的,我们终于可以验证我们的单位的产量正在生产中。
同样,如果您想看到相关机器上可用的服务的日志条目,您可以使用日志
命令:
1fleetctl journal hello.service
1-- Logs begin at Mon 2014-09-08 14:22:14 UTC, end at Mon 2014-09-08 21:55:47 UTC. --
2Sep 08 21:55:38 coreos-3 docker[7638]: Hello World
3Sep 08 21:55:39 coreos-3 docker[7638]: Hello World
4Sep 08 21:55:40 coreos-3 docker[7638]: Hello World
5Sep 08 21:55:41 coreos-3 docker[7638]: Hello World
6Sep 08 21:55:42 coreos-3 docker[7638]: Hello World
7Sep 08 21:55:43 coreos-3 docker[7638]: Hello World
8Sep 08 21:55:44 coreos-3 docker[7638]: Hello World
9Sep 08 21:55:45 coreos-3 docker[7638]: Hello World
10Sep 08 21:55:46 coreos-3 docker[7638]: Hello World
11Sep 08 21:55:47 coreos-3 docker[7638]: Hello World
默认情况下,这将显示最后的 10 行. 您可以通过添加一个 --line
参数来调整:
1fleetctl journal --lines 20 hello.service
您还可以使用-f
参数,该参数代表follow
。这与尾巴-f
类似,因为它将继续传回最新的日志条目:
1fleetctl journal -f hello.service
结论
通过学习如何有效地使用fleet
和fleetctl
,您可以轻松地控制您的CoreOS集群。
在以后的指南中,我们将深入讨论(https://andsky.com/tech/tutorials/how-to-create-flexible-services-for-a-coreos-cluster-with-fleet-unit-files)如何创建群组单元文件,这将使您能够创建灵活而强大的服务,利用CoreOS架构。