12

我正在尝试围绕CoreOS进行思考,我仔细阅读了他们的官方文档、一些随机文章,甚至还观看了他们 CTO 的精彩演示

  • 我对CoreOS 的理解是,它是一个精简的、简单的 Linux 发行版,它要求其上运行的任何东西都是符合 OCF 的容器不仅仅是 Docker 容器。
  • 我对舰队的理解是它在集群级别systemd
  • 我对flannel的理解是它是一个网络层,etcd和fleet 都使用它来将网络请求路由到集群中的容器

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

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

3 回答 3

10

这里有很多活动部件。已经发布的答案非常好。我认为你得到的任何答案都会有意见。我想我会在尝试获得 100 个赏金点时查看你的打卡清单 :-)

我已经每天使用 CoreOS/Flannel/Kubernetes/Fleet 大约 6 个月了。当您将网址发布到介绍时,我决定观看它。哇,很棒的介绍。我认为布兰登飞利浦是一位非常好的老师。我喜欢他在介绍每项技术时建立的方式。我会向任何人推荐该教程。

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

  • 自动更新。这做得很好。双分区,更新非活动,交换活动,回退(我想,我从未经历过回退)。解决了“部署后如何更新操作系统”问题,并使其相对轻松。
  • systemd 初始化系统。我花了一点时间才喜欢上这个(作为 /etc/init.d 的人),但过了一段时间,它就会在你身上成长。学习曲线非常陡峭。一旦你了解正在发生的事情,你会喜欢 systemd 如何让机器运行特定的东西、依赖关系、重新启动(如果你愿意)、监听套接字(如 super initd)和生成进程、d-bus(虽然我不知道关于这部分还有很多)。systemd 允许您指定“单位”,单位可以具有依赖关系、前后处理等。
  • 基本服务。我已经从我的 CoreOS 系统上运行的每个服务中复制了简短的描述行。
    • systemd - 它提供了一个系统和服务管理器,以 PID 1 运行并启动系统的其余部分
    • docker - Docker 是一个开源项目,可将任何应用程序打包、发布和运行为轻量级容器
    • etcd - etcd 是一个分布式的、一致的键值存储,用于共享配置和服务发现
    • sshd - sshd (OpenSSH Daemon) 是 ssh(1) 的守护程序。这些程序一起取代了 rlogin 和 rsh,并通过不安全的网络在两个不受信任的主机之间提供安全的加密通信。
    • locksmithd - locksmith 是 CoreOS 更新引擎的重启管理器,它使用 etcd 来确保在任何给定时间只有一个机器集群的子集在重启。locksmithd 在 CoreOS 机器上作为守护进程运行,负责控制更新后的重启行为。
    • journald - systemd-journald 是一个收集和存储日志数据的系统服务。
    • timesyncd - systemd-timesyncd 是一种系统服务,可用于将本地系统时钟与远程网络时间协议服务器同步
    • 更新引擎
    • 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 包括在内。因此,您可以通过 wget '安装' 程序、库,甚至 apt-get 并开始污染 CoreOS 基础。不过这样也不好。你真的想保持它的原始状态。为此,它们包括一个“工具箱”,它可以让您运行像沙箱这样的容器来完成您的工作,当您退出它时它就会消失。

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

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

我认为您可以将 cloud-config 与 Ubuntu 以及 CoreOS 一起使用,并且您可以做同样的事情。所以,我认为 CoreOS 相对于 Ubuntu 的好处是你经常获得一个新版本,操作系统是自动更新的,你没有任何“额外”运行(它很精简,并且减少了攻击向量是后果)。CoreOS 针对 docker 进行了调整(它已经在运行),而 ubuntu 还没有运行它。虽然,您可以创建一个让 ubuntu 运行 docker 的 cloud-config 文件……总之,我认为您已经了解了 CoreOS。

您可以通过 CoreOS 获得的另一件事是直接从公司获得的支持,无论是有偿还是无偿。CoreOS 的人们通过这个论坛和 CoreOS Dev/CoreOS User Google 组回答了很多问题。

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

就像 systemd 的 Unit File 控制在主机上运行进程的方式一样,Fleetd 的 Unit File 控制在集群上运行进程。有一点语法糖,但是fleet的单元文件与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 可以像 systemd 一样通过单元文件启动任何可执行文件,其中 Kubernetes 面向容器。Kubernetes 允许定义:

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

(其他东西也是如此)。

因此,Fleet 只是调度的不同“层”的断言是一个很好的断言。您可能会添加 Fleet 安排不同的事情。在我的工作中,我不使用 Fleet 层,我只是直接跳到 Kubernetes,因为我只使用容器。

最后,关于法兰绒的断言是不正确的。Flannel 使用 etcd 作为其数据库。Flannel 为在它们之间路由的每个主机创建一个专用网络。flannel 网络被交给 docker,并且 docker 被告知使用该网络来分配 ip 地址。因此,使用 flannel 的 docker 进程可以通过 ip 相互通信。由于每个容器都有自己的 IP 地址,因此可以跳过所有端口映射内容。这些 docker 进程可以在 flannel 网络上进行基础设施和机器内部通信。我可能是错的,但我认为 Fleet 和法兰绒之间没有任何联系。另外,我不认为 etcd 或 Fleet 使用 flannel 来路由他们的数据。无论是否使用法兰绒,Etcd 和 Fleet 路由。Docker 容器通过 flannel 路由其流量。

-G

于 2015-07-12T22:27:41.363 回答
3

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

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

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

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

Mesos 更像是一个调度程序框架,您仍然需要其他东西(chronos/marathon)来提供要执行的作业,但它在这方面非常灵活并且可以更好地利用服务器资源。

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

于 2015-07-11T07:47:23.197 回答
2

使用 Docker/CoreOS 与 Docker/Ubuntu 相比,我可以获得哪些客观好处?

技术优势

CoreOS 吸引我的特点是:

  • 它是一个集群,而不是单机操作系统
  • 它是在考虑失败的情况下构建的
  • 它是自我更新的

CoreOS 是一个集群,而 Ubuntu 是一个单机。使用 CoreOS,当容器所在的机器消失时,集群会在其他地方启动容器。当那个 Ubuntu 服务器出现故障时,它的容器也会随之关闭。CoreOS 允许机器是一次性的,这是一件好事。

话虽如此,请记住CoreOS 不处理数据持久性;存储在容器中的数据不存在!;) 就我而言,我在需要的地方动态附加 EBS 卷。

设计优势

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

总而言之,我发现 CoreOS 非常适合构建十二要素应用程序,并且您可以免费获得Chaos Monkey

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

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

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

于 2015-07-13T16:59:01.037 回答