CoreOS上的Fleet,第二部分

本文讲的是CoreOS上的Fleet,第二部分,【译者的话】紧接前一篇文章,这篇文章是介绍fleet的一些命令,用来管理托管在它之上的服务的。

在我前一篇文章中,我们学到了fleet当一个集群中的节点挂了时,是怎么重新安排服务来让程序保持可用。描述具体点,就是原本在挂了的节点上跑的代码会自动迁移到集群中其它的可用节点上。从外部看来,你的应用平滑运行如斯。

如果你有兴趣了解fleet是如何适配CoreOS的更多细节,我们可以深入了解之前一篇关于self-sufficient containers的文章

在这篇文章里,我会介绍下与fleet交互的一些命令。这为后续的介绍fleet的更多高级功能的文章打一个基础。但是在我们开始介绍这些命令前,我们先重新看一遍单元配置文件。因为后面介绍的那些命令,多数就是在操作单元配置文件的。

单元配置文件

如你所知,单元配置文件定义了你要在集群中跑的服务。可以想成它就是fleet管理应用的方式。

你可能会想:“我可以手工操作来跑应用么?” 当然可以咯,不过如果你这么做,fleet就不能得知这个应用的情况,因此也不能管理这个应用。所以我们还是需要用fleet的单元配置文件来定义这个应用成fleet里的服务。

所以,我们应该怎么用fleet的单元配置文件?

首先,让我们来看一下那些我们可用来加载并运行单元配置文件的命令。然后我们再看其他的fleet命令。

启动一个服务

通过fleet运行一个服务,需要几个必要的步骤。

第一步是,上传单元配置文件到fleet去。 单元配置文件必须是上传到集群中XXXX的机器去。只有这样才可以启动这个服务。fleetctl的CLI工具有这些步骤所需的全部命令了。

我们来看看submit命令。

Submit

submit这条命令可以把单元配置文件提交到fleet去。然后fleet就会读取文件的内容到内存去,然后就可进行后面的操作。

看起来就像这样的:

$ fleetctl submit myapp.service

你的myapp.service文件现在就会被fleet读取到了。

然后,你就可以用list-unit-files命令来看单元配置文件是不是已经被提交了。

像这样:

$ fleetctl list-unit-files
UNIT           HASH     DSTATE    STATE     TARGET
myapp.service  0d1c468  inactive  inactive  -

如你所见,单元配置文件已经被提交了,但是还没有安排它到集群中的节点去。

如果想看已经提交了的单元配置文件的内容,你可以敲以下的命令:

$ fleetctl cat myapp.service
[Unit]
Description=My Service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill hello
ExecStartPre=-/usr/bin/docker rm hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop hello

注意,如果你重新提交一次单元配置文件,fleet不会在内存中更新该单元配置文件的内容的。如果你想更新它,你必须移除后重新提交。

Load

一旦提交了你的单元配置文件,下一步就是安排它到机器上面去跑了。

当我们安排一个单元配置时,fleet会决定集群中哪台机器是跑该单元配置的最优选择。fleet会根据单元配置文件的内容跟集群中每一台机器的最近工作卷来下决定。然后fleet就将单元配置文件传到目标机器,并且将其加载到机器的systemd中去。

你可以用load命令来加载并安排单元配置,像这样:

$ fleetctl load myapp.service
Unit myapp.service loaded on 43cb4dc3.../172.31.9.57

现在,如果你再查看一下单元配置文件,你就会看到它已经被加载了,而且你还看到目标节点的IP地址。

像这样:

$ fleetctl list-unit-files
UNIT           HASH     DSTATE  STATE   TARGET
myapp.service  0d1c468  loaded  loaded  43c.../172.31.9.57

我们现在就可以用list-units命令来展示已经安排好或者在跑着的单元配置还有它们的状态。

像这样:

$ fleetctl list-units
UNIT           MACHINE                  ACTIVE    SUB
myapp.service  43cb4dc3.../172.31.9.57  inactive  dead

Start

要启动一个单元配置,你需要用start命令。命令可以让单元配置在已经加载好的机器上启动。

像这样启动一个单元配置:

$ fleetctl start myapp.service
Unit myapp.service launched on 43cb4dc3.../172.31.9.57

然后你可以这样再检查一下单元配置文件的列表:

$ fleetctl list-unit-files
UNIT           HASH     DSTATE    STATE     TARGET
myapp.service  0d1c468  launched  launched  43cb.../172.31.9.57

如你所见,单元配置的状态的是launched了,注意:DSTATE一列的意思是期望的状态,而STATE一列的意思是实际的状态。如果这两列是匹配的,则表示操作没问题了。

你也可以接着这么检查:

$ fleetctl list-units
UNIT           MACHINE                  ACTIVE  SUB
myapp.service  43cb4dc3.../172.31.9.57  active  running

要注意的是,list-unit-files输出的是,list-units输出的是关于systemd状态等等的信息。这些信息都是从被安置了单元配置文件的机器的守护进程直接收集到的。所以这看到的信息是比较直观地暴露出该服务在机器上的状态。

ACTIVE一列显示的是单元配置的概括性的状态描述,而SUB则是更低层次的描述。

