容器编排技术:Docker Swarm不够用了之后

一旦进项目,好看的架构图就没那么管用了。

Swarm 集群跑了几个月,服务发现、滚动更新、跨节点网络都还行;微服务数量上来、要细粒度扩缩容和 CRD 扩展时,才开始认真评估 K8s。

容器编排基础

容器编排需求

容器管理:管理大量容器的生命周期。

服务发现:自动发现和注册服务。

负载均衡:在容器间均衡负载。

自动扩缩容:根据负载自动调整容器数量。

graph TB subgraph 容器编排需求 A[容器管理] B[服务发现] C[负载均衡] D[自动扩缩容] end subgraph 具体功能 E[创建/删除] F[健康检查] G[流量分发] H[容量规划] end A --> E B --> F C --> G D --> H subgraph 业务价值 I[简化运维] J[提高可用性] K[优化资源] L[降低成本] end A --> I B --> J C --> K D --> L style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

容器编排架构

控制平面:负责集群的控制和管理。

数据平面:负责实际的工作负载运行。

网络层:负责容器间的网络通信。

存储层:负责容器的持久化存储。

graph TB subgraph 容器编排架构 A[控制平面] A --> B[数据平面] A --> C[网络层] A --> D[存储层] end subgraph 控制平面组件 E[API服务器] F[调度器] G[控制器] H[etcd存储] end A --> E A --> F A --> G A --> H subgraph 数据平面组件 I[Kubelet] J[Kube-proxy] K[容器运行时] end B --> I B --> J B --> K style A fill:#FFD700,stroke:#DAA520,stroke-width:2px style E fill:#90EE90,stroke:#006400,stroke-width:1px

Docker Swarm

Docker Swarm是Docker原生的容器编排解决方案。

Swarm架构

Manager节点:负责集群管理。

Worker节点:负责运行容器。

Raft协议:用于Manager节点间的协调。

服务模型:基于服务的容器编排模型。

graph TB subgraph Swarm集群 A[Manager节点1] B[Manager节点2] C[Manager节点3] D[Worker节点1] E[Worker节点2] F[Worker节点N] end subgraph Raft一致性 A <--> B B <--> C A <--> C end subgraph 任务分发 G[调度器] G --> D G --> E G --> F end A --> G B --> G C --> G style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

Swarm服务

服务定义:定义服务的期望状态。

任务调度:将服务调度到合适的节点。

负载均衡:服务间的负载均衡。

滚动更新:服务的滚动更新机制。

sequenceDiagram participant User as 用户 participant Manager as Swarm Manager participant Scheduler as 调度器 participant Worker as Worker节点 participant Container as 容器 User->>Manager: 创建服务 Manager->>Scheduler: 提交服务定义 Scheduler->>Scheduler: 资源评估 Scheduler->>Worker: 分配任务 Worker->>Container: 启动容器 Container-->>Worker: 容器就绪 Worker-->>Scheduler: 任务状态更新 Scheduler-->>Manager: 服务状态更新 Manager-->>User: 服务创建完成 Note over User,Container: Swarm服务创建流程

Swarm网络

Overlay网络:跨主机的容器网络。

服务发现:内置的服务发现机制。

负载均衡:内置的负载均衡功能。

网络隔离:不同服务的网络隔离。

graph TB subgraph Swarm网络 A[服务A] B[服务B] C[Overlay网络] end subgraph 节点分布 D[节点1] E[节点2] F[节点3] end A --> C B --> C C --> D C --> E C --> F subgraph 网络特性 G[跨节点通信] H[服务发现] I[负载均衡] J[网络安全] end C --> G C --> H C --> I C --> J style C fill:#87CEEB,stroke:#1E90FF,stroke-width:2px

Kubernetes架构

Kubernetes是目前最流行的容器编排系统。

K8s核心组件

API Server:集群的统一入口。

etcd:集群的键值存储。

Scheduler:负责Pod调度。

Controller Manager:负责集群状态维护。

graph TB subgraph K8s控制平面 A[API Server] B[etcd] C[Scheduler] D[Controller Manager] end subgraph 交互关系 E[存储数据] F[调度决策] G[状态管理] end A --> B: E A --> C: F A --> D: G subgraph 外部接口 H[kubectl] I[Dashboard] J[API客户端] end A --> H A --> I A --> J style A fill:#FFD700,stroke:#DAA520,stroke-width:2px style B fill:#90EE90,stroke:#006400,stroke-width:1px

Pod概念

最小部署单元:Pod是K8s的最小部署单元。

共享网络:Pod内容器共享网络命名空间。

共享存储:Pod内容器共享存储卷。

生命周期:Pod有独立的生命周期。

