CoreOS上的Fleet,第一部分

本文讲的是CoreOS上的Fleet,第一部分,【译者的话】原文作者是一名科技文章的作者。他的这篇文章主要是简单介绍利用fleet来实现服务高可用的完整流程,让读者对fleet有一个直观的了解。合适大家入门fleet的一篇文章。

 
服务器宕机是经常发生的事情。然而我们还是非常希望不会因为这样导致应用程序挂了,因而影响到业务的正常服务。这也是为什么服务的高可用成了运维工程师选择把应用部署到云端上去的一个最重要的理由。

Fleet,一个CoreOS上的工具,就能解决上述的问题,把你从整天提心吊胆中释放出来。它会帮你把应用部署到健康的节点中运行起来。

然而,Fleet是怎么解决这个问题呢?

那Fleet是怎么知道某个节点是不是下线了呢?应用的重新路由又是怎么进行的呢?

我们在前一篇文章里就介绍了这个过程,如果你急着回顾,我在这再概括说下。

CoreOS集群中,每个节点都运行着fleet的守护进程,用以监视节点的健康,还有与其它节点进行通信。在集群启动时,或者当集群中最近的leader不可用时,fleet的守护进程就会协助着去选举出集群中的leader。每当有请求被提交到这个集群,或者某个节点跑着服务时挂了,集群中的leader就会安排一个节点跑新的服务来响应。

接下来将模拟一个场景,我们用fleet集群来跑一些服务,然后令一个节点挂掉,以此观察下fleet是怎样重新安排节点响应请求。接着我们在继续深入了解下fleet额外的功能。

开始

让我现在马上来看看Fleet。特别是要看下当一个节点挂了时,重新路由是怎么进行的。

一开始,你应该跑起一个CoreOS集群。如果你不是很清楚应该怎么做,参考下《如何在AWS上安装CoreOS》这篇教程。注意:在这篇教程中,我在AWS EC2上跑了三个节点的CoreOS集群。

当你准备好集群,就可以连接进去了。

可以像这样做:

ssh -i /Path/to/keyfile/keyfile.pem core@ec-2-server-path.compute.amazonaws.com

然后你要改这个密钥的路径成实际的路径,还有主机名改成你自己的EC2服务器的主机名。

当你连接进去后,你跑下以下命令来检查下是否已经安装了fleet:

$ fleetctl

你应该了解下以类似下的内容:

NAME:

    fleetctl - fleetctl is a command-line interface to fleet, the cluster-wide CoreOS init system.

USAGE:

    fleetctl [global options] <command> [command options] [arguments...]

[...]

定义你的服务

若fleet在CoreOS上预装了的,fleet也是不会自动跑起来的。

要启动fleet,我们还需要加至少一个单元的配置文件。这配置用来描述那个你希望在你的集群中跑起来的服务。

以下是用来举例的一单元的配置:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

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

我们可以命名这个文件为myapp.service

Description会在日志中显示出来,所以最好还是用容易辨别的值,方便你之后辨别日志。After=docker.serviceRequires=docker.service意思是这个单元的配置只会在docker.service生效后才会启动。

ExecStart选项可以让你去定义一条在单元配置启动时执行的命令。ExecStartPre选项可以让你定义一条命令,在ExecStart中定义的命令之前执行。这个选项可以用以做一些类似清理环境,设置环境的行为。

千万不可以在意图跑一个docker容器时加-d参数来运行fleet,因为加了这参数后fleet进程就不是容器的子进程了。这样的话,systemd会认为该进程已经退出了,然后该fleet单元就会终止服务。

ExecStop中定义的命令则会在该单元启动失败或者终止时执行。

要想启动这个单元服务,则要移动myapp.service的配置文件或者创建之在那个你已经连接上的节点上去。

然后执行:

$ fleetctl start myapp.service

你就会看到这个单元服务启动了。

然后你还可以运行一下命令来确认一下情况:

$ fleetctl list-unit-files

这条命令会列出在该集群中的运行着的全部单元配置文件以及单元配置所在节点的IP地址。

现在我们已经添加了一个服务到集群中去并且运行着了,我们还可以重复上述的步骤继续添加多个服务到集群去并运行起来。只需要记住的是单元配置文件的名字必须在集群中是唯一的。

当完成了后,再跑下上面的命令。

结果就应该看起来是这样的:

$ fleetctl list-unit-files
UNIT               HASH    DSTATE   STATE    TARGET
myapp.service      d4c61bf launched launched 85c0c595.../172.31.5.9
anotherapp.service e55c0ae launched launched 113f16a7.../172.31.22.187
someapp.service    391d247 launched launched a0b7a5f7.../172.31.22.22

可以看到这里我们在三台服务器上跑着三个服务(myapp.serviceanotherapp.servicesomeapp.service)。在TARGET一列中就列出了这些服务器的IP地址。

Fleet的运作

就如在一开始提到的那样,fleet最好的那点就是,它不单单可以通过集群当请求被提交到集群来时安排单元服务去响应,它还可以自动重心路由应用到健康的节点去运行。

让我们来搞挂一个节点来看看自动重路由是怎么运转的。

我是在在AWS控制台上通过关停我其中一个EC2实例来实现的。你就可以用你跑虚拟机的平台所带的控制台来做就可以了。

