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 个
节点。
12. 优缺点
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。