graph TB subgraph Pod结构 A[Pod] A --> B[容器1] A --> C[容器2] A --> D[共享存储] end subgraph 网络命名空间 E[共享网络栈] E --> F[共享IP地址] E --> G[共享端口空间] end A --> E subgraph 存储卷 H[EmptyDir] I[ConfigMap] J[Secret] end D --> H D --> I D --> J style A fill:#90EE90,stroke:#006400,stroke-width:1px style E fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

控制器模式

副本控制器:维护Pod的副本数量。

部署控制器:管理应用的部署和更新。

状态集控制器:管理有状态应用。

守护集控制器:在每个节点上运行一个Pod。

sequenceDiagram participant API as API Server participant Controller as 控制器 participant Scheduler as 调度器 participant Kubelet as Kubelet participant Pod as Pod API->>Controller: 监听资源变化 Controller->>Controller: 调谐循环 Controller->>API: 创建Pod对象 API->>Scheduler: 通知新Pod Scheduler->>Scheduler: 调度决策 Scheduler->>API: 更新Pod绑定 API->>Kubelet: 通知Pod创建 Kubelet->>Pod: 创建容器 Pod-->>Kubelet: 容器状态 Kubelet->>API: 更新Pod状态 API->>Controller: 通知状态更新 Note over API,Pod: 控制器工作流程

K8s资源管理

K8s提供了丰富的资源管理能力。

Deployment

声明式配置:使用声明式配置定义应用。

滚动更新:支持应用的滚动更新。

回滚机制:支持应用的回滚操作。

扩缩容:支持应用的扩缩容。

graph TB subgraph Deployment生命周期 A[创建Deployment] A --> B[创建ReplicaSet] B --> C[创建Pod] C --> D[Pod运行] end subgraph 更新流程 E[更新Deployment] E --> F[创建新ReplicaSet] F --> G[逐步扩展新Pod] G --> H[逐步收缩旧Pod] end subgraph 回滚流程 I[触发回滚] I --> J[恢复旧ReplicaSet] J --> K[清理新ReplicaSet] end D --> E H --> I style A fill:#90EE90,stroke:#006400,stroke-width:1px style E fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

Service与Ingress

Service:提供稳定的服务访问入口。

ClusterIP:集群内部可访问的服务。

NodePort:通过节点端口暴露服务。

LoadBalancer:通过负载均衡器暴露服务。

Ingress:基于HTTP的路由规则。

graph TB subgraph Service类型 A[ClusterIP] B[NodePort] C[LoadBalancer] end subgraph 访问方式 D[集群内部] E[节点端口] F[外部负载均衡] end A --> D B --> E C --> F subgraph Ingress G[Ingress Controller] G --> H[路由规则] H --> I[后端服务] end F --> G D --> I style A fill:#90EE90,stroke:#006400,stroke-width:1px style G fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

ConfigMap与Secret

ConfigMap:存储配置数据。

Secret:存储敏感数据。

环境变量:将配置注入环境变量。

挂载卷:将配置挂载为文件。

graph TB subgraph 配置管理 A[ConfigMap] B[Secret] end subgraph 注入方式 C[环境变量] D[挂载卷] E[命令行参数] end A --> C A --> D B --> C B --> D subgraph 数据特性 F[明文存储] G[Base64编码] H[加密存储] end A --> F B --> G B --> H style A fill:#90EE90,stroke:#006400,stroke-width:1px style B fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

存储管理

K8s提供了灵活的存储管理能力。

存储卷类型

EmptyDir:Pod删除时数据丢失。

HostPath:使用主机路径。

PersistentVolume:持久化存储卷。

StorageClass:动态存储分配。

graph TB subgraph 存储卷类型 A[EmptyDir] B[HostPath] C[PersistentVolume] D[StorageClass] end subgraph 存储特性 E[临时存储] F[节点存储] G[持久存储] H[动态分配] end A --> E B --> F C --> G D --> H subgraph 生命周期 I[Pod生命周期] J[集群生命周期] K[动态创建] end A --> I C --> J D --> K style C fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

PV与PVC

PersistentVolume:集群级别的存储资源。

PersistentVolumeClaim:命名空间级别的存储请求。

绑定机制:PV与PVC的绑定机制。

回收策略:PV的回收策略。

sequenceDiagram participant Admin as 管理员 participant K8s as Kubernetes PV as PersistentVolume PVC as PersistentVolumeClaim Pod as Pod Admin->>PV: 创建PV PV->>K8s: 注册PV Admin->>PVC: 创建PVC PVC->>K8s: 请求存储 K8s->>K8s: 匹配PV K8s->>PVC: 绑定PV Pod->>PVC: 挂载存储 PVC->>PV: 使用存储 Note over Admin,Pod: PV/PVC绑定流程