当你搞挂一个节点后,你可以运行下:

$ fleetctl list-unit-files

然后你应该可以看到这样的输出:

UNIT               HASH    DSTATE   STATE    TARGET
myapp.service      d4c61bf launched launched 85c0c595.../172.31.5.9
anotherapp.service e55c0ae launched launched 113f16a7.../172.31.22.187
someapp.service    391d247 launched launched a0b7a5f7.../172.31.22.187

一开始呢,someapp.service是跑在172.31.22.22这机器上的,但是现在是和anotherapp.service一起跑在172.31.22.187的。所以在172.31.22.22从集群中被移走,还有someapp.service被移动到跑着anotherapp.service的健康节点上去时,发生了什么事情?

反正fleet就自动完成了此行为,而不需要人工干预。

是不是很酷呢!

结尾

在这篇文章里,我们学到了:

  • 怎么去创建一个我们希望在集群中运行的服务所需的描述该服务的单元配置文件。
  • 怎么用fleet在集群中启动一个服务。
  • 怎么去发现有节点挂了并且服务被移到健康的节点去了。

在下一篇文章,我们会在同一个场景中,继续看下怎么以更高端的方式来用fleet。

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

原文发布时间为:2016-04-08

本文作者:Coolxwu

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

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

时间: 2024-11-01 17:02:22

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

CoreOS上的Fleet,第二部分

本文讲的是CoreOS上的Fleet,第二部分,[译者的话]紧接前一篇文章,这篇文章是介绍fleet的一些命令,用来管理托管在它之上的服务的. 在我前一篇文章中,我们学到了fleet当一个集群中的节点挂了时,是怎么重新安排服务来让程序保持可用.描述具体点,就是原本在挂了的节点上跑的代码会自动迁移到集群中其它的可用节点上.从外部看来,你的应用平滑运行如斯. 如果你有兴趣了解fleet是如何适配CoreOS的更多细节,我们可以深入了解之前一篇关于self-sufficient containers的

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

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

CoreOS Fest 系列之第一篇:容器江湖

本文讲的是CoreOS Fest 系列之第一篇:容器江湖,[编者的话] 这是总结 CoreOS Fest 大会的三篇文章之一,主要介绍了 CoreOS 公司与 Docker 公司之争,新成立的 appc 规范委员会, Tectonic 平台, Kubernetes 项目. 最近在旧金山, Linux 容器已经显得非常有「钱」景,看起来每个人都想从这个有几十亿美金规模的新市场中分得一杯羹.多家创业公司和云主机公司已经或者即将召开有关容器的大会,包括 4 月 17 日召开的 Container Ca

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

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

ZARA已成功击败GAP、H&M和UNIQLO,坐上了世界第一服装零售集团的宝座

在创始人阿曼西奥·奥特加的率领下,ZARA已成功击败GAP.H&M和UNIQLO,坐上了世界第一服装零售集团的宝座.如今,它把视线投向了亿万网民.抢得头啖汤的ZARA随即开始在其他市场铺就线上业务.9月3日,ZARA正式进军中国电商,该平台销售全线的女装.男装及童装系列,价格也和实体店相同.然而上线至今,该业务不仅反应平平,反而招来诸多非议. 线下热火朝天的ZARA为何会水土不服?有分析称,首先,这与ZARA中国网店的自身定位颇有关联.ZARA进入中国市场为时不久,在国内的消费群体仍偏小众.这个

在CoreOS上的应用服务实践

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

踏上kubernetes的第一步:集群环境部署介绍

一.简介    redhat 在今年9月份发布了k8s 和 etcd 的yum 源(redhat 7),我们下面都是基于redhat 7操作系统以yum来构建k8s集群,你也可以到github 下载kubernetes 进行安装部署   下面是k8s集群架构     二.架构部署    基本信息     2.1 etcd 安装配置(etcd)   安装etcd     配置 etcd配置文件   这里我直接使用脚本进行替换配置,也可以手工修改,主要是配置etcd地址,这里主要做演示,就不搭建et

毕成功:《哈7(上)》改编第一难系列最精彩

<哈7>(上)主角长大成人 特效场景精彩 电影剧照 小毕的个人评分:90分(A-) 评分参数:<哈利·波特与混血王子>85分(B+),系列内部比较 <哈利·波特与凤凰社>45分(C),系列内部比较 <赵氏孤儿>90分(A-),2010贺岁大片内部比较(12月4日上映) 正文开始前说些噱头:1.这一集,哈利和赫敏全裸了,不知道拍那场戏用没用替身?2.看片前跟一位媒体朋友我讨论上集<混血王子>在欧美评价那么高,内地为何不买账,我们一致认为是由于华纳当

请问在一张图上, 找到遇到第一条线(可能是歪的) 座标

问题描述 请问一下各位,想在一张图上,由下往上,找到遇到的第一条黑色线段(可能有点歪的),且线段可能有宽度然后纪录下找到的这条线段的座标,请问用c#有参考的代码吗?谢谢各位! 解决方案 解决方案二:木有代码,思路很简单,从下往上横向扫描,遇到线(颜色判断),开始线判断如果是直线按理横向的像素应该是水平线上的(具体看你的实际情况,宽度.精细度等,整个小的算法判断下就OK,数字栅格矢量化的问题)