# ks-scheduler **Repository Path**: ksphere/ks-scheduler ## Basic Information - **Project Name**: ks-scheduler - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-27 - **Last Updated**: 2025-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # KS-Scheduler KS-Scheduler 是一个基于 Kubernetes 的自定义调度器扩展,为 KSphere 提供 advanced 调度能力。该项目实现了一个调度器扩展器(Scheduler Extender),通过自定义的谓词(Predicate)和优先级(Priority)函数来增强 Kubernetes 的调度决策。 ## 特性 - 🚀 **调度器扩展**: 作为 Kubernetes 调度器的扩展器,提供自定义调度逻辑 - 📊 **智能调度**: 基于历史调度数据的智能优先级算法 - 🗄️ **数据持久化**: 使用 SQLite 存储调度历史数据 - 🏷️ **标签调度**: 支持基于 Pod 标签的调度策略 - 🔄 **实时监控**: 监控指定调度器的 Pod 状态变化 - 🌐 **HTTP API**: 提供 RESTful API 接口供 Kubernetes 调度器调用 ## 架构概览 ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ Kubernetes │ │ KS-Scheduler │ │ SQLite DB │ │ kube-scheduler │───▶│ Extender │───▶│ │ │ │ │ │ │ 调度历史数据 │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ ▼ ┌──────────────────┐ │ Controller │ │ │ │ Pod 监控器 │ └──────────────────┘ ``` ## 核心组件 ### 1. 调度器扩展器 (Scheduler Extender) - **谓词函数**: `AlwaysTrue` - 总是返回 true,允许所有节点通过过滤 - **优先级函数**: `Pipeline` - 基于历史调度数据计算节点优先级 ### 2. 控制器 (Controller) - 监控使用 `ks-scheduler` 调度器的 Pod - 记录 Pod 到节点的调度历史 - 更新 SQLite 数据库中的调度统计信息 ### 3. 数据存储 (SQLite) - 存储调度器键与节点的映射关系 - 记录每个键-节点对的调度次数 - 为优先级算法提供数据支持 ## 快速开始 ### 前置要求 - Go 1.12+ - Kubernetes 1.13+ - SQLite 3 ### 安装部署 1. **克隆项目** ```bash git clone https://gitee.com/ksphere/ks-scheduler.git cd ks-scheduler ``` 2. **构建二进制文件** ```bash make manager ``` 3. **构建 Docker 镜像** ```bash make docker-build IMG=your-registry/ks-scheduler:v1 make docker-push IMG=your-registry/ks-scheduler:v1 ``` 4. **部署到 Kubernetes** ```bash # 修改 deploy/ks-scheduler.yaml 中的镜像地址 kubectl apply -f deploy/ks-scheduler.yaml ``` ### 本地开发 1. **安装依赖** ```bash make install-travis ``` 2. **运行测试** ```bash make test ``` 3. **本地运行** ```bash make run ``` ## 使用指南 ### Pod 标签配置 要让 Pod 使用 KS-Scheduler 进行调度,需要添加以下标签和注解: ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod labels: ks-pipeline: "pipeline1" # 调度器标识 spec: schedulerName: ks-scheduler # 指定使用 ks-scheduler containers: - name: app image: nginx ``` ### 调度策略 1. **标签调度**: 基于 `ks-pipeline` 标签识别需要特殊调度的 Pod 2. **历史优先级**: 根据历史调度次数,优先选择经常使用的节点 3. **负载均衡**: 通过优先级算法实现简单的负载均衡效果 ## API 接口 KS-Scheduler 提供 HTTP API 接口供 Kubernetes 调度器调用: ### 谓词接口 - **URL**: `POST /scheduler/predicates/alwaystrue` - **功能**: 过滤节点,总是返回所有可用节点 ### 优先级接口 - **URL**: `POST /scheduler/priorities/pipeline` - **功能**: 基于历史数据为节点打分 ### 版本接口 - **URL**: `GET /version` - **功能**: 返回调度器版本信息 ## 配置说明 ### 环境变量 - `DATA_PATH`: SQLite 数据库文件路径 (默认: `/data/scheduler.db`) - `VERSION`: 调度器版本信息 ### 调度器配置 通过 ConfigMap `ks-scheduler-config` 配置调度器参数: ```yaml apiVersion: kubescheduler.config.k8s.io/v1alpha1 kind: KubeSchedulerConfiguration schedulerName: ks-scheduler algorithmSource: policy: configMap: namespace: ksphere-system name: ks-scheduler-policy ``` ### 策略配置 通过 ConfigMap `ks-scheduler-policy` 定义调度策略: ```json { "kind": "Policy", "apiVersion": "v1", "predicates": [ {"name": "PodFitsHostPorts"}, {"name": "PodFitsResources"} ], "priorities": [ {"name": "LeastRequestedPriority", "weight": 1} ], "extenders": [{ "urlPrefix": "http://localhost:8080/scheduler", "filterVerb": "predicates/alwaystrue", "prioritizeVerb": "priorities/pipeline", "weight": 3 }] } ``` ## 开发指南 ### 项目结构 ``` ks-scheduler/ ├── cmd/ # 入口文件 ├── pkg/ │ ├── controller/ # Pod 控制器 │ ├── predicate/ # 谓词函数 │ ├── prioritize/ # 优先级函数 │ ├── routes/ # HTTP 路由 │ ├── sqlite/ # 数据库操作 │ └── util/ # 工具函数 ├── deploy/ # 部署配置 ├── test/ # 测试文件 └── hack/ # 构建脚本 ``` ### 添加新的调度算法 1. **谓词函数**: 在 `pkg/predicate/` 目录下添加新的谓词逻辑 2. **优先级函数**: 在 `pkg/prioritize/` 目录下实现新的优先级算法 3. **注册函数**: 在 `pkg/run/run.go` 中注册新的函数 ### 数据库模型 KS-Scheduler 使用 SQLite 存储,主要数据结构: ```go type KeyNode struct { ID int `json:"id"` Key string `json:"key"` Node string `json:"node"` Count int `json:"count"` } ``` ## 监控和日志 ### 日志级别 - 使用 `--v=5` 参数启用详细日志 - 支持 `--logtostderr=true` 输出到标准错误 ### 监控指标 - Pod 调度事件 - 数据库操作记录 - HTTP 请求日志 ## 故障排查 ### 常见问题 1. **调度器无法启动** - 检查 RBAC 权限配置 - 确认 ServiceAccount 正确绑定 2. **Pod 无法调度** - 检查 Pod 是否包含 `ks-pipeline` 标签 - 确认 `schedulerName` 设置为 `ks-scheduler` 3. **数据库连接失败** - 检查数据库文件路径 - 确认目录权限 ### 日志查看 ```bash # 查看调度器日志 kubectl logs -n ksphere-system deployment/ks-scheduler ks-scheduler-pipeline # 查看 kube-scheduler 日志 kubectl logs -n kube-system pod/ ``` ## 贡献指南 欢迎提交 Issue 和 Pull Request! 1. Fork 项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ## 许可证 本项目采用 Apache License 2.0 许可证。详情请参见 [LICENSE](LICENSE) 文件。 ## 联系方式 - 项目地址: https://gitee.com/ksphere/ks-scheduler - Issue: https://gitee.com/ksphere/ks-scheduler/issues --- **注意**: 这是一个 KSphere 生态系统的组件,建议在 KSphere 环境中使用。