docker compose 云原生底座演进分四阶段:1. 单机验证服务契约;2. 嵌入prometheus/grafana、vector/jaeger实现可观测性;3. 用helm封装支持多实例隔离;4. 通过operator接管自运维,统一监控与故障自愈。

用 Docker Compose 搭建云原生演进底座,关键不在“一步到位”,而在于设计可生长的结构——从单机验证起步,逐步叠加可观测性、多实例隔离、声明式运维能力。它不是替代 Kubernetes 的方案,而是微服务架构在不同阶段的务实落地方案。
从单机 Compose 开始:验证核心服务契约
这是所有演进的起点,目标是跑通服务间调用、配置注入、基础持久化和健康检查,不追求高可用,但必须清晰暴露接口契约和失败边界。
- 每个微服务单独定义 service 块,显式声明 image(带版本标签)、ports(仅暴露必要端口)、environment(区分 dev/staging 参数)
- 用 volumes 挂载配置目录(如
/config)和日志路径,避免硬编码;数据库卷挂载到宿主机固定路径,便于调试和快照 - 为每个服务添加 healthcheck,例如对 API 服务执行
curl -f http://localhost:8080/actuator/health,让depends_on真正生效 - 用 networks 定义专用桥接网络(如
backend),禁止服务直连宿主机网络,提前模拟网络隔离场景
增强可观测性:嵌入标准化采集层
云原生底座离不开统一指标、日志、链路三要素。Compose 本身不提供采集能力,但可通过 sidecar 模式低成本集成。
- 在
docker-compose.yml中加入 prometheus 和 grafana 服务,通过scrape_config自动发现同网络下的服务(利用 Compose 的 DNS 服务发现机制) - 为每个业务服务附加一个 vector 或 fluent-bit 日志收集容器,配置其从标准输出读取日志并打标(如
service: user-api),转发至 Loki 或 Elasticsearch - 引入 jaeger 或 tempo,要求所有服务启用 OpenTelemetry SDK,并将 traces 上报到该 collector;无需修改业务代码,只需注入环境变量
OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317
支持多实例与环境隔离:用 Helm 封装 Compose 逻辑
当需要部署多个相似环境(如 finance-bot、hr-bot、ops-bot),纯 Compose 难以管理差异。此时将 Compose 拆解为 Helm Chart,复用模板能力。
- 把原始
docker-compose.yml转为 Helm 的templates/deployment.yaml和templates/service.yaml,用{{ .Values.agentId }}替代硬编码名称 - 用
values.yaml控制差异化配置:知识库存储路径、允许访问的文件系统范围、是否启用 GPU 支持等 - 为每个实例生成独立命名空间(
namespace: {{ .Values.agentId }}-ns),配合 NetworkPolicy 实现跨实例网络隔离 - 保留
docker-compose.dev.yml作为本地开发覆盖文件,用于快速启动单个 agent + mock 依赖,不参与 Helm 渲染
迈向自运维:Operator 模式接管生命周期
当实例数超 20+ 或需自动扩缩容、故障自愈时,手动维护 Helm Release 成本陡增。此时引入 Kubernetes Operator 是自然延伸。
- Operator 不替代 Compose,而是将其“封装”为 Custom Resource(CR)。例如定义
AgentSet类型,字段包含replicas、configRef、storageClass - Operator 内部仍调用
helm install或直接渲染 Pod/Service 清单,但所有操作由 CR 声明驱动,支持kubectl apply -f bot.yaml创建整套服务栈 - Operator 可监听 Pod 失败事件,自动触发知识库快照备份、重置会话状态、或按策略切换备用模型 endpoint
- 所有 Agent 实例共用一套 Prometheus/Grafana/Tracing 后端,Operator 统一注入监控配置,避免重复部署采集组件











