Mesos vs. Kubernetes

原创 Emma 锅外的大佬 2019-10-18
点击左上角蓝字,关注“锅外的大佬”
专注分享国外最新技术内容

1.概述

在本教程中,我们将了解容器编排系统的基本需求。

我们将评估这种系统的期望特性。从这时起,我们将尝试比较两种当今最流行使用的容器编排系统,Apache Mesos和Kubernetes。

2.容器编排

在我们开始比较Mesos和Kubernetes之前,让我们花一些时间来了解容器是什么以及为什么我们需要容器编排。

2.2 容器

容器是软件的标准化单元,它打包代码及其所有必需的依赖项。

因此,它提供了平台独立性和操作简单性。Docker是最受欢迎的容器平台之一。

Docker利用Linux内核CGroup和命名空间等功能来提供不同进程的隔离。因此,多个容器可以独立且安全地运行。

创建docker镜像非常简单,我们仅需要一个Dockerfile:


FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/hello-world-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 9001
docker build -t hello_world .

2.3 容器编排

因此,我们已经了解了容器如何使应用程序部署可靠且可重复。但为什么我们需要容器编排?

现在,虽然我们有一些容器需要管理,但用Docker CLI没问题。我们也可以自动化一些简单的家务。但是,当我们要管理数百个容器时会发生什么?

例如,考虑具有多个微服务的架构,所有微服务都具有不同的可扩展性和可用性要求。

因此,事情很快就会失控,这就是容器管理系统的优势所在。容器管理系统将具有多容器应用程序的计算机集群视为单个部署实体。它提供从初始部署,调度,更新到其他功能(如监控,扩展和故障转移)的自动化。

3.Mesos概述

Apache Mesos是一个开源集群管理器,最初是在加州大学伯克利分校开发的。它为应用程序提供API,用于跨集群的资源管理和调度。Mesos能够使我们以分布式方式灵活地运行容器化和非容器化工作负载。

3.1 架构

Mesos架构由Mesos Master,Mesos Agent和Application Fram组成
Mesos vs. Kubernetes_第1张图片

image
让我们了解架构的组成部分:

框架:这些是需要分布式执行任务或工作负载的实际应用程序。典型的例子是Hadoop或Storm。Mesos中的框架包含两个主要组件:
Scheduler:它负责向主节点注册,以便主服务器可以开始提供资源
Executor:这是在代理节点上启动以运行框架任务的过程
Mesos Agents:负责运行实际任务。每个代理都向主服务器发布其可用资源,如CPU和内存。在从主服务器接收任务时,他们将所需资源分配给框架的执行程序。
Mesos Master:负责在一个可用代理节点上调度从Frameworks接收的任务。Master为Frameworks提供资源。Framework的调度程序可以选择在这些可用资源上运行任务。

3.2 Marathon

正如我们刚才看到的,Mesos非常灵活,允许框架通过定义良好的API来安排和执行任务。但是,直接实现这些原语并不方便,特别是当我们想要安排自定义应用程序时。例如,管理打包为容器的应用程序。

这就是像Marathon这样的框架可以帮助我们的地方。Marathon是一个在Mesos上运行的容器管理框架。在这方面,Marathon充当Mesos集群的框架。Marathon提供了我们通常期望从服务发现,负载平衡,度量和容器管理API等管理平台获得的一些好处。

Marathon将长时间运行的服务视为应用程序,将应用程序实例视为任务。典型的场景可以有多个应用程序,其依赖关系形成所谓的应用程序组。

3.3. 例子

那么,让我们看看我们如何使用Marathon来部署之前创建的简单Docker镜像。请注意,安装Mesos集群可能很少涉及,因此我们可以使用更简单的解决方案,如Mesos Mini。Mesos Mini使我们能够在Docker环境中启动本地Mesos集群。它包括一个Mesos Master,单个Mesos Agent和Marathon。

一旦我们启动并运行Marathon的Mesos集群,我们就可以将容器部署为长期运行的应用程序服务。我们需要一个小的JSON应用程序定义:


#hello-marathon.json
{
  "id": "marathon-demo-application",
  "cpus": 1,
  "mem": 128,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "hello_world:latest",
      "portMappings": [
        { "containerPort": 9001, "hostPort": 0 }
      ]
    }
  },
  "networks": [
    {
      "mode": "host"
    }
  ]
}

让我们来解释一下这里到底发生了什么:

我们为我们的应用程序提供了一个id
然后,我们为应用程序定义了资源需求
我们还定义了我们想要运行的实例数
然后,我们提供了容器详细信息以启动应用程序
最后,我们已经定义了网络模式,以便我们能够访问应用程序
我们可以使用Marathon提供的REST API启动此应用程序:

curl -X POST \
  http://localhost:8080/v2/apps \
  -d @hello-marathon.json \
  -H "Content-type: application/json"

4. Kubernetes概述

Kubernetes是一个最初由Google开发的开源容器管理系统。它现在是Cloud Native Computing Foundation(CNCF)的一部分。它提供了一个平台,用于跨主机集群自动部署,扩展和操作应用程序容器。

