容器与云原生

K8s pod 副本与 Uvicorn Workers

JACIN··5 分钟阅读

Pod 是“横向扩展(多进程/多机器)”,Uvicorn Worker 是“纵向扩展(单容器多进程)”。

核心区别

特性K8s Pod 副本 (Replicas)FastAPI/Uvicorn Workers
层级容器级(由 K8s 管理)进程级(由 Python 管理)
隔离性强隔离。每个 Pod 有独立内存、网络栈、文件系统。弱隔离。多个进程共享同一个容器的内存和 CPU 限制。
资源分配可以给每个 Pod 分配独立的 CPU/内存限制。争抢同一个容器分配到的资源。
稳定性一个 Pod 崩溃不会影响其他 Pod。如果容器 OOM(内存溢出),所有 Worker 一起死。
负载均衡由 K8s Service 处理(网络层)。由 Uvicorn 主进程分发(应用层)。

不论是 Uvicorn 的 workers=4,还是 K8s 的 3 个 Pod,它们都是独立的 Python 进程

  • 只要是进程(Process),每个进程都有自己独立的 Python 解释器和独立的内存空间。
  • 因此: 无论是单 Pod 多 Worker,还是多 Pod,都不会受到 GIL 的限制。它们都能实现真正的多核并行计算。

性能表现不同,且受限于你的“容器限制(Resources)”。

情况 A:如果你把 Workers 写在代码里(单 Pod 多进程)

如果你给一个 Pod 分配了 2 核 CPU,然后在里面开了 workers=4

  • 这 4 个 Python 进程会互相争抢这 2 核 CPU。
  • 优点:内部切换非常快,上下文开销小。
  • 缺点:Python 有 GIL(全局解释器锁)的残余影响(虽然多进程规避了 GIL,但管理开销仍存在)。如果一个请求把 CPU 占满了,其他 Worker 会感到卡顿。

情况 B:如果你用 K8s 的副本(多 Pod 单进程)

如果你开了 4 个副本,每个副本 workers=1,且给每个 Pod 分配 0.5 核 CPU:

  • 每个 Worker 都有保底的资源。
  • 优点:真正的硬件级并行。如果某个 Pod 内部发生死锁或内存泄露,只会死掉 1/4 的能力,K8s 会立即重启它,不会波及他人。
维度单 Pod + 多 Workers多 Pod + 单 Worker
启动速度。启动 1 个容器后,Python 内部 Fork 进程非常快。慢一点。K8s 需要拉取镜像、分配网络、创建容器。
内存开销。多进程会共享一些只读的系统库内存(Copy-on-Write)。。每个 Pod 都要运行一个完整的 Alpine 系统基础环境和 Python 运行时。
稳定性一般。容器崩了全崩。极高。分布在不同节点,具备容灾能力。
水平扩展有上限。受限于单台服务器的 CPU 核数。无上限。可以扩展到成百上千台服务器。

评论

还没有评论,来发第一个吧