网络管理

K8s提供了强大的网络管理能力。

网络模型

扁平网络:所有Pod在同一个扁平网络中。

无NAT:Pod间通信无需NAT。

IP分配:每个Pod有独立的IP地址。

网络策略:支持网络访问控制。

graph TB subgraph K8s网络模型 A[Pod1<br/>10.244.0.2] B[Pod2<br/>10.244.0.3] C[Pod3<br/>10.244.1.2] D[PodN<br/>10.244.255.254] end subgraph 网络特性 E[扁平地址空间] F[无需NAT] G[IP-per-Pod] end A --> E B --> F C --> G subgraph 网络实现 H[CNI插件] I[网络策略] end D --> H A --> I style A fill:#90EE90,stroke:#006400,stroke-width:1px style H fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

CNI插件

Flannel:简单的Overlay网络。

Calico:基于BGP的网络。

Weave Net:加密的网络解决方案。

Cilium:基于eBPF的网络。

graph TB subgraph CNI插件对比 A[Flannel] B[Calico] C[Weave Net] D[Cilium] end subgraph 网络技术 E[VXLAN Overlay] F[BGP路由] G[加密Overlay] H[eBPF] end A --> E B --> F C --> G D --> H subgraph 适用场景 I[简单场景] J[生产环境] K[安全需求] L[高性能需求] end A --> I B --> J C --> K D --> L style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

调度与扩缩容

K8s提供了智能的调度和扩缩容能力。

调度策略

资源请求:Pod的资源需求。

资源限制:Pod的资源限制。

节点选择器:选择特定的节点。

亲和性规则:定义Pod的亲和性规则。

graph TB subgraph 调度流程 A[待调度Pod] A --> B[过滤节点] B --> C[打分排序] C --> D[选择节点] D --> E[绑定Pod] end subgraph 调度约束 F[资源需求] G[节点选择器] H[亲和性规则] I[反亲和性规则] end B --> F B --> G C --> H C --> I subgraph 调度策略 J[资源利用率] K[负载均衡] L[高可用性] end C --> J C --> K C --> L style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

自动扩缩容

HPA:基于CPU/内存的水平扩缩容。

VPA:垂直扩缩容。

Cluster Autoscaler:集群节点的自动扩缩容。

自定义指标:基于自定义指标的扩缩容。

sequenceDiagram participant Monitor as 监控系统 participant Metrics as 指标服务 participant HPA as HPA控制器 participant Deployment as Deployment participant Cluster as Cluster Autoscaler Monitor->>Metrics: 收集指标 Metrics->>HPA: 提供指标 HPA->>HPA: 计算期望副本数 alt 需要扩容 HPA->>Deployment: 扩容副本 Deployment->>Cluster: 检查资源 Cluster->>Cluster: 增加节点 else 需要缩容 HPA->>Deployment: 缩容副本 Deployment->>Cluster: 检查资源 Cluster->>Cluster: 减少节点 end Note over Monitor,Cluster: 自动扩缩容流程

服务网格

服务网格为微服务提供了丰富的网络功能。

服务网格架构

数据平面:使用Sidecar代理处理网络流量。

控制平面:管理配置和策略。

服务发现:自动的服务发现机制。

流量管理:精细的流量管理能力。

graph TB subgraph 服务网格架构 A[应用Pod] A --> B[Sidecar代理] B --> C[控制平面] end subgraph 数据平面 D[Envoy代理] E[流量拦截] F[负载均衡] end B --> D B --> E B --> F subgraph 控制平面 G[配置管理] H[策略管理] I[证书管理] end C --> G C --> H C --> I style C fill:#FFD700,stroke:#DAA520,stroke-width:2px style D fill:#90EE90,stroke:#006400,stroke-width:1px

Istio特性

流量管理:智能的流量路由。

安全:服务间的安全通信。

可观测性:丰富的监控和追踪能力。

策略执行:统一的策略执行。

graph TB subgraph Istio核心功能 A[流量管理] B[安全] C[可观测性] D[策略执行] end subgraph 具体特性 E[请求路由] F[mTLS] G[分布式追踪] H[访问控制] end A --> E B --> F C --> G D --> H subgraph 应用价值 I[流量控制] J[安全加固] K[故障排查] L[合规管理] end A --> I B --> J C --> K D --> L style A fill:#90EE90,stroke:#006400,stroke-width:1px style B fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

运维实践

有效的运维实践是保证K8s集群稳定运行的关键。

集群部署

kubeadm:官方的集群部署工具。

kops:AWS上的集群部署工具。

Rancher:企业级K8s管理平台。

云服务商:使用云服务商的托管K8s。

