基于Python实现的容器编排工具
一、项目简介
容器化已经成为后端服务交付的主流方式,但 Kubernetes 这类平台的完整体系较重,对于初学者来说直接理解集群、节点、工作负载、副本数、鉴权和接口协作并不容易。本文实现一个“基于 Python 的容器编排工具”全栈项目,用较轻量的方式模拟容器编排平台的核心流程:用户注册登录、创建集群、注册节点、部署工作负载、扩缩容和删除服务。
项目定位不是替代 Kubernetes,而是帮助读者掌握容器编排系统的基础业务建模和全栈落地方法。后端使用 FastAPI 提供 RESTful API,SQLite 存储数据,前端使用 Vue 3 + Vite 构建管理控制台。
二、技术栈
- 后端框架:FastAPI
- 数据库:SQLite
- ORM:SQLAlchemy
- 数据校验:Pydantic
- 认证方案:密码哈希 + JWT Bearer Token
- 前端框架:Vue 3
- 前端构建工具:Vite
- 接口通信:Fetch API 封装
- 部署方式:后端 Uvicorn,前端 Vite 开发服务或构建后静态部署
三、系统架构
系统采用前后端分离架构:
浏览器 Vue 3 控制台
|
| HTTP + Bearer Token
v
FastAPI REST API
|
| SQLAlchemy ORM
v
SQLite 数据库
后端负责用户认证、资源权限校验、集群/节点/工作负载管理;前端负责登录状态维护、表单录入、资源列表展示和扩缩容操作。每个用户只能看到并管理自己创建的集群资源。
四、功能模块
1. 用户认证模块
- 用户注册
- 用户登录
- 密码哈希存储
- JWT Token 签发
- 登录状态查询
- 核心业务接口鉴权保护
2. 集群管理模块
- 创建集群
- 查看当前用户的集群列表
- 保存集群区域、API Server 地址和状态
3. 节点管理模块
- 为指定集群注册节点
- 记录节点 IP、CPU、内存和状态
- 展示节点资源池
4. 工作负载模块
- 部署镜像工作负载
- 设置副本数
- 模拟运行状态
- 支持扩容、缩容和停止
- 支持删除工作负载
5. 仪表盘模块
- 展示集群数量
- 展示节点数量
- 展示工作负载总数
- 展示运行中工作负载数量
五、数据库/数据模型设计
本项目使用 SQLite,核心表如下:
| 表名 | 说明 |
|---|---|
| users | 用户表,保存账号、邮箱、密码哈希 |
| clusters | 集群表,保存集群名称、区域、API 地址、所属用户 |
| nodes | 节点表,保存节点 IP、CPU、内存、所属集群 |
| workloads | 工作负载表,保存应用名称、镜像、副本数、状态 |
models.py 中的用户模型示例:
class User(Base):
__tablename__ = "users"
id = mapped_column(Integer, primary_key=True, index=True)
username = mapped_column(String(50), unique=True, index=True, nullable=False)
email = mapped_column(String(120), unique=True, index=True, nullable=False)
hashed_password = mapped_column(String(255), nullable=False)
集群通过 owner_id 关联用户,节点和工作负载通过 cluster_id 关联集群,这样可以自然地实现用户级资源隔离。
六、后端接口设计
后端接口统一以 /api 开头:
| 方法 | 路径 | 说明 | 是否鉴权 |
|---|---|---|---|
| POST | /api/auth/register | 注册用户 | 否 |
| POST | /api/auth/login | 登录获取 Token | 否 |
| GET | /api/auth/me | 当前用户信息 | 是 |
| GET | /api/dashboard | 仪表盘统计 | 是 |
| POST | /api/clusters | 创建集群 | 是 |
| GET | /api/clusters | 查询集群 | 是 |
| POST | /api/clusters/{id}/nodes | 注册节点 | 是 |
| GET | /api/nodes | 查询节点 | 是 |
| POST | /api/workloads | 部署工作负载 | 是 |
| GET | /api/workloads | 查询工作负载 | 是 |
| PATCH | /api/workloads/{id}/scale | 扩缩容 | 是 |
| DELETE | /api/workloads/{id} | 删除工作负载 | 是 |
接口鉴权核心是 FastAPI 依赖注入:
def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
payload = decode_access_token(token)
if not payload or not payload.get("sub"):
raise HTTPException(status_code=401, detail="登录已失效")
user = crud.get_user_by_username(db, payload["sub"])
if not user:
raise HTTPException(status_code=401, detail="用户不存在")
return user
业务接口只要声明 current_user: models.User = Depends(get_current_user),就能自动要求前端携带 Bearer Token。
七、前端页面设计
前端使用 Vue 3 + Vite,主要页面集中在 App.vue 中,适合教学项目阅读。页面分为两种状态:
- 未登录:展示登录/注册 Tab 表单。
- 已登录:展示仪表盘、集群表单、节点表单、工作负载表单、资源列表和操作按钮。
前端 API 封装在 src/api.js:
async function request(path, options = {}) {
const headers = { 'Content-Type': 'application/json', ...(options.headers || {}) }
const token = getToken()
if (token) headers.Authorization = `Bearer ${token}`
const resp = await fetch(`${API_BASE}${path}`, { ...options, headers })
const data = await resp.json()
if (!resp.ok) throw new Error(data?.detail || '请求失败')
return data
}
登录成功后将 Token 存入 localStorage,之后所有鉴权请求都会自动带上 Authorization 头。
八、核心代码讲解
1. 密码哈希与 Token
security.py 使用 passlib 对密码进行哈希,避免明文保存密码:
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def get_password_hash(password: str) -> str:
return pwd_context.hash(password)
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
登录成功后,后端创建 JWT:
def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str:
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
2. 工作负载部署
工作负载部署并不真正启动容器,而是模拟编排平台的声明式状态:
def create_workload(db: Session, workload: schemas.WorkloadCreate):
db_workload = models.Workload(
cluster_id=workload.cluster_id,
name=workload.name,
image=workload.image,
replicas=workload.replicas,
desired_replicas=workload.replicas,
status="Running",
)
db.add(db_workload)
db.commit()
db.refresh(db_workload)
return db_workload
当用户扩缩容时,系统更新实际副本和期望副本,并根据副本数判断状态:
def scale_workload(db: Session, workload: models.Workload, replicas: int):
workload.desired_replicas = replicas
workload.replicas = replicas
workload.status = "Stopped" if replicas == 0 else "Running"
db.commit()
db.refresh(workload)
return workload
3. 前端扩缩容交互
Vue 页面通过按钮调用后端接口:
async function scale(w, replicas) {
await api.scaleWorkload(w.id, replicas)
await loadAll()
}
操作完成后重新加载仪表盘、节点和工作负载列表,保证页面状态与后端一致。
九、部署与运行步骤
1. 启动后端
cd project/backend python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
后端默认地址为:http://127.0.0.1:8000。
2. 启动前端
cd project/frontend npm install npm run dev
前端默认会请求:http://127.0.0.1:8000/api。浏览器打开 Vite 输出的地址,通常是 http://127.0.0.1:5173。
3. 初始化使用
- 注册新用户。
- 登录进入控制台。
- 创建一个集群。
- 为集群注册节点。
- 部署镜像工作负载。
- 使用扩容、缩容、删除按钮管理工作负载。
十、项目总结
本文完成了一个具备完整认证与鉴权的 Python 全栈项目:基于 Python 的容器编排工具。它使用 FastAPI 构建 API,使用 SQLite 持久化资源,使用 Vue 3 + Vite 构建前端控制台。虽然项目没有直接对接 Docker 或 Kubernetes API,但已经覆盖容器编排平台最核心的业务抽象:集群、节点、工作负载、副本和状态管理。
读者可以在此基础上继续扩展:接入 Docker SDK 实际创建容器、对接 Kubernetes Python Client、增加 YAML 模板导入、加入资源监控图表、实现多租户角色权限等。这个项目非常适合作为 Python 全栈、云原生入门和毕业设计原型。
以上就是基于Python实现的容器编排工具的详细内容,更多关于Python容器编排工具的资料请关注脚本之家其它相关文章!
相关文章
VScode查看python f.write()的文件乱码问题及解决方法
这篇文章主要介绍了VScode查看python f.write()的文件乱码问题及解决方法,本文通过图文并茂的形式给大家分享解决方法,需要的朋友可以参考下2023-02-02
PyQt5实现QLineEdit添加clicked信号的方法
今天小编就为大家分享一篇PyQt5实现QLineEdit添加clicked信号的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2019-06-06


最新评论