Docker,CoreOS和基于机群的部署

时间:2015-07-06 14:15:38

标签: docker mesos coreos fleet

我正试图绕过CoreOS,我仔细阅读他们的官方文档,一些随机文章,甚至看了this excellent presentation by their CTO

  • 我对CoreOS的理解是它的一个简单的,简单的Linux发行版,需要在其上运行的任何OCF-compliant container不是只是一个Docker容器。
  • fleet理解是群集级别的systemd
  • flannel理解etcd和舰队用于将网络请求路由到群集中的容器的网络层

首先,如果我的上述断言不正确或以任何方式误导,请先纠正我!假设我或多或少走上正轨,我在这里有一些担忧:

  • CoreOS提供哪些具体优势CoreOS提供的Docker包含的应用程序与其他Linux发行版不同,例如Ubuntu或Debian?换句话说,我可以通过Docker / CoreOS与Docker / Ubuntu获得哪些客观收益?
  • Fleet看起来像是一个调度引擎,就像Mesos或Kubernetes。它是这些项目的直接竞争对手,还是处理不同“层次”(不同类型的职责)的日程安排?如果是这样,这些区别是什么?

3 个答案:

答案 0 :(得分:9)

这里有许多活动部件。已发布的答案非常好。我认为你得到的任何答案都会有意见。在我尝试获得100个赏金点时,我想我会通过你的打卡列表: - )

我现在每天都在使用CoreOS / Flannel / Kubernetes / Fleet大约6个月。当你在引言中发布网址时我决定观看它。哇,很棒的演讲。我认为布兰登飞利浦是一位非常好的老师。我喜欢他介绍每种技术时所采用的方式。我会向任何人推荐该教程。