移除一个服务

我们刚才学到的每一个命令都有与之对应的相反功能的命令。

Stop

stop这命令,可以将运行中的服务停止。这命令作用是跑着服务的机器本机的systemd执行定义在单元配置文件里面的stopping命令。

你可以这样子做:

$ fleetctl stop myapp.service
Unit myapp.service loaded on 43cb4dc3.../172.31.9.57

如你所见,这服务的状态回复到loaded状态。这服务是仍然加载在机器中的systemd的。只是并没有运行。

我们可以这样来确认下状况:

$ fleetctl list-unit-files
UNIT           HASH     DSTATE  STATE   TARGET
myapp.service  0d1c468  loaded  loaded  43cb.../172.31.9.57

Unload

如果你想将单元配置从目标机器中的systemd去除,而又还保留在fleet中,你可以卸下这个单元配置。

如果该单元配置是active状态的,它会先被停止了,然后才卸下。

你可以这样子做:

$ fleetctl unload myapp.service
Unit myapp.service inactive

现在,你就可以再检查一下状态:

$ fleetctl list-unit-files
UNIT           HASH     DSTATE    STATE     TARGET
myapp.service  0d1c468  inactive  inactive  -

你可以看到,单元配置被标记为inactive。另外,它也没有了目标机器的信息。

Destroy

如果你希望完全地将单元配置从fleet中去除掉,你可以用destroy命令。该命令将会先把单元配置所定义的服务停止,然后从机器中卸下该单元配置,最后才从fleet中去除。

像这样运行:

$ fleetctl destroy myapp.service
Destroyed myapp.service

前面也说过了,如果你修改了单元配置文件,你必须先销毁该单元配置,再重新提交,然后启动它。那是因为单元配置文件一旦被提交到fleet,它是静态的,不可被更新的。

获取服务状态

我们已经看到两个命令都可以获取到状态信息了,list-unitslist-unit-fileslist-units命令会列出全部安排在机器上的单元配置。list-unit-files命令则会展示全部fleet上全部的单元配置文件,以及还有它的预期状态,跟实际状态。

但是如果我们觉得这样的信息还不足够呢?

幸运的是,还有两个命令可以用来获取单个服务更加具体的信息。

Status

status命令反馈回来的信息是跑着单元配置的机器的systemctl的状态。

这看起来是像这样的:

$ fleetctl status myapp.service
● myapp.service - My Service
   Loaded: loaded (/run/fleet/units/myapp.service; linked-runtime; vendor preset: disabled)
   Active: active (running) since Fri 2016-03-25 14:02:24 UTC; 51min ago
  Process: 2965 ExecStartPre=/usr/bin/docker pull busybox (code=exited, status=0/SUCCESS)
  Process: 2954 ExecStartPre=/usr/bin/docker rm hello (code=exited, status=0/SUCCESS)
  Process: 2945 ExecStartPre=/usr/bin/docker kill hello (code=exited, status=1/FAILURE)
 Main PID: 2977 (docker)
   Memory: 11.4M
      CPU: 435ms
   CGroup: /system.slice/myapp.service
           └─2977 /usr/bin/docker run --name hello busybox /bin/sh -c while true; do echo Hello World; sleep 1; done

Mar 25 14:53:35 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:36 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:37 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:38 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:39 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:40 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:41 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:42 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:43 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 14:53:44 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World

如你所见,我们最终可证实我们定义的单元配置正如预期运行着。

Journal

如果你希望只是看下某单元配置的服务的日志儿不是完整的执行信息。你可以单独使用journal命令。

如下:

$ fleetctl journal hello.service

-- Logs begin at Fri 2016-03-25 10:08:44 UTC, end at Fri 2016-03-25 16:19:04 UTC. --
Mar 25 16:18:55 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:18:56 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:18:57 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:18:58 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:18:59 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:19:00 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:19:01 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:19:02 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:19:03 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World
Mar 25 16:19:04 ip-172-31-9-57.ap-southeast-1.compute.internal docker[2977]: Hello World

默认情况下,只会显示最新的10行

你可以用--lines参数来调整行数:

$ fleetctl journal --lines 20 hello.service

也可以用-f参数:

$ fleetctl journal -f hello.service

这个功能类似于tail -f,让你实时看到新增部分的日志。

结尾

在这篇文章中,我们看到了:

用来提交,加载和启动单元配置的命令

用来停止,卸下和销毁单元配置的命令

用来检查单元配置状态的命令

这是这fleet系列的第二篇文章,我的第一篇文章介绍了单元配置跟粗略看了一遍fleet的功能,这系列的下一篇文章,我们将会讲解下fleet的API。

原文链接: Fleet on CoreOS, Part Two(翻译:伍健源)

原文发布时间为:2016-06-03

本文作者:Coolxwu

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:CoreOS上的Fleet,第二部分

时间: 2024-08-30 13:52:46

CoreOS上的Fleet,第二部分的相关文章

CoreOS上的Fleet,第一部分