graph TB subgraph 部署方式 A[kubeadm] B[kops] C[Rancher] D[云服务商K8s] end subgraph 部署特点 E[官方工具] F[AWS优化] G[企业级管理] H[托管服务] end A --> E B --> F C --> G D --> H subgraph 适用场景 I[自建集群] J[AWS环境] K[企业环境] L[生产环境] end A --> I B --> J C --> K D --> L style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

监控与日志

Prometheus:监控指标收集。

Grafana:监控数据可视化。

ELK Stack:日志收集和分析。

分布式追踪:应用性能监控。

graph TB subgraph 监控日志体系 A[Prometheus] B[Grafana] C[ELK Stack] D[Jaeger] end subgraph 功能覆盖 E[指标收集] F[数据可视化] G[日志分析] H[分布式追踪] end A --> E B --> F C --> G D --> H subgraph 数据源 I[cAdvisor] J[Filebeat] K[应用埋点] end A --> I C --> J D --> K style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

最佳实践

基于实际项目的K8s最佳实践。

设计原则

声明式配置:使用声明式而非命令式配置。

不可变基础设施:使用不可变的基础设施。

单一职责:每个组件职责单一。

资源限制:设置合理的资源限制。

graph TB subgraph 设计原则 A[声明式配置] B[不可变基础设施] C[单一职责] D[资源限制] end subgraph 实施要点 E[GitOps] F[镜像构建] G[微服务设计] H[配额管理] end A --> E B --> F C --> G D --> H subgraph 质量保证 I[配置管理] J[版本控制] K[资源监控] end A --> I B --> J D --> K style A fill:#90EE90,stroke:#006400,stroke-width:1px style B fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

安全实践

RBAC:基于角色的访问控制。

网络策略:网络安全策略。

镜像扫描:容器镜像安全扫描。

Secret管理:安全的Secret管理。

sequenceDiagram participant User as 用户 participant K8s as Kubernetes participant RBAC as RBAC participant Policy as 网络策略 participant Scanner as 镜像扫描器 User->>K8s: 访问集群 K8s->>RBAC: 验证权限 RBAC-->>K8s: 权限检查结果 alt 权限通过 K8s->>Policy: 检查网络策略 Policy-->>K8s: 策略检查结果 K8s->>Scanner: 扫描镜像 Scanner-->>K8s: 扫描结果 alt 镜像安全 K8s-->>User: 执行操作 else 镜像不安全 K8s-->>User: 拒绝操作 end else 权限拒绝 K8s-->>User: 拒绝访问 end Note over User,Scanner: K8s安全检查流程

未来发展趋势

容器编排技术仍在不断发展,未来的趋势包括:

Serverless容器

无服务器容器:按需运行的容器实例。

自动扩缩容:完全自动的扩缩容。

按需付费:按实际使用付费。

简化运维:大幅简化运维工作。

graph TB subgraph Serverless容器特性 A[按需运行] B[自动扩缩容] C[按需付费] D[简化运维] end subgraph 技术实现 E[函数计算] F[事件驱动] G[冷启动优化] end A --> E B --> F C --> G subgraph 应用价值 H[降低成本] I[提高效率] J[减少复杂度] end A --> H B --> I D --> J style A fill:#90EE90,stroke:#006400,stroke-width:1px style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px

边缘计算

边缘部署:在边缘节点部署K8s。

离线运行:支持离线运行模式。

轻量级:适配边缘设备的轻量级K8s。

统一管理:云边统一的集群管理。

graph TB subgraph 云边协同架构 A[云中心集群] A --> B[边缘节点1] A --> C[边缘节点2] A --> D[边缘节点N] end subgraph 边缘特性 E[资源受限] F[网络不稳定] G[离线运行] end B --> E C --> F D --> G subgraph 统一管理 H[统一控制面] I[应用分发] J[状态同步] end A --> H A --> I A --> J style A fill:#FFD700,stroke:#DAA520,stroke-width:2px style H fill:#90EE90,stroke:#006400,stroke-width:1px

收个尾

Swarm 上手快、和 Docker CLI 一体,小团队、服务量不大时够用。要细粒度调度、丰富 CRD、成熟生态和可观测性,K8s 基本是默认选项——代价是控制面复杂、运维门槛高。

编排工具解决的是容器生命周期、服务发现、扩缩容和故障恢复;选 Swarm 还是 K8s,看团队规模、服务复杂度和有没有专职平台同学。别为了追标准硬上 K8s,也别在明显需要 K8s 的能力时硬撑 Swarm。

版权声明: 本文首发于 指尖魔法屋-容器编排技术:Docker Swarm不够用了之后https://blog.thinkmoon.cn/post/48-container-orchestration-swarm-k8s-practice/) 转载或引用必须申明原指尖魔法屋来源及源地址!