如何使用 Fleet 和 Fleetctl 管理 CoreOS 群集

金钱(警告)

** 状态:** 被贬值

** 原因:** 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_IPV4COREOS_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

结论

通过学习如何有效地使用fleetfleetctl,您可以轻松地控制您的CoreOS集群。

在以后的指南中,我们将深入讨论(https://andsky.com/tech/tutorials/how-to-create-flexible-services-for-a-coreos-cluster-with-fleet-unit-files)如何创建群组单元文件,这将使您能够创建灵活而强大的服务,利用CoreOS架构。

Published At
Categories with 技术
comments powered by Disqus