本文讲的是CoreOS上的Fleet,第一部分,[译者的话]原文作者是一名科技文章的作者.他的这篇文章主要是简单介绍利用fleet来实现服务高可用的完整流程,让读者对fleet有一个直观的了解.合适大家入门fleet的一篇文章. 服务器宕机是经常发生的事情.然而我们还是非常希望不会因为这样导致应用程序挂了,因而影响到业务的正常服务.这也是为什么服务的高可用成了运维工程师选择把应用部署到云端上去的一个最重要的理由. Fleet,一个CoreOS上的工具,就能解决上述的问题,把你从整天提心吊胆中释放

CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig

本文讲的是CoreOS Fest 系列之第二篇: Systemd.Go.Calico.Sysdig,[编者的话]在 CoreOS Fest 第二天的会议中,演讲者展示了多个开源项目和工具,包括 Systemd 和 CoreOS . Go 语言和容器. Calico 项目. Sysdig 等. 在 CoreOS Fest 的第一天会议中,陆续介绍了 CoreOS 的架构.规划和规范.第二天的会议,演讲者展示了多个开源项目和工具,包括 systemd-nspawn . Calico 项目和 Sysd

手把手教你在 CoreOS 上构建你的第一个应用

手把手教你在 CoreOS 上构建你的第一个应用 [编者的话]作者以自己的Mac笔记本为例,介绍了如何在CoreOS上安装WordPress应用,没有过多的理论解释,全部是实战类教程,推荐想快速了解CoreOS的同学阅读. 我相信你一定听说过CoreOS,但是你是否真正在它上面部署过一个应用了?可能很多人都没有部署过.在CoreOS上构建一个应用是非常困难且令人沮丧的(译者注:frustrating,用了这个词,看来确实难).因为文档比较散乱,并且你不得不在开始之前学习所有相关的技术,包括etc

在CoreOS上搭建一个WordPress程序操作实例_Linux

CoreOS是一个专门为大规模服务器部署定制的Linux精简系统,它将操作系统和应用程序完全分离,从而降低操作系统和应用程序的耦合度,同时解决了现有Linux服务器在容器资源.权限管理方面出现的问题.就目前来说,CoreOS会是未来操作系统的发展趋势. 那你有没有亲自在CoreOS上部署一个应用程序呢?相信大多数人都没有过这样的经验,在CoreOS上建立一个应用程序可以说是非常辛苦及沮丧的.因为在开始建立程序之前你首先必须了解所有不同的技术. 下面,我们将手把手地教你来创建一个简单的WordPr

在CoreOS上的应用服务实践

在"漫步云端:CoreOS实践指南"系列的前几篇文章中,ThoughtWorks的软件工程师林帆主要介绍了CoreOS及其相关组件和使用,其中已经提到了使用 Unit 文件配置 Systemd 管理的系统服务的方式,本文将结合 CoreOS 的内置特性实现服务高可用的综合案例. 案例说明 在一个运行着数十上百种应用服务的集群的运维和应用设计中常常会遇到这样的需求:服务状态的收集,如何在集群的任意节点上快速的获取到整个集群里任意一个服务的状态呢? 这是典型的大型分布式服务监控任务.传统的

云安全分论坛 | 企业安全的6个云上视角,第二届安全算法挑战赛启动报名

2017网络安全生态峰会的第二天,阿里云安全携手Fortinet,安华金和,安赛,带来"云安全分论坛". 会场议题围绕Cloud Security Stack,进行全方面的解读.从IaaS层东西向流量的可见性以及控制.到SaaS的WAF风控.防篡改以及主动防御,再到数据安全的生命周期保护,和安全服务生态的价值. 最终的目的,是帮助企业知晓,如何用好云上的工具.产品与服务,快速落地安全架构. 此外,阿里云安全专家笑然,也在会场上宣布第二届阿里云安全算法挑战赛正式启动:用人的智慧,推动安全

ASP文件上传神功 第二重(招势图加内功心法)

上传 第二重:文本信息与图片文件同时提交保存到数据库图片文件也可保存到磁盘文件 这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友(比我还菜的:-))有所帮助. 请诸位大虾能对其中的不正或不良这处予以指正. 程序中stream对象的用法上参考了"化境HTTP上传程序 Version 2.0"在代码,在此对稻

图片上传的第二种形式

之前有说了一种以base64的图片上传形式,这次来说说另外一种,其实很简单,很早以前都是在form提交的时候再controller中处理,现在基本不会这么做,都是通过ajax来实现异步上传的 首先需要引入jquery.ui.widget.js以及jquery.fileupload.js这两个js, HTML代码: <div> <input id="idcardImagePositiveFileUpload" type="file" name=&qu

深入浅出CoreOS(三):Systemd和Fleet

本文讲的是深入浅出CoreOS(三):Systemd和Fleet,[编者的话]Systemd并不是CoreOS特有的服务.本质上说Systemd是没有依附于任何一个Linux发行版的独立项目,但是很多发行版Linux都在青睐Systemd管理服务的优势,所以CoreOS选择了它.Fleet是管理CoreOS和部署app的工具.有了Fleet,你就可以把整个CoreOS集群当做一台节点来处理.让我们一起学习关于此方面的内容. 这是深入浅出CoreOS系列文章中的第三篇,也是最后一篇. 在上一篇文章