我与 celery 工人和 docker 进行了广泛的合作,但我对 Kubernetes 的了解非常基础。这是我如何通过多个 celery 任务服务器在生产中提供一些机器学习模型的架构图。 (我希望该图传达了要点,但如果有任何不清楚的地方请问我。)
基本上,用户(不一定是人类用户,而是前端客户端)将请求发送到 FastAPI 服务器(通过 uvicorn 运行)。一项 Redis 服务充当 ASGI (FastAPI) 和 celery Worker 之间的消息代理。收到任务后,最终用户会获得一个任务 ID,用它来轮询状态并获取结果。双向箭头代表发送任务参数、任务 ID、接收状态、结果等的双工数据流。
为了完整起见,这里是我用来启动所有服务并公开 FastAPI 的 Docker-compose。
version: '2'
services:
redis: # Private redis service
image: "redis:alpine"
worker: # Private workers
build:
context: .
dockerfile: ./docker/worker/Dockerfile
image: worker_image
# container_name: worker_container
depends_on:
- redis
deploy:
replicas: 3 # Replicas require unique container names
asgi: # Only container that is exposed to the user
build:
context: .
dockerfile: ./docker/asgi/Dockerfile
image: asgi_image
container_name: asgi_container
ports:
- "8080:8080" # host:container
depends_on:
- worker
工作正常。
但是 docker-compose 不提供跨不同节点的容器编排,因此我想利用水平扩展将部署转移到 Kubernetes。我希望由于组件已经容器化,所以这应该不难。但我不确定如何管理看似三层的架构,其中只有工作层需要复制。所以我需要一些关于如何编写部署、服务和入口清单的提示。
我正在使用托管 CIVO 集群(如果相关),因此基本配置不是问题。对于编曲,我的第一个想法是
但是有没有更好的方法,将所有内容都放在一个集群中?部署和服务清单应该是什么样子?
您不必为我写出完整的清单文件,但我们将真诚地感谢经验丰富的 DevOps 专家提供的一些提示。
您可以尝试使用 https://kompose.io/ 将 docker-compose 转换为 Kubernetes 清单文件。
您可能需要为
asgi_container
https://kubernetes.io/docs/concepts/services-networking/ingress/ 配置入口