当前位置: 代码网 > it编程>前端脚本>Python > 基于Python实现的容器编排工具

基于Python实现的容器编排工具

2026年07月31日 Python 我要评论
一、项目简介容器化已经成为后端服务交付的主流方式,但 kubernetes 这类平台的完整体系较重,对于初学者来说直接理解集群、节点、工作负载、副本数、鉴权和接口协作并不容易。本文实现一个&ldquo

一、项目简介

容器化已经成为后端服务交付的主流方式,但 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 中,适合教学项目阅读。页面分为两种状态:

  1. 未登录:展示登录/注册 tab 表单。
  2. 已登录:展示仪表盘、集群表单、节点表单、工作负载表单、资源列表和操作按钮。

前端 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. 初始化使用

  1. 注册新用户。
  2. 登录进入控制台。
  3. 创建一个集群。
  4. 为集群注册节点。
  5. 部署镜像工作负载。
  6. 使用扩容、缩容、删除按钮管理工作负载。

十、项目总结

本文完成了一个具备完整认证与鉴权的 python 全栈项目:基于 python 的容器编排工具。它使用 fastapi 构建 api,使用 sqlite 持久化资源,使用 vue 3 + vite 构建前端控制台。虽然项目没有直接对接 docker 或 kubernetes api,但已经覆盖容器编排平台最核心的业务抽象:集群、节点、工作负载、副本和状态管理。

读者可以在此基础上继续扩展:接入 docker sdk 实际创建容器、对接 kubernetes python client、增加 yaml 模板导入、加入资源监控图表、实现多租户角色权限等。这个项目非常适合作为 python 全栈、云原生入门和毕业设计原型。

以上就是基于python实现的容器编排工具的详细内容,更多关于python容器编排工具的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com