1. 概述
在本教程中,我们将了解容器编排系统的基本需求。
我们会分析此类系统应具备的特性,并基于这些特性对目前使用最广泛的两个容器编排系统 —— Apache Mesos 和 Kubernetes 进行对比分析。
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 和应用框架组成:
各组件说明如下:
- 框架(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 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 是更灵活的方案
容器编排技术仍在快速发展中,建议根据团队技能、运维能力、项目规模和未来扩展性综合评估。希望本文能帮助你做出更明智的技术选型决策 ✅。