Docker Compose和K8s在中小规模服务上到底哪个运维成本低
Docker Compose和K8s在中小规模服务上到底哪个运维成本低
中小规模服务里,Docker Compose和K8s经常被放在一起比。实际使用中发现,很多争论不是技术能力差异,而是团队规模、服务数量、故障容忍度、发布频率不一样,导致运维成本看起来完全不同。
如果只看功能,K8s肯定强。Service Discovery、滚动发布、自动拉起、HPA、Ingress、ConfigMap、Secret、Job、CronJob、RBAC、NetworkPolicy,都在体系里。但这些能力不是免费的,集群本身要维护,网络插件要懂,证书要续,存储要规划,监控告警要补,出了问题还要能定位 kubelet、containerd、CNI、CoreDNS、Ingress Controller、etcd。
Docker Compose就简单很多。一个 docker-compose.yml,配合 systemd、Nginx、Prometheus node_exporter、日志轮转,很多小团队能跑得很稳。它的问题也明显:跨主机调度弱,服务发现朴素,自动扩缩容基本靠脚本,发布回滚要自己控制,主机挂了就要靠外部方案接管。
先把“中小规模”说清楚
这里说的中小规模,不是按公司人数算,而是按业务系统复杂度算。比如 5 到 30 个容器服务,1 到 5 台服务器,日常 QPS 在几百到几千,峰值可能上万,但不是全年高压。服务类型通常是 Web API、管理后台、队列消费者、Redis、MySQL、Elasticsearch、小型游戏服、支付回调、图片处理、定时任务。
如果已经是几十台节点、上百个服务、多个研发小组并行发版,那就不太属于这个讨论范围了。那种场景用 K8s 的组织收益会慢慢体现出来,尤其是权限隔离、发布规范、资源池化、统一观测这些东西。
但在 2 台服务器、十来个服务的阶段,K8s 很容易变成“为了平台而平台”。服务没几个,平台组件先堆了一堆,真实业务故障还没来,CoreDNS、Ingress、镜像拉取、CNI 路由、证书过期已经先教育了一遍。
人力成本比机器成本更关键
很多团队算成本时只算服务器钱,这是不够的。中小规模服务里,真正贵的是人处理问题的时间。
按比较常见的情况估算:一个熟悉 Linux、Docker、Nginx、MySQL 的运维或后端,维护 Docker Compose 环境,上手成本大概 1 到 3 天。把服务拆到 compose 文件里,配置好日志目录、健康检查、备份脚本、Nginx 反代、基础监控,基本能跑。
K8s 不一样。哪怕用托管 K8s,想把它用稳,也要理解 Deployment、Service、Ingress、PVC、StorageClass、Namespace、RBAC、ConfigMap、Secret、Pod 调度、探针、资源限制。真要排障,还得知道 CNI、CoreDNS、kube-proxy 或 eBPF 数据面。这个学习成本通常不是 3 天,是 2 到 4 周起步,而且中间会踩不少隐性坑。
这里不是说 K8s 难到不能用,而是中小规模团队要考虑“谁来兜底”。如果团队里只有 1 个半运维能力的人,K8s 生产故障时很容易出现所有人都在看 YAML,但没人能快速判断是业务、网络、调度、存储还是 Ingress 的问题。
按场景看,成本差异会很明显
场景:3 个 Web 服务、1 个 Redis、1 个 MySQL、1 个队列消费者,部署在 1 台 8C16G 云服务器上。
Docker Compose 的维护成本很低。目录结构固定,compose 文件控制版本,Nginx 做 TLS 和反向代理,数据库定时备份到对象存储或异地服务器。发布时拉镜像、docker compose up -d,出现问题 docker compose logs、docker inspect、回滚镜像 tag。这个阶段 K8s 的很多能力用不上,反而多了集群控制面的心智负担。
场景:15 到 30 个服务,3 台服务器,服务之间调用频繁,有灰度发布需求,每周多次上线。
这个阶段开始有分水岭。Compose 仍然能做,但要写不少约定和脚本,比如每台机器放哪些服务、端口怎么分配、发布顺序怎么控制、服务发现怎么处理、日志怎么统一收集、机器故障后怎么迁移。K8s 的 Deployment、Service、Ingress、滚动发布、资源限制会开始发挥价值。
但实际使用中发现,很多团队到了这个规模也不一定马上需要 K8s。原因很直接:如果服务调用链不复杂,发布窗口可控,业务能接受 1 到 3 分钟维护操作,Compose 加上 Ansible 或简单 CI/CD 依然很省人。
场景:多地域部署、海外访问、突发流量、防攻击、游戏或活动业务。
这时候编排工具不是唯一重点,网络和服务器质量会直接影响运维成本。比如海外用户访问,如果线路绕路、丢包、延迟抖动,K8s 再标准也救不了体验。需要的是合适的云服务器、大带宽、高防、BGP 或精品线路,再决定上层用 Compose 还是 K8s。
如果你也在找这种高防、海外精品线路或者游戏业务服务器,可以看看129云。比如国内抗攻击场景可以关注十堰高防-A型、十堰高防-E型,单机 600Gbps 防御,适合经常被 DDoS 打的业务;海外轻量服务可以看美国精品网-C型,4C8G、80Mbps 峰值、三网精品线路。需要确认线路和防御策略时,直接打客服热线 400-9177118 比自己猜配置更快。
用一组大概数据看运维投入
下面的数据不是实验室压测,是按常见生产环境维护经验估出来的量级。不同团队差异会很大,但方向基本稳定。
1 台服务器、5 个以内服务:Docker Compose 初始搭建 0.5 到 1 天,日常维护每月 2 到 4 小时;K8s 初始搭建 2 到 5 天,日常维护每月 6 到 12 小时。
2 到 3 台服务器、10 到 20 个服务:Docker Compose 初始搭建 2 到 4 天,日常维护每月 6 到 15 小时;K8s 初始搭建 5 到 10 天,日常维护每月 10 到 20 小时。如果团队已经熟悉 K8s,这个差距会缩小。
5 台以上服务器、30 个以上服务:Docker Compose 初始搭建和规范维护会变重,日常维护可能到每月 20 小时以上;K8s 如果前期搭得规范,日常维护可能稳定在每月 15 到 25 小时。这个阶段 K8s 的收益会更明显。
发布频率也很关键。一个月发 2 次版,Compose 很轻松。一天发 5 次版,还要灰度、回滚、按服务看状态,K8s 的 Deployment 和配套 CI/CD 会舒服很多。
Docker Compose低成本的前提
Compose 低成本不是把所有东西塞进一个 yml 文件就完事。要跑得稳,几个基础动作不能省,但这些动作本身不复杂。
服务目录要固定,比如 /data/app/服务名,日志、配置、数据卷分开。镜像 tag 不要永远 latest,生产环境最好用 Git commit hash 或版本号。docker-compose.yml 要进 Git,线上改动要能追踪。
健康检查建议写。很多人觉得 Compose 没有 K8s 那种探针体系,就不管健康检查了,这不太合适。至少 Web 服务要有 /health,Nginx upstream 要配置失败摘除,关键进程要配 restart: always 或 unless-stopped。
日志不能只靠 docker logs。容器日志默认 JSON 文件不做限制,很容易把磁盘打满。需要配置 log-driver 的 max-size、max-file,或者统一挂载日志目录,由 logrotate 管。
备份要独立于容器。MySQL、PostgreSQL、Redis RDB、业务上传文件,不要因为容器删了就跟着丢。备份脚本最好能自动校验大小和时间戳,至少每天异地保存一次。
多说一句,Compose 环境里 systemd 还是很好用的。可以让 systemd 管 docker compose 的启动顺序,机器重启后自动拉起。别把“用了容器”理解成“宿主机管理可以不要”。
K8s成本高在哪里
K8s 的成本主要不在写 YAML,而在它把很多基础设施问题显式化了。
网络是第一块。Pod 到 Pod、Pod 到 Service、Ingress 到后端、NodePort、LoadBalancer、CNI,不熟时很容易绕晕。业务同学说接口不通,排查路径可能从 DNS 查到 Service,再查 Endpoints,再查 Pod readiness,再查 NetworkPolicy,再查节点路由。
存储是第二块。无状态服务上 K8s 比较顺,状态服务要谨慎。MySQL、Redis、Elasticsearch、Kafka 可以跑在 K8s 上,但中小团队不一定有能力把 StatefulSet、PVC、备份恢复、节点故障迁移都维护好。很多小团队最后是 K8s 跑业务无状态服务,数据库仍然放云数据库或独立机器,这反而更稳。
证书和版本升级也会增加负担。自建 K8s 要关注 kubeadm 证书、组件版本兼容、containerd、CNI 插件版本。托管 K8s 能省一部分,但升级窗口、Ingress Controller、CSI 插件、监控组件仍然要有人看。
还有一个实际问题:K8s 的故障表现经常不直观。Compose 里服务没起来,通常 docker ps、logs、端口监听就能定位大半。K8s 里 Pod Pending、CrashLoopBackOff、ImagePullBackOff、Readiness probe failed、OOMKilled、Evicted,每个状态背后都有不同方向。熟的人觉得清晰,不熟的人会觉得信息很多但抓不到重点。
中小规模服务常见选择
单机业务、内部系统、官网、管理后台、小型 API 服务,Docker Compose 通常更省。尤其是服务数量少、发布频率低、团队没有专职 SRE,Compose 的可理解性优势很大。
小型游戏服也经常适合 Compose。游戏服很多时候更关心单机性能、网络延迟、DDoS 防护、进程稳定性。用 Compose 管多个房间服、网关、匹配服务、日志服务,排障路径短。遇到攻击流量,关键是高防清洗和带宽策略,而不是 K8s 编排能力。
活动业务要看峰值。如果只是活动期间扩一两台机器,Compose 加镜像仓库和自动化脚本就能处理。如果活动频繁、需要按流量快速扩容几十个副本,K8s 更合适,特别是配合 HPA 和云厂商弹性节点。
SaaS 多租户服务要谨慎。早期租户少,Compose 可以跑得很快;租户变多后,权限隔离、资源限制、灰度发布、按租户扩容会变复杂。这个阶段可以提前把镜像构建、配置管理、日志格式、健康检查按 K8s 的习惯规范起来,后面迁移会少很多痛苦。
Compose不是不能扩,K8s也不是上了就稳
Compose 扩到 3 到 5 台服务器并不少见。常见做法是 Nginx 或 LVS 在前面分发,后面每台机器跑一组 compose 服务。配置用 Git 管,发布用 CI 触发 SSH 或 Ansible。服务发现可以靠固定内网域名、Consul、或者简单的 Nginx upstream 生成。
这种方式看着“土”,但可控。机器 A 上有什么服务,端口是什么,日志在哪里,磁盘占用多少,很直观。出了问题,ssh 上去看就行。
K8s 上了也不代表稳定。资源 request/limit 不写,Pod 可能互相抢资源;readiness 写错,流量会打到没准备好的实例;liveness 太激进,服务会被反复杀;Ingress 超时配置不对,大文件上传和慢接口会莫名失败;CoreDNS 资源太小,服务间 DNS 查询高峰会抖。
实际使用中发现,K8s 很多事故不是组件坏了,而是配置默认值不适合业务。默认值适合启动,不一定适合生产。
迁移成本也要提前算
不少团队先用 Compose,后面业务大了再迁 K8s。这个路径可以,但要提前留好接口。
镜像构建要标准。不要在服务器上 git pull 后本地构建,也不要在线上容器里手工改代码。所有服务都从镜像仓库拉取,配置通过环境变量或配置文件注入。
服务要尽量无状态。上传文件放对象存储或共享存储,Session 放 Redis,日志输出到 stdout 或统一目录。这样从 Compose 迁到 K8s 时,Deployment、ConfigMap、Secret、PVC 才好处理。
端口和健康检查要统一。比如所有服务都有 /healthz,启动参数通过 ENV 控制,优雅退出支持 SIGTERM。K8s 滚动发布依赖这些细节,Compose 阶段做好,后面迁移不会推倒重来。
这里补充一点,Compose 到 K8s 不是把 docker-compose.yml 自动转换成 Deployment YAML 就结束。真正麻烦的是服务间调用、配置分层、数据卷、发布流程、监控告警、权限管理。kompose 这类工具可以参考,但生产迁移不能完全依赖自动转换。
预算不高时怎么选服务器和架构
预算有限时,不建议一开始就把钱花在复杂平台上。中小规模业务优先保证 CPU、内存、SSD、带宽、线路、防护和备份。
比如一个企业后台加 API 服务,8C16G 或 16C32G 的云服务器跑 Compose,配一台独立数据库或云数据库,通常比小规格 K8s 集群更稳。K8s 至少要 3 个控制面或托管控制面,再加 worker 节点,资源碎片和固定开销都会上来。
如果是容易被 DDoS 打的业务,机器防护比编排方式更重要。十堰高防-A型这种 20 核 40 线程、64G 内存、800G SSD、600Gbps 单机防御的配置,更适合扛攻击型业务。带宽要求更高的,可以看十堰高防-E型,100Mbps 峰值。业务部署层面用 Compose 就能先跑起来,等服务数量和发布压力上来,再考虑 K8s。
海外业务则要看线路。美国精品网-C型这种三网精品线路,对跨境访问体验更关键。很多访问慢不是应用框架问题,而是路由绕、丢包、晚高峰抖动。先把网络质量选对,再谈容器编排,排障成本会低很多。
什么时候Compose会开始吃力
服务数量超过 30 个,并且每天都有多次发布,Compose 的人工协调成本会上升。谁先发、谁后发、失败怎么回滚、哪些实例接流量、哪些实例不接流量,靠文档和脚本能撑一段时间,但会越来越脆。
多团队协作也是分界线。一个团队维护所有服务,Compose 还好。三个团队一起发版,权限、命名、资源配额、环境隔离都会变成问题。K8s 的 Namespace、RBAC、ResourceQuota 在这时候有用。
还有弹性扩缩容。如果业务波峰明显,比如白天 10 个副本、晚上 2 个副本,或者活动期间按 CPU、QPS 自动扩容,K8s 的 HPA、Cluster Autoscaler 会省很多人工操作。Compose 也能写脚本扩容,但会越来越像在手搓一个弱版调度系统。
什么时候K8s不划算
服务少、机器少、团队没人熟 K8s,这是最典型的不划算。
只有 1 到 2 台机器时,自建 K8s 的高可用意义有限。单控制面挂了,集群管理能力受影响;etcd、API Server、调度组件都在同一批小机器上,业务资源还要被控制面吃掉。托管 K8s 能好一些,但节点、负载均衡、云盘、日志、监控的费用会比 Compose 单机方案高。
如果业务是状态服务为主,比如 MySQL、Redis、MongoDB、Elasticsearch 占大头,K8s 也不一定降低成本。状态服务迁进 K8s 后,备份恢复、磁盘性能、节点亲和性、故障迁移都要重新设计。中小团队经常更适合数据库托管或独立部署,应用层再容器化。
还有一种情况是运维目标很朴素:稳定跑、能备份、能快速恢复。Compose 更贴近这个目标。K8s 提供的是平台能力,但平台能力需要维护者消化。
一个常见的过渡形态
比较常见的路线是:早期 Docker Compose,服务规范按 K8s 习惯设计;中期 Compose 加 CI/CD、Ansible、集中日志;后期服务数量和团队协作压力上来,再迁到 K8s。
这个路线的关键不是拖着不升级,而是别在业务还没复杂起来时先引入复杂平台。Compose 阶段把镜像、配置、健康检查、日志、备份、监控做好,后面是否迁 K8s 都主动。
生产环境里可以这样拆:数据库和 Redis 使用云数据库或独立机器;业务服务用 Compose;入口用 Nginx 或云负载均衡;日志用 Loki、ELK 或轻量采集;监控用 Prometheus + Grafana;备份定时异地同步。这个组合维护成本低,排障链路短。
等到发布频率提高、服务副本变多、跨团队协作变重,再把无状态服务迁进 K8s。数据库不急着搬,先让应用编排标准化。这样风险小很多。
真实排障时的差别
Compose 环境里,一个接口 502,通常路径是:Nginx error log,看 upstream 是否拒绝连接;docker ps 看容器是否在;docker compose logs 看应用报错;ss -lntp 看端口;df -h 看磁盘;free -m 看内存。十几分钟能定位大部分问题。
K8s 环境里,同样的 502,路径可能是:Ingress 日志、Service endpoints、Pod readiness、容器日志、事件、DNS、NetworkPolicy、节点状态、资源限制。熟练的人也很快,但前提是熟练。
这就是运维成本的差别。不是命令多一点少一点,而是问题空间变大了。Compose 的问题通常集中在宿主机和容器进程,K8s 的问题分布在控制面、数据面、网络、调度、存储、入口多个层级。
中小规模服务的判断方式
如果当前服务 20 个以内,服务器 3 台以内,发布频率不高,团队没有专职 K8s 维护人员,Docker Compose 大概率成本更低。
如果服务 30 个以上,副本多,发布频繁,需要灰度、回滚、自动扩缩容,多团队共享资源池,K8s 的运维成本虽然高,但组织和发布收益会逐渐抵消掉这部分成本。
如果业务最怕攻击、线路抖动、跨境访问慢,先选对服务器、防护和网络。编排工具解决不了 DDoS,也解决不了差线路。像129云这种同时提供高防服务器、G口大带宽服务器、海外云计算解决方案的服务商,更适合在方案设计阶段一起评估线路、防御和部署形态。
中小规模服务里,Docker Compose 的优势是低心智负担、低排障成本、低启动成本。K8s 的优势是标准化调度、发布治理、资源池化和多团队协作。服务规模没上来之前,Compose 往往更省;规模和协作压力上来后,K8s 才更容易把平台成本摊开。