第八部分-企业级实践——37. 容器编排选型
37. 容器编排选型
1. 容器编排概述
容器编排平台负责管理容器的整个生命周期,包括部署、扩缩容、负载均衡、服务发现、滚动更新等。Docker Swarm 和 Kubernetes 是目前主流的容器编排方案。
┌─────────────────────────────────────────────────────────────┐ │ 容器编排平台对比 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Docker Swarm Kubernetes │ │ ┌─────────────────┐ ┌─────────────────────────┐ │ │ │ 简单易用 │ │ 功能强大、复杂 │ │ │ │ 原生集成 │ │ 生态丰富 │ │ │ │ 学习曲线低 │ │ 学习曲线陡峭 │ │ │ │ 适合小规模 │ │ 适合大规模 │ │ │ │ 部署快速 │ │ 部署复杂 │ │ │ │ 轻量级 │ │ 重量级 │ │ │ └─────────────────┘ └─────────────────────────┘ │ │ │ │ 其他方案: │ │ - Nomad:轻量级调度器 │ │ - Amazon ECS:AWS 托管服务 │ │ - Azure ACI:微软容器实例 │ │ - Google Cloud Run:无服务器容器 │ │ │ └─────────────────────────────────────────────────────────────┘2. Docker Swarm vs Kubernetes
2.1 功能对比
| 特性 | Docker Swarm | Kubernetes |
|---|---|---|
| 学习曲线 | 低 | 高 |
| 安装复杂度 | 简单 | 复杂 |
| 可扩展性 | 中(数千节点) | 高(数万节点) |
| 服务发现 | 内置 DNS | 内置 DNS + Ingress |
| 负载均衡 | 内置 | 多种方案 |
| 滚动更新 | 支持 | 高级策略 |
| 自动扩缩容 | 手动 | HPA(自动) |
| 存储编排 | 卷驱动 | CSI、PV/PVC |
| 网络模型 | 简单 | 复杂(CNI) |
| 配置管理 | Configs/Secrets | ConfigMap/Secret |
| 生态 | 有限 | 丰富 |
| 社区 | 较小 | 巨大 |
| 生产验证 | 中小规模 | 所有规模 |
2.2 使用场景选择
┌─────────────────────────────────────────────────────────────┐ │ 选型决策树 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 团队规模 / 复杂度? │ │ │ │ │ ├── 小团队、简单应用 ──▶ Docker Swarm │ │ │ │ │ ├── 需要多集群 ──────▶ Kubernetes │ │ │ │ │ ├── 高级功能需求 ────▶ Kubernetes │ │ │ │ │ └── 云服务限制 ──────▶ ECS / GKE / AKS │ │ │ └─────────────────────────────────────────────────────────────┘3. Kubernetes 基础
3.1 核心概念
| 概念 | 说明 | Swarm 对应 |
|---|---|---|
| Pod | 最小部署单元,一个或多个容器 | 容器 |
| Deployment | 无状态应用部署 | Service |
| Service | 服务发现和负载均衡 | Service |
| Ingress | 外部流量入口 | Routing Mesh |
| ConfigMap | 配置管理 | Configs |
| Secret | 敏感信息 | Secrets |
| Volume | 存储卷 | Volume |
| Namespace | 资源隔离 | - |
3.2 快速安装 K8s
# 使用 Minikube(本地开发)brewinstallminikube minikube start--driver=docker# 使用 kind (Kubernetes in Docker)brewinstallkind kind create cluster--namemycluster# 使用 k3s(轻量级)curl-sfLhttps://get.k3s.io|sh-3.3 部署应用示例
# deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:webspec:replicas:3selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-name:nginximage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:webspec:selector:app:webports:-port:80targetPort:80type:LoadBalancer# 部署应用kubectl apply-fdeployment.yaml# 查看状态kubectl get pods kubectl get services# 扩缩容kubectl scale deployment web--replicas=5# 滚动更新kubectlsetimage deployment/webnginx=nginx:1.21# 查看滚动更新状态kubectl rollout status deployment/web4. Swarm vs K8s 迁移
4.1 Compose 到 K8s
# 使用 kompose 转换# 安装 komposebrewinstallkompose# 转换 docker-compose.ymlkompose convert-fdocker-compose.yml# 生成的文件# - web-deployment.yaml# - web-service.yaml# - mysql-deployment.yaml# 部署到 K8skubectl apply-f.4.2 配置对比
# Docker Swarmservices:web:image:nginxports:-"80:80"replicas:3# KubernetesapiVersion:apps/v1kind:Deploymentmetadata:name:webspec:replicas:3selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-name:nginximage:nginxports:-containerPort:805. 云托管 K8s 服务
5.1 服务对比
| 服务 | 提供商 | 特点 | 适用场景 |
|---|---|---|---|
| GKE | 成熟稳定,集成好 | 通用 | |
| EKS | AWS | 与 AWS 集成 | AWS 用户 |
| AKS | Microsoft | 与 Azure 集成 | Azure 用户 |
| DOKS | DigitalOcean | 简单,性价比高 | 中小团队 |
5.2 GKE 快速开始
# 安装 gcloudgcloud auth login gcloud configsetproject my-project# 创建集群gcloud container clusters create mycluster\--zoneus-central1-a\--num-nodes3\--machine-type n1-standard-2# 获取凭证gcloud container clusters get-credentials mycluster# 部署应用kubectl apply-fdeployment.yaml6. 其他编排方案
6.1 Amazon ECS
# task-definition.json{"family":"web","taskRoleArn":"arn:aws:iam::xxx:role/ecsTaskRole","containerDefinitions":[{"name":"nginx","image":"nginx:alpine","memory":256,"cpu":128,"essential":true,"portMappings":[{"containerPort":80,"hostPort":80,"protocol":"tcp"}]}]}# 部署到 ECSaws ecs register-task-definition --cli-input-json file://task-definition.json aws ecs create-service--clustermycluster --service-name web --task-definition web --desired-count36.2 Nomad
# job.nomad job "web" { datacenters = ["dc1"] type = "service" group "web" { count = 3 network { port "http" { to = 80 } } task "nginx" { driver = "docker" config { image = "nginx:alpine" ports = ["http"] } } } }7. 选择建议
7.1 选择 Swarm 的场景
- 团队规模小(<10 人)
- 应用简单、数量少
- 需要快速部署
- 运维能力有限
- 已有 Docker Compose 经验
7.2 选择 K8s 的场景
- 大规模集群(>100 节点)
- 需要高级功能(HPA、自动恢复)
- 多云/混合云部署
- 需要丰富的生态
- 团队有专职运维
7.3 云服务选择
- AWS 深度使用 → EKS
- GCP 深度使用 → GKE
- Azure 深度使用 → AKS
- 追求简单 → ECS / DOKS
8. 混合方案
8.1 多集群管理
# 使用 kubectl 管理多集群# 配置 contextkubectl config get-contexts kubectl config use-context gke-cluster kubectl config use-context swarm-cluster# 使用 fleet 管理# https://github.com/rancher/fleet8.2 迁移路径
阶段1: 单机 Docker │ ▼ 阶段2: Docker Compose (开发) │ ▼ 阶段3: Docker Swarm (生产) │ ▼ 阶段4: Kubernetes (大规模)9. 成本对比
| 方案 | 控制平面成本 | 计算成本 | 运维成本 |
|---|---|---|---|
| Swarm | 无 | 节点费用 | 低 |
| K8s 自建 | 低 | 节点费用 | 高 |
| GKE | $0.10/小时 | 节点费用 | 低 |
| EKS | $0.10/小时 | 节点费用 | 低 |
| AKS | 免费 | 节点费用 | 低 |
10. 常见问题
Q1: Swarm 会被淘汰吗?
不会,Swarm 仍在维护,适合中小场景。
Q2: 从 Swarm 迁移到 K8s 难度大吗?
有一定难度,需要学习新概念。可使用 Kompose 辅助。
Q3: 新手应该先学哪个?
建议先学 Swarm 理解编排概念,再学 K8s。
11. 小结
- Swarm:简单易用,适合中小规模
- Kubernetes:功能强大,适合大规模
- 云托管 K8s:降低运维负担
- ECS/Nomad:其他可选方案
- 根据团队规模、复杂度、成本选择
- 迁移路径:Docker → Compose → Swarm → K8s
- 混合部署满足不同场景需求