4.1. 架构

Kubernetes建筑由Kubernetes Master和Kubernetes Nodes组成:Mesos vs. Kubernetes_第2张图片

image
让我们来看看高级架构的主要组成部分:

  • Kubernetes Master:主服务器负责维护集群的所需状态。它管理集群中的所有节点。我们可以看到,master是三个进程的集合:
  • kube-apiserver:这是管理整个集群的服务,包括处理REST操作,验证和更新Kubernetes对象,执行身份验证和授权
  • kube-controller-manager:这是嵌入Kubernetes附带的核心控制循环的守护进程,进行必要的更改以使当前状态与所需的集群状态相匹配
  • kube-scheduler:此服务监视未安排的pod,并根据请求的资源和其他约束将它们绑定到节点
  • Kubernetes Nodes:Kubernetes集群中的节点是运行容器的机器。每个节点都包含运行容器所需的服务:
  • kubelet: 这是主节点代理,可确保kube-apiserver提供的PodSpecs中描述的容器正在运行且运行正常
  • kube-proxy:这是在每个节点上运行的网络代理,并在一组健康的后端上执行简单的TCP,UDP,SCTP流转发或循环转发
  • container runtime: 这是运行pod中容器的运行时间,Kubernetes有几个可能的容器运行时间,包括最广泛使用的Docker运行时间

    4.2. Kubernetes对象

在上一节中,我们看到了几个Kubernetes对象,它们是Kubernetes系统中的持久实体。它们可以在任何时间点反映集群的状态。

我们来讨论一些常用的Kubernetes对象:

Pods:Pod是Kubernetes中的基本执行单元,可以包含一个或多个容器,Pod中的容器部署在同一主机上
Deployment:部署是在Kubernetes中部署pod的推荐方法,它提供了诸如不断协调pod的当前状态和所需状态的功能
Services:Kubernetes中的服务提供了一种抽象方式来公开一组pod,其中分组基于目标pod标签的选择器
还有其他几个Kubernetes对象用于有效地以分布式方式运行容器。

4.3. 例子

所以,现在我们可以尝试将我们的Docker容器启动到Kubernetes集群中。Kubernetes提供Minikube,这是一个在虚拟机上运行单节点Kubernetes集群的工具。我们还需要kubectl,Kubernetes命令行界面来与Kubernetes集群一起工作。

安装kubectl和Minikube之后,我们可以在Minikube内的单节点Kubernetes集群上部署我们的容器。我们需要在YAML文件中定义基本的Kubernetes对象:

# hello-kubernetes.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: hello-world:latest
        ports:
        - containerPort: 9001
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  selector:
    app: hello-world
  type: LoadBalancer
  ports:
  - port: 9001
    targetPort: 9001

这里不可能详细分析这个定义文件,但让我们来看看重点:

我们在选择器中定义了带标签的部署
我们定义了此部署所需的副本数量
此外,我们还提供了容器映像详细信息作为部署的模板
我们还使用适当的选择器定义了一个服务
我们已将服务的性质定义为LoadBalancer
最后,我们可以部署容器并通过kubectl创建所有已定义的Kubernetes对象;


kubectl apply -f yaml/hello-kubernetes.yaml

5. Mesos vs. Kubernetes

现在,我们已经完成了上下文已准备完毕,并在Marathon``和Kubernetes上进行了基本部署。我们可以尝试了解它们相互比较的场景。

但需要注意的是,将Kubernetes与Mesos直接比较并不完全公平。我们寻求的大多数容器管理功能都是由Marathon之类的Mesos框架提供的。因此,为了保持正确的视角,我们将尝试将Kubernetes与Marathon进行比较,而不是直接将Mesos进行比较。

我们将基于这种系统的一些所需属性来比较这些管理系统。

5.1. 支持的工作量

Mesos旨在处理各种类型的工作负载,这些工作负载可以是容器化的甚至是非容器化的。这取决于我们使用的框架。正如我们所看到的,使用像Marathon这样的框架在Mesos中支持容器化工作负载非常容易。

另一方面,Kubernetes专门用于集装箱化工作量。最广泛的是,我们将它与Docker容器一起使用,但它支持其他容器运行时,如Rkt。将来,Kubernetes可能会支持更多类型的工作负载。

5.2. 支持可伸缩性

Marathon支持通过应用程序定义或用户界面进行扩展。Marathon也支持自动缩放。我们还可以扩展自动扩展所有依赖项的应用程序组。

正如我们之前看到的,Pod是Kubernetes的基本执行单元。在部署管理时可以扩展Pod,这就是pod总是被定义为部署的原因。缩放可以是手动或自动的。

5.3. 处理高可用性

Marathon中的应用程序实例分布在Mesos代理上,提供高可用性。通常,Mesos群集由多个代理组成。此外,ZooKeeper通过仲裁和领导者选举为Mesos群集提供高可用性。

同样,Kubernetes中的pod可以跨多个节点进行复制,从而提供高可用性。通常,Kubernetes集群由多个工作节点组成。此外,集群还可以具有多个主服务器。因此,Kubernetes集群能够为容器提供高可用性。

5.4. 服务发现和负载均衡

Mesos-DNS可以为应用程序提供服务发现和基本负载平衡。Mesos-DNS为每个Mesos任务生成SRV记录,并将它们转换为运行任务的计算机的IP地址和端口。对于Marathon应用程序,我们还可以使用Marathon-lb来使用HAProxy提供基于端口的发现。

Kubernetes动态部署创建和销毁pod。因此,我们通常通过Service调用Kubernetes中的pod来提供服务发现。Kubernetes中的服务充当pod的调度程序,因此也提供负载平衡。

5.5. 执行升级和回滚

Marathon中对应用程序定义的更改将作为部署进行处理。部署支持应用程序的启动,停止,升级或扩展。Marathon还支持滚动启动以部署更新版本的应用程序。但是,回滚是直截了当的,通常需要部署更新的定义。

Kubernetes中的部署支持升级和回滚。我们可以提供在将旧容器与新容器相关联时进行部署的策略。典型的策略是重新创建或滚动更新。部署的推出历史记录默认保留在Kubernetes中,这使得回滚到以前的版本变得轻而易举。

5.6. 日志和监控

Mesos具有实用诊断程序,可扫描所有集群组件并提供与运行状况和其他指标相关的可用数据。可以通过可用的API查询和聚合数据。我们可以使用像Prometheus这样的外部工具收集大部分数据。

Kubernetes将与不同对象相关的详细信息发布为资源指标或完整指标管道。典型的做法是在Kubernetes集群上部署ELK或Prometheus + Grafana等外部工具。此类工具可以提取集群指标并以用户友好的方式呈现它们。

5.7. 存储

Mesos具有用于有状态应用程序的持久本地卷。我们只能从保留的资源中创建持久卷。它还可以支持外部存储,但有一些限制。Mesos对容器存储接口(CSI)提供了实验支持,这是存储供应商和容器编排平台之间的一组通用API。

Kubernetes为有状态容器提供多种类型的持久卷。这包括iSCSI,NFS等存储。此外,它还支持AWS,GCP等外部存储。Kubernetes中的Volume对象支持这一概念,包括各种类型,包括CSI。

5.8. 网络

Mesos中的容器运行时提供两种类型的网络支持,即每容器IP和网络端口映射。Mesos定义了一个公共接口,用于指定和检索容器的网络信息。Marathon应用程序可以在主机模式或桥接模式下定义网络。

Kubernetes中的网络为每个pod分配一个唯一的IP。这消除了将容器端口映射到主机端口的需要。它进一步定义了这些pod如何跨节点相互通信。这是通过Cilium,Contiv等网络插件在Kubernetes中实现的。

6. 什么时候用什么?

最后,相比之下,我们通常期待一个明确的判决!然而,无论如何,宣布一种技术比另一种更好是不公平的。正如我们所见,Kubernetes和Mesos都是强大的系统,并提供相当竞争的功能。

然而,性能是一个非常重要的方面。Kubernetes集群可以扩展到5000个节点,而Mesos集群上的Marathon可以支持多达10,000个代理。在大多数实际情况中,我们不会处理如此大的集群。

最后,它归结为我们的灵活性和工作负载类型。如果我们重新开始并且我们只计划使用集装箱化工作负载,Kubernetes可以提供更快的解决方案。但是,如果我们现有的工作负载(容器和非容器的混合),Mesos与Marathon可能是更好的选择。

7.其他替代品

Kubernetes和Apache Mesos非常强大,但它们并不是这个领域唯一的系统。我们有很多有前景的替代品。虽然我们不会详细地介绍他们,但我们会快速列出其中的一些内容:

Docker Swarm:Docker Swarm是Docker容器的开源集群和调度工具。它附带了一个命令行实用程序来管理Docker主机集群。与Kubernetes和Mesos不同,它仅限于Docker容器。
Nomad:Nomad是HashiCorp灵活的工作负责协调员,负责管理任何集装箱或非集装箱化应用。Nomad支持声明式基础架构作为代码,用于部署Docker容器等应用程序。
OpenShift:OpenShift是Red Hat的容器平台,由Kubernetes在下面编排和管理。OpenShift提供了许多功能,除了Kubernetes提供的功能,如集成图像注册表,源到图像构建,本机网络解决方案,仅举几例。

8. 结束语

总而言之,在本教程中,我们讨论了容器和容器编排系统。我们简要介绍了两个最广泛使用的容器编排系统,Kubernetes和Apache Mesos。我们还基于几个功能比较了这些系统。最后,我们在这个领域看到了其他一些替代方案。

在结束之前,我们必须明白,这种比较的目的是提供数据和事实。这绝不是要比其他人更好地声明一个,这通常取决于用例。因此,我们确定最佳解决方案也取决于问题的背景。

● Java克隆:只复制构造函数远远不够
● Containers vs Serverless:怎么选择?
● Java 13 的新特性
右上角按钮分享给更多人哦~Mesos vs. Kubernetes_第3张图片

来都来了,点个在看再走吧~~~

阅读 192

在看2

写下你的留言