1. 概述

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

我们会分析此类系统应具备的特性,并基于这些特性对目前使用最广泛的两个容器编排系统 —— Apache MesosKubernetes 进行对比分析。

2. 容器编排简介

在比较 Mesos 与 Kubernetes 之前,我们先来理解一下什么是容器,以及为何需要容器编排。

2.1 容器

容器是一种标准化的软件单元,它将代码及其所有依赖项打包在一起 ✅。

这使得应用具备平台无关性和操作简便性。Docker 是当前最流行的容器平台之一。

Docker 利用 Linux 内核的 CGroups 和命名空间(namespaces)等特性来实现进程隔离,从而使得多个容器可以独立且安全地运行。

创建 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 CLI 构建镜像也很容易:

docker build -t hello_world .

2.2 容器编排

虽然容器简化了部署流程,但当我们需要管理成百上千个容器时,仅靠 Docker CLI 就显得力不从心了 ❌。

想象一下,一个由多个微服务组成的架构,每个服务都有不同的可扩展性和可用性要求。这种情况下,管理难度会迅速上升。

这就需要容器编排系统来帮忙了 ✅。

容器编排系统将整个集群中的多容器应用视为一个统一的部署实体。它不仅支持自动化部署、调度和更新,还提供监控、伸缩和故障转移等功能。

3. Mesos 简介

Apache Mesos 是一个开源的集群管理器,最初由加州大学伯克利分校开发。它为应用提供了资源管理和跨集群调度的 API,支持运行容器化和非容器化的工作负载。

3.1 架构

Mesos 的架构由 Mesos Master、Mesos Agent 和应用框架组成:

Mesos Architecture

各组件说明如下:

  • 框架(Frameworks):实际需要分布式执行任务的应用,如 Hadoop 或 Storm。框架包含两个核心组件:
    • 调度器(Scheduler):向 Master 注册,使其可以开始提供资源
    • 执行器(Executor):在 Agent 上启动,运行框架任务
  • Mesos Agent:负责运行任务。每个 Agent 会向 Master 报告可用资源(如 CPU、内存),并在收到任务后为执行器分配所需资源
  • Mesos Master:负责将任务调度到可用的 Agent 上。Master 向框架提供资源,框架调度器可选择在这些资源上运行任务

3.2 Marathon

Mesos 本身并不直接提供容器编排功能,而是通过框架(如 Marathon)来实现。Marathon 是一个运行在 Mesos 上的容器编排框架,提供服务发现、负载均衡、指标监控和容器管理等常用功能。

Marathon 将长期运行的服务视为应用,将应用实例视为任务。典型场景中,多个应用可能有依赖关系,形成所谓的“应用组”(Application Groups)。

3.3 示例

假设我们已经构建了一个简单的 Docker 镜像 hello_world,我们可以使用 Marathon 部署它。推荐使用 Mesos Mini 快速搭建一个本地 Mesos 集群,包含 Mesos Master、Agent 和 Marathon。

部署应用需要一个 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"
    }
  ]
}

使用 Marathon 提供的 REST API 部署应用:

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

4. Kubernetes 简介

Kubernetes 是一个由 Google 开发的开源容器编排系统,现由 CNCF 维护。它为容器化应用的部署、伸缩和运维提供自动化支持。

4.1 架构

Kubernetes 架构由 Kubernetes Master 和 Kubernetes Node 构成:

Kubernetes Architecture

主要组件如下:

  • Kubernetes Master
    • kube-apiserver:处理 REST 请求、验证和更新 Kubernetes 对象、执行认证与授权
    • kube-controller-manager:核心控制循环,确保集群状态与期望状态一致
    • kube-scheduler:将未调度的 Pod 绑定到合适的 Node 上
  • Kubernetes Node
    • kubelet:确保容器按照 PodSpec 描述运行
    • kube-proxy:网络代理,实现 TCP/UDP 流转发或后端负载均衡
    • 容器运行时(Container Runtime):如 Docker、rkt、containerd 等

4.2 Kubernetes 对象

Kubernetes 中的对象是持久化的实体,反映集群在任意时刻的状态。常见对象包括:

  • Pod:Kubernetes 中最基本的执行单元,可包含一个或多个容器
  • Deployment:推荐的 Pod 部署方式,支持状态同步、滚动更新等
  • Service:抽象地暴露一组 Pod,通过标签选择器进行匹配

