这篇博客中我们将比较 Kubernetes 与 Mesos + Marathon容器编排解决方案。我们将深入的讨论 Kubernetes 与 Mesos + marathon,分析他们的特点,及他们的优缺点。
Kubernetes 概述
根据 Kubernetes 网站的说法,“Kubernetes 是一个自动化,容器化应用程序部署扩展和管理的开放源代码系统。”Kubernetes 由 Google 根据他们在生产中运行容器的经验使用称为 Borg 的内部集群管理系统(有时简称 Omega)。 Kubernetes 的体系结构依赖于这种经验,如下所示:
从上图可以看出,有一些与 Kubernetes 集群相关的组件。主节点将容器工作负载放置在工作节点。其他组件包括:
etcd:该组件存储配置数据,可以通过简单的 HTTP 或 JSON API 由 Kubernetes master API 服务器访问(可以看作集群数据库)。
APIserver:此组件是 Kubernetes 主节点的管理中心。它有助于各个组件之间的通信,从而保持集群的健康。
Controller Manager:该组件确保通过向上和向下扩展工作负载来使群集的期望状态与当前状态相匹配。
Scheduler:该组件将工作负载放置在适当的节点上。
Kubelet:该组件从 API 服务器接收 pod 规范并管理在主机中运行的 pod。
以下列表提供了与 Kubernetes 相关的一些其他常用术语:
pod:Kubernetes 编排调度容器以 pod 为单位。同一个 pod 中的容器运行在同一个节点上,并共享资源,如文件系统,内核命名空间和 IP 地址。
Deployments:可以创建管理一组 pod。部署可以与服务层一起用于水平扩展或确保可用性。
Services:可以直接访问。 Kubernetes 为集群提供一个 DNS 服务器,用于监视新服务,并允许他们通过名称进行寻址。服务是您的容器工作负载的“外在表现”。
Labels:关联到实际各种对象的键值对。它们可以用来搜索和更新多个对象作为一个单一集合。(例如:可以用标签区分,实验环境,测试环境)
Mesos + Marathon 概述
Mesos 是一个分布式内核,旨在为您的数据中心提供动态的资源分配。想象一下,你管理一个中型企业的 IT 部门。您需要在一天中的 100 个节点上运行工作负载,但是需要在 25 个小时后运行。 Mesos 可以重新分配工作负载,以便其他 75 个节点在不使用时可以关闭电源。 Mesos 也可以提供资源共享。如果您的某个节点发生故障,则可以将工作负载分配到其他节点中。
Mesos 带有许多使用其资源共享功能的框架和应用栈。每个框架由一个调度器和一个执行器组成。 Marathon是一个框架(或元框架),可以启动应用程序和其他框架。 Marathon还可以作为容器编排平台,为容器工作负载提供扩展和自我修复。下图显示了 Mesos + Marathon的架构。
Mesos 和Marathon中有许多不同的组件。以下列表提供了一些常用术语:
Mesos Master:master 这种类型的节点可以给多种框架共享资源,例如用于容器编排的Marathon,用于大规模数据处理的 Spark 以及用于 NoSQL 数据库的 Cassandra。
Mesos Slave:Slave 这种类型的节点执行实际工作任务,并且向 master 汇报可用资源。
Framework:Framework 向 Master 注册,master 允许 Framework 的任务在 slave 节点执行。
Zookeeper:这个组件提供了一个高度可用的数据库,这个数据库可以让群集保持现在的状态,并且稳定。
Marathon Scheduler:这个组件接收来自 Mesos master 的报告。 Mesos master 提供当前集群可用的内存,CPU
Docker Executor:这个组件接收来自 Marathon 调度器的任务,并启动 slave 节点上运行容器。
Mesosphere DCOS
Mesosphere Enterprise DC / OS 利用 Mesos 分布式系统内核,在容器和大数据管理基础上构建,提供安装,用户界面,管理和监视工具等功能。下图显示了 DCOS 的高级体系结构。
kubernetes 对比 mesos + marathon
1. 应用定义
k8s: 可以使用 Pod,部署和服务的组合来部署应用程序。一个 pod 是一组位于同一节点的容器,是部署的原子单位。部署可以在多个节点上具有副本。服务是容器工作负载的“外部表现”,并与 DNS 集成配合访问。
marathon:从用户的角度来看,应用程序将作为 Marathon 在节点上调度的任务运行。 对于 Mesos,应用程序是一个框架,可以是 Marathon,Cassandra,Spark 等等。 Marathon 将容器调度为在从节点上执行的任务。marathon 1.4 引入了 pod 的概念( 如同 Kubernetes pod),但这不是 marathon 核心的一部分。 节点可以根据机架,连接的存储类型等进行标记。启动 Docker 容器时可以使用这些约束。
2.应用的可扩展性
k8s:每个应用程序层都被定义为一个 pod,并且可以在通过声明性指定的部署进行管理时进行缩放,例如,在 YAML 中。 缩放可以是手动或自动的。
marathon:可以使用 Mesos CLI 或 UI。 可以使用 JSON 定义来启动 Docker 容器,这些定义指定了存储库,资源,实例数量和要执行的命令。 可以通过使用 Marathon UI 进行扩展,Marathon 调度程序将根据指定的标准将这些容器分布在从节点上。 支持自动缩放。 可以使用应用程序组来部署多层应用程序。
3.高可用
k8s:pod 可以部署在不同节点上支持高可用。多个 master 节点,node 节点可以以负载均衡的方式对应客户端的访问。etcd 可以以集群方式部署
marathon: 容器可以不受限制的部署在任何节点上。使用 Zookeeper 支持 Mesos 和 Marathon 的高可用性。 Zookeeper 提供 Mesos 和 Marathon 领导者的选举并维护集群状态。
4.负载均衡
k8s: Pod 是通过服务暴露的,可以在集群内用作负载平衡器。
marathon :主机端口可以映射到多个容器端口,作为其他应用程序或最终用户的前端。
5.应用程序自动伸缩
k8s:使用简单的 pod 目标进行自动缩放是使用部署以声明方式定义的。 还支持使用资源度量的自动缩放。 资源指标范围从 CPU 和内存利用率到请求或每秒数据包甚至自定义指标。
marathon:马拉松持续监视正在运行的 Docker 容器实例的数量。 如果其中一个容器发生故障,Marathon 会将其重新安排在其他从属节点上。 只有通过社区支持的组件才能使用资源指标进行自动扩展。
6.应用程序滚动升级,回滚
k8s : 在 deployment 中有滚动升级和回滚的策略。可以设置 pod 最大数量。
marathon: 部署支持应用程序的滚动升级。失败的升级可以使用回滚更改的更新部署进行修复。
7.健康检查
k8s:健康检查有两种:活跃(即应用程序响应)和准备(应用程序响应,但正在忙着准备,还没有能够服务)。
marathon:运行状况检查可以指定为针对应用程序的任务运行。健康检查请求可用于许多协议,包括 HTTP,TCP 和其他协议。
8.存储
k8s:两个存储 API:第一个提供个人存储后端的抽象(例如 NFS,AWS EBS,Ceph,Flocker)。 第二个提供存储资源请求的抽象,这可以用不同的存储后端来实现。 修改集群节点上 Docker 守护进程使用的存储资源需要暂时从集群中删除该节点。 Kubernetes 提供了几种类型的持续卷,支持块或文件。 例子包括 iSCSI,NFS,FC,亚马逊网络服务,Google 云端平台和微软 Azure。 emptyDir 卷是非持久性的,可以用来读取和写入容器的文件。
mesos/marathon:本地持久性卷(测试版)支持有状态的应用程序,如 MySQL。 需要时,可以使用相同的卷在同一节点上重新启动任务。 外部存储(如 Amazon EBS)的使用也在测试阶段。 目前,使用外部卷的应用程序只能缩放到一个实例,因为卷一次只能附加到一个任务。
9.网络
k8s:网络模型是一个扁平的网络,使所有的 pod 互相通信。 网络策略指定 pod 如何相互通信。 平面网络通常作为 overlay 来实现。 该模型需要两个 CIDR:一个从中获取 IP 地址,另一个用于服务。
mesos/marathon:网络可以在主机模式或网桥模式下进行配置。 在主机模式下,主机端口由容器使用。 这可能会导致任何给定主机上的端口冲突。 在桥接模式下,容器端口使用端口映射桥接到主机端口。 主机端口可以在部署时动态分配。
10.服务发现
k8s:可以使用环境变量或 DNS 来找到服务。 运行 pod 时,Kubelet 会添加一组环境变量。 Kubelet 支持简单的{SVCNAME_SERVICE_HOST}和{SVCNAME_SERVICE_PORT}变量,以及 Docker 链接兼容变量。 DNS 服务器可作为附件使用。 对于每个 Kubernetes 服务,DNS 服务器创建一组 DNS 记录。 在整个群集中启用 DNS 后,pod 将能够使用自动解析的服务名称。
marathon:服务可以通过“命名 VIP”发现,它们是与 IP 和端口关联的 DNS 记录。 服务由 Mesos-DNS 自动分配 DNS 记录。 可以创建一个可选的命名 VIP; 通过 VIP 的请求是负载平衡的。
11.性能和节点支持
k8s: Kubernetes 可扩展到 5,000 个节点的集群。可以集群联邦来扩展超出此限制。
mesos/marathon: Mesos 的 2 层体系结构(包括 Marathon)非常具有可扩展性。据 Digital Ocean 介绍,Mesos 和 Marathon 集群已经扩展到 10,000 个节点。
优缺点
k8s:各种各样的存储选项,包括本地 SAN 和公共云。 基于在 Google 上运行 Linux 容器的丰富经验。 在组织中更频繁地部署。 Kubernetes 也得到来自 Google(GKE)和 RedHat(OpenShift)的企业支持。 容器编排工具中最大的社区。 超过 50,000 个提交者和 1200 个贡献者。
mesos/marathon: Mesos + Marathon 上的外部存储,包括 Amazon EBS 在内。。 Mesos 被 Mesosphere 所利用。 Mesosphere 公司的 DCOS 产品主要由其创建者和唯一的商业发行 Mesosphere 支持。。 较小的社区。 超过 12,000 个提交者和 240 个贡献者。
k8s 缺乏单一的供应商控制,会使潜在客户的采购决策复杂化。社区包括 Google,Red Hat 和 2000 多位作者。(来源:CNCF)Kubernetes 仅为容器编排而建造。它基于 10 多年在 Google 管理 Linux 容器的经验。Kubernetes 1.6 可以扩展到 5,000 个节点的集群。超过 5,000 个节点的大规模可扩展性需要多个集群。
mesos/marathon: 单一供应商控制可能会考虑错误修复的问责制,以及与功能开发更好的协调。。 2 层架构允许部署其他框架(工作负载)。 例子包括 Spark,Chronos 和 Redis。 一些组织,如苹果,彭博,Netflix 等已经大规模地部署了超过 10,000 个节点的 Mesos。 (来源:Mesosphere 博客)
共同特点
开源项目。任何人都可以贡献,但是 Kubernetes 享有更多,更多元化的社区参与。网络功能,如负载均衡和 DNS。记录和监视。 Kubernetes 的外部工具包括 Elasticsearch / Kibana(ELK),sysdig,cAdvisor,Heapster / Grafana / InfluxDB(参考:Kubernetes 的记录和监测)。对于 Mesos / Marathon,节点提供可以汇总的日志,可以使用外部工具进行监视。 (参考:为 Mesos / Marathon 监控日志记录和调试)可以克服 Docker 和 Docker API 的限制。自动缩放支持本地。使用单独的一套管理工具。 Kubernetes 操作可以通过 kubectl CLI 和 Kubernetes Dashboard 来执行。 Mesos 使用多种界面:Mesos CLI,Mesos UI,Marathon CLI,Marathon UI。对于 Kubernetes 和 Mesos,Marathon,自己动手安装可能会很复杂。 Kubernetes 的部署工具包括 kubeadm,kops,kargo 等。 Kubernetes 部署指南中的更多详细信息。由于采用 Marathon 的 2 层架构,集群管理的 Zookeeper 设置,负载平衡的 HA 代理等,Mesos 的安装过程可能非常复杂。