CoreOS是一个基于Linux的操作系统。它非常精简,没有额外的运行。对我来说,它做了这些事情:

  • 自动更新。这样好吗?双分区,非活动更新,交换活动,后退(我认为,我从未经历过回退)。已经解决了部署'之后如何更新操作系统的问题。问题并使其相对无痛。
  • systemd init系统。这个花了我一点时间(作为一个/etc/init.d家伙)但是,过了一段时间它会在你身上长大。有一个非常陡峭的学习曲线。一旦你得到了正在发生的事情,你会喜欢systemd如何让机器保持运行特定的东西,依赖关系,重启(如果你想),监听套接字(如超级初始化)和产生进程,d-bus(尽管我没有'我对这部分知之甚少)。 systemd允许您指定'单位'和单位可以有依赖关系,前后处理等。
  • 基本服务。我已经从我的CoreOS系统上运行的每个服务中复制了简要描述行。
    • systemd - 它提供一个系统和服务管理器,它以PID 1运行并启动系统的其余部分
    • docker - Docker是一个开源项目,用于打包,运送和运行任何应用程序作为轻量级容器
    • etcd - etcd是用于共享配置和服务发现的分布式一致键值存储
    • sshd - sshd(OpenSSH守护程序)是ssh(1)的守护程序。这些程序一起取代rlogin和rsh,并通过不安全的网络在两个不受信任的主机之间提供安全的加密通信。
    • locksmithd - locksmith是CoreOS更新引擎的重新启动管理器,它使用etcd确保在任何给定时间只有一组机器的子集正在重新启动。 locksmithd作为CoreOS计算机上的守护程序运行,负责在更新后控制重新启动行为。
    • journald - systemd-journald是一种收集和存储日志记录数据的系统服务。
    • timesyncd - systemd-timesyncd是一个系统服务,可用于将本地系统时钟与远程网络时间协议服务器同步
    • update_engine
    • udevd - systemd-udevd侦听内核uevents。对于每个事件,systemd-udevd执行udev规则中指定的匹配指令。见udev(7)。
    • logind - systemd-logind是一个管理用户登录的系统服务。
    • 已解决 - systemd-resolved是一种管理网络名称解析的系统服务。它实现了缓存DNS存根解析器和LLMNR解析器和响应器。
    • hostnamed - 这是一个小型守护程序,可用于控制用户程序中的主机名和相关机器元数据。
    • networkd - systemd-networkd是一种管理网络的系统服务。它会在网络设备出现时检测和配置它们,以及创建虚拟网络设备。

CoreOS并不一定要求您要运行的所有内容都必须是容器。它将运行unix框将运行的任何内容。 yum和apt-get明显缺失,但包括wget。所以,你可以安装'程序,库,甚至apt-get通过wget,并在你的方式污染CoreOS基地。但这并不好。你真的想保持原始状态。为此,它们包括一个工具箱'它允许你运行像沙箱这样的容器来完成你的工作,当你退出它时就会消失。

我最喜欢的CoreOS部分是cloud-config。首次启动时,您可以提供名为cloud-config的user_data。它是一个yaml文件,告诉基础CoreOS第一次启动时要做什么。这是你安装诸如fleet,flannel,kubernetes等东西的地方。这是一种真正简单的方法,可以在VM上重复安装您选择的组合。在典型的cloud-config中,我将编写配置文件,从其他机器复制文件以在新机器上安装,并创建控制我们想要的其他进程的单元文件CoreOS' systemd to manage(如法兰绒,舰队等)。它完全可以重复。

这是CoreOS的另一个有趣的事情。您可以修改现有单元的依赖关系和配置。例如,CoreOS启动docker。但是,我想修改docker的启动顺序,因此我可以添加一个插件配置来增强现有的系统docker配置。我使用它在 docker启动之前插入flannel 的依赖项,因此我可以配置docker使用法兰绒提供的网络。这不一定是CoreOS,但它确实使它们完全融合在一起。

我认为你可以在Ubuntu和CoreOS上使用cloud-config,你可以做同样的事情。所以,我认为你从CoreOS获得的优势超过Ubuntu就是你经常获得一个新的版本,操作系统会自动更新,而且你没有任何额外的东西。跑步(它的精益,减少的攻击向量是后果)。 CoreOS针对docker进行了调整(它已经在运行),而且ubuntu还没有运行它。虽然,你可以创建一个cloud-config文件,让ubuntu运行docker ...总而言之,我认为你已经了解了CoreOS。

您可以通过CoreOS获得的另一件事是直接来自公司的支持,无论是付费还是非付费。我通过此论坛和CoreOS Dev / CoreOS用户Google小组在CoreOS上回答了很多问题。

您的车队描述也很不错。 Fleet管理集群。集群是一个或多个CoreOS机器。所以,如果你要使用舰队,你必须使用CoreOS,我想这将是CoreOS优于Ubuntu的另一个好处。

就像systemd控件的单元文件如何在主机上运行进程一样,单元文件用于在集群上运行进程的fleetd控件。有一些语法糖,但fleet的Unit文件与systemd的单元文件大致相同。它们非常适合在一起。 Fleet的单元文件保存在etcd的数据库中,因此一旦摄取,即使托管单元服务的机器出现故障,该单元也是持久的,单元描述存在于etcd。

Fleet还有用于在我的群集中列出我的机器的命令,列出单元文件,显示正在运行的单元等。基本上,您可以提交要在群集(或所有机器上或特定类型的机器(与ssd驱动器一样),或者在运行其他东西的同一台机器上(亲和力)等等。)

Fleet让它继续运行。如果机器消失,其单元将在集群中的其他机器上运行。

在教程中,您引用Brandon使用Fleet发布Kubernetes。这很简单。通过使Fleet单元文件将Kubernetes放置在车队集群中的所有机器上,当机器被添加到机群集中并从机群集中减去时,Kubernetes会自动使用该机器并安排Kubernetes在其上运行。我也像这样运行我的Kubernetes集群。但是,我不再这么做了。我相信我没有看到一个好处,但是,我认为在我的环境中没有必要。由于我已经使用cloud-config文件启动了我的机器,因此将Kubernetes节点服务直接放在那里是微不足道的。事实上,使用cloud-config,如果我想使用Fleet来启动Kubernetes的东西,我将不得不编写Fleet单元文件,启动Fleet,提交我写给Fleet的单元文件,当我可以写一个单元文件启动Kubernetes节点。但我离题了......

Fleet是一种调度机制,就像Kubernetes一样。但是,Fleet可以通过单元文件启动任何可执行文件,就像系统文件一样,其中Kubernetes适用于容器。 Kubernetes允许定义:

  • 复制控制器
  • 服务
    • 容器

(其他东西)。

因此,断言Fleet只是一个不同的层面。调度是一个很好的。您可以添加Fleet计划不同的东西。在我的工作中,我不使用Fleet图层,我只是直接跳到Kubernetes,因为我只使用容器。

最后,关于法兰绒的断言是错误的。法兰绒使用etcd作为其数据库。 Flannel为它们之间路由的每个主机创建一个专用网络。法兰绒网络被交给码头工人,并告诉码头工人使用该网络从中分配IP地址。因此,使用法兰绒的docker进程可以通过ip相互通信。由于每个容器都有自己的ip地址,因此可以跳过所有端口映射内容。这些docker进程可以在法兰绒网络上与infra和intra机器进行通信。我错了,但我不认为舰队和法兰绒之间有任何联系。此外,我不认为etcd或Fleet使用法兰绒来传递他们的数据。 Etcd和Fleet路线是否使用法兰绒。 Docker容器将他们的交通路由在法兰绒上。

-g

答案 1 :(得分:3)

是的,你的理解非常正确。

Coreos被设计为一种更安全的操作系统,默认情况下会自动进行自我更新,并在服务中运行最低限度来减少任何攻击媒介。 http://www.activestate.com/blog/2013/08/alex-polvi-explains-coreos

所有东西都需要在容器中运行,静态编译(以golang二进制文件为例),或者是shell脚本。没有安装python或ruby。

如果服务器发生故障(假设您的容器是短暂的),Fleet启动的容器/ systemd单元可以在另一个节点上重新调度,并且应该保持所请求的实例数量在集群上运行,同时遵守部署约束。 https://coreos.com/using-coreos/clustering/

Mesos更像是一个调度程序的框架,你还需要其他东西(chronos / marathon)来提供执行的工作,但它在这方面非常灵活,可以更好地处理服务器资源。

我对Flannel没有多少经验,但是未来版本的Docker中出现的新网络插件可能会为您提供更多的容器网络选择。 http://blog.docker.com/2015/06/networking-receives-an-upgrade/

答案 2 :(得分:2)

  

通过Docker / CoreOS与我获得的客观收益是什么?   泊坞/ Ubuntu的?

技术效益

吸引我到CoreOS的功能是:

  • 这是一个集群,而不是一台机器,操作系统
  • 它的构建失败了
  • 这是自我更新

CoreOS是一个集群,而Ubuntu是一台机器。使用CoreOS,当容器打开的机器消失时,群集会在其他位置启动容器。当该Ubuntu服务器发生故障时,其容器随之崩溃。 CoreOS允许机器是一次性的,这是一件好事。

话虽如此,请记住 CoreOS不处理数据持久性;存储在容器中的数据不存在! ;)在我的情况下,我会根据需要动态附加EBS卷。

设计好处

对我来说更重要的是,上述技术优势带来了设计上的好处。进入系统设计知识,“这个过程将随机消失”,对于构建弹性非常有用。从一开始,服务就是无状态,因为您根本不知道依赖服务所依赖的系统,它们也必须是可发现的。 CoreOS的etcd是一个分布式配置存储,可用于发现服务所在的位置。最后,由于进程可能不在同一台机器上,因此网络可访问的服务 - 水平可扩展系统必须 - 是唯一的出路。

总而言之,我发现CoreOS非常适合构建Twelve-Factor Apps,并且您可以免费获得Chaos Monkey

  

Fleet看起来像是一个调度引擎,就像Mesos或Kubernetes一样。   它是这些项目的直接竞争对手,还是他们处理的   调度在不同的“层”(不同类型的   责任)?如果是这样,这些区别是什么?

是的,Fleet会调度容器并确定它在群集中的运行位置。如果该机器消失,Fleet还负责在工作机器上重新启动它。

我没有深入研究Kubernetes,但似乎确实存在重叠。到目前为止我理解它的方式是Fleet处理运行单个容器(“单元”),而Kubernetes是互补的并且协调包含系统的多个单元。例如,Fleet确保Postgres保持运行; Kubernetes确保您的申请,例如由Postgres,Redis和Django组成,都在嗡嗡作响。