4.3 示例

我们可以通过 Minikube 快速搭建一个单节点 Kubernetes 集群,并使用 kubectl 进行操作。

部署应用的 YAML 文件如下:

# 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

部署命令如下:

kubectl apply -f yaml/hello-kubernetes.yaml

5. Mesos vs. Kubernetes 比较

虽然直接比较 Kubernetes 和 Mesos 不太公平(因为 Mesos 本身是集群管理器,而 Marathon 才是其容器编排层),但为了便于理解,我们仍将 Kubernetes 与 Marathon 进行对比。

5.1 支持的工作负载类型

系统 支持工作负载
Mesos + Marathon 容器化和非容器化工作负载均可
Kubernetes 仅支持容器化工作负载(默认 Docker,支持其他运行时)

5.2 可扩展性支持

系统 扩展能力
Mesos + Marathon 支持应用定义或 UI 扩展,支持自动扩缩容,可扩展应用组
Kubernetes 通过 Deployment 实现 Pod 扩容,支持手动和自动扩缩容

5.3 高可用性支持

系统 高可用实现
Mesos + Marathon 应用实例分布在多个 Agent 上,ZooKeeper 实现 Master 高可用
Kubernetes Pod 分布在多个 Node 上,支持多 Master 架构

5.4 服务发现与负载均衡

系统 服务发现 & 负载均衡
Mesos + Marathon Mesos-DNS 提供服务发现,Marathon-lb 提供负载均衡(基于 HAProxy)
Kubernetes Service 对象提供服务发现与负载均衡

5.5 升级与回滚

系统 升级与回滚机制
Mesos + Marathon 支持滚动更新,回滚需重新部署应用定义
Kubernetes 支持滚动更新与回滚,Deployment 历史记录自动保存

5.6 日志与监控

系统 日志与监控支持
Mesos + Marathon 内置诊断工具,可通过 API 查询,推荐使用 Prometheus 等外部工具
Kubernetes 提供资源指标和完整监控流水线,推荐使用 ELK、Prometheus+Grafana

5.7 存储支持

系统 存储支持
Mesos + Marathon 支持本地持久卷,实验性支持 CSI
Kubernetes 支持多种持久卷类型(iSCSI、NFS、AWS、GCP 等),支持 CSI

5.8 网络支持

系统 网络特性
Mesos + Marathon IP-per-container、端口映射;支持 Host 和 Bridge 模式
Kubernetes 每个 Pod 有独立 IP,支持跨节点通信(通过 Cilium、Contiv 等插件)

6. 何时使用哪个系统?

  • Kubernetes 更适合:

    • 新项目
    • 全容器化工作负载
    • 快速上手、开箱即用的容器编排解决方案
  • Mesos + Marathon 更适合:

    • 混合工作负载(容器 + 非容器)
    • 已有 Mesos 基础设施
    • 需要支持非容器任务(如大数据任务)

性能方面,Kubernetes 支持最多 5000 个节点,而 Mesos 集群可支持上万个节点。但在实际生产中,这种差异通常不明显。

7. 其他替代方案

除了 Kubernetes 和 Mesos,还有一些值得考虑的替代方案:

  • Docker Swarm:Docker 原生的集群管理工具,功能简单,适合 Docker 用户
  • Nomad:HashiCorp 提供的通用任务调度器,支持容器与非容器任务
  • OpenShift:基于 Kubernetes 的企业级容器平台,由 Red Hat 提供,提供更多开箱即用的功能

8. 总结

本文介绍了容器和容器编排系统的基本概念,对比了 Mesos(通过 Marathon)与 Kubernetes 的主要功能和特性。

两者都具备强大的功能,选择哪个系统取决于你的具体使用场景:

  • 如果你只使用容器化应用,Kubernetes 是更简单直接的选择
  • 如果你有混合工作负载或已有 Mesos 基础设施,Mesos + Marathon 是更灵活的方案

容器编排技术仍在快速发展中,建议根据团队技能、运维能力、项目规模和未来扩展性综合评估。希望本文能帮助你做出更明智的技术选型决策 ✅。


原始标题:Mesos vs. Kubernetes