diff --git a/README.md b/README.md index 7e838378ab3364f64b0d9930a3a159de468c1402..d71827c78a651dba4229b8de171c85bd56097975 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,114 @@ # rubik -#### 介绍 -rubik is a QoS manager agent for online/offline workload colocation +## 概述 -#### 软件架构 -软件架构说明 +服务器资源利用率低一直是业界公认的难题,随着云原生技术的发展,将在线离线业务混合部署成为了当下提高资源利用率的有效手段。rubik容器调度在业务混合部署的场景下,根据QoS分级,对资源进行合理调度,从而实现在保障在线业务的服务体验情况下,大幅提升资源利用率。 +rubik当前支持如下特性: -#### 安装教程 +- pod CPU优先级的配置 +- pod memory优先级的配置 -1. xxxx -2. xxxx -3. xxxx +## 编译 -#### 使用说明 +拉取源代码: -1. xxxx -2. xxxx -3. xxxx +```sh +git clone https://gitee.com/openeuler/rubik.git +``` -#### 参与贡献 +进入源码目录编译: -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +```sh +cd rubik +make +``` +制作rubik镜像 -#### 特技 +```bash +make image +``` -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +将相关部署文件安装到系统中: + +```sh +sudo make install +``` + +## 部署 + +### 环境准备 + +内核:rubik混合调度依赖内核的定制修改,需使用openeuler 21.09以上版本内核。 + +kubernetes:rubik是以DaemonSet的方式进行部署运行的,所以需要准备一个kubernetes的集群环境,建议使用1.17.0以上版本。 + +若用户想要开启内存优先级特性,需要通过设置/proc/sys/vm/memcg_qos_enable开关,有效值为0和1,其中0为默认值表示关闭特性,1表示开启特性。 + +```bash +sudo echo 1 > /proc/sys/vm/memcg_qos_enable +``` + +### rubik daemonset部署 + +在master节点上使用kubectl命令部署rubik daemonset: + +```sh +kubectl apply -f /var/lib/rubik/rubik-daemonset.yaml +``` + +## 常用配置 + +通过以上方式部署的rubik将以默认配置启动,若用户需要修改rubik的配置,可通过修改rubik-daemonset.yaml文件中的config.json部分后重新部署rubik daemonset。 + +以下介绍几个常见配置,其他配置详见docs/config.md + +### Pod优先级自动配置 + +若在rubik config中配置autoConfig为true开启了Pod自动感知配置功能,用户仅需在部署业务pod时在yaml中通过annotation指定其优先级,部署后rubik会自动感知当前节点pod的创建与更新,并根据用户配置的优先级设置pod优先级。 + +### 依赖于kubelet的Pod优先级配置 + +由于自动配置依赖于来自api-server pod创建事件的通知,具有一定的延迟性,无法在进程启动之前及时完成优先级的配置,导致业务性能可能存在抖动。用户可以关闭自动配置,通过修改kubelet,向rubik发送http请求,在更早的时间点调用rubik配置pod优先级,http接口具体使用方法详见./docs/http_API.md + +### 支持自动校对Pod优先级 + +rubik支持在启动时对当前节点Pod QoS优先级配置一致性进行校对,这里的一致性是指k8s集群中的配置和rubik对pod优先级的配置之间的一致性。可以通过config选项autoCheck控制是否开启校对功能,默认关闭。若开启校对Pod优先级功能,启动或重启rubik时,rubik会自动校验并更正当前节点pod优先级配置。 + +## 在离线业务配置示例 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx + namespace: qosexample + annotations: + volcano.sh/preemptable: "true" # volcano.sh/preemptable为true代表业务为在线业务,false代表业务为离线业务 +spec: + containers: + - name: nginx + image: nginx + resources: + limits: + memory: "200Mi" + cpu: "1" + requests: + memory: "200Mi" + cpu: "1" +``` + +## 注意事项 + +约束限制详见./docs/limitation.md + +## 如何贡献 + +我们很高兴能有新的贡献者加入! + +在一切开始之前,请签署[CLA协议](https://openeuler.org/en/cla.html) + +## 版权 + +rubik遵从**Mulan PSL v2**版权协议 \ No newline at end of file diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000000000000000000000000000000000000..3e1150a83ef1da87a7abcc859e1de014be272022 --- /dev/null +++ b/docs/config.md @@ -0,0 +1,57 @@ +# 配置 + +配置文件内容: + +```json +{ + "autoConfig": true, + "autoCheck": false, + "logDriver": "stdio", + "logDir": "/var/log/rubik", + "logSize": 1024, + "logLevel": "info", + "cgroupRoot": "/sys/fs/cgroup" +} +``` + +配置说明: + +- autoConfig: bool类型。 + + 合法值:false、true。 + + false表示关闭Pod自动感知配置功能。 + + true表示开启Pod自动感知配置功能。 + +- autoCheck:bool类型。 + + 合法值:false、true。 + + false表示关闭Pod优先级校验功能。 + + true表示开启Pod优先级校验功能。 + +- logDriver:string类型。 + + 合法值:stdio、file。 + + stdio表示直接向标准输出打印日志,日志收集和转储由调度平台完成。 + + file表示将文件打印到日志目录。 + +- logDir:string类型。 + + 日志目录。 + +- logSize:int类型。 + + 指定日志大小,单位MB;范围(1MB, 1TB)。 + +- logLevel:string类型。 + + 日志级别,合法值:debug, info, error。 + +- cgroupRoot:string类型。 + + 指定cgroup挂载点。 \ No newline at end of file diff --git a/docs/http_API.md b/docs/http_API.md new file mode 100644 index 0000000000000000000000000000000000000000..02d171ed16e1c91cc91ec9b83f593943dd610b32 --- /dev/null +++ b/docs/http_API.md @@ -0,0 +1,74 @@ +# http接口 + +rubik包含如下http接口 + +## 设置、更新Pod优先级接口 + +接口语法: + +```bash +HTTP POST /run/rubik/rubik.sock +{ + "Pods": { + "podaaa": { + "CgroupPath": "kubepods/burstable/podaaa", + "QosLevel": 0 + }, + "podbbb": { + "CgroupPath": "kubepods/burstable/podbbb", + "QosLevel": -1 + } + } +} +``` + +参数说明: + +- pods map必须提供pods。 + +- podUID map必须提供每个pod的UID。 + +- QosLevel int必须提供优先级。 + + - 0:默认值,在线业务。 + - -1:离线业务。 + - 其他:非法,不支持。 + +- CgroupPath string必须提供Pod的cgroup子路径。 + +说明: + +- 请求并发量1000QPS,并发量越界报错。 +- 单个请求pod数100个,请求数量越界报错。 + +示例如下: + +```sh +curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST --data '{"Pods": {"podaaa": {"CgroupPath": "kubepods/burstable/podaaa","QosLevel": 0},"podbbb": {"CgroupPath": "kubepods/burstable/podbbb","QosLevel": -1}}}' --unix-socket /run/rubik/rubik.sock http://localhost/ +``` + +## 探活接口 + +rubik作为HTTP服务,提供探活接口用于帮助判断rubik服务是否还在运行。 + +接口形式:HTTP/GET /ping + +示例如下: + +```sh +curl -XGET --unix-socket /run/rubik/rubik.sock http://localhost/ping +``` + +## 版本信息查询接口 + +rubik支持通过HTTP请求查询版本号。 + +接口形式:HTTP/GET /version + +示例如下: + +```sh +curl -XGET --unix-socket /run/rubik/rubik.sock http://localhost/version +{"Version":"0.0.1","Release":"1","Commit":"29910e6","BuildTime":"2021-05-12"} +``` + diff --git a/docs/limitation.md b/docs/limitation.md new file mode 100644 index 0000000000000000000000000000000000000000..fac1efc1e60f021d525433cdaa12c4c73e360707 --- /dev/null +++ b/docs/limitation.md @@ -0,0 +1,31 @@ +# 约束限制 + +- rubik接受HTTP请求并发量上限1000QPS,并发量超过上限则报错。 + +- rubik接受的单个请求中pod上限为100个,pod数量越界则报错。 + +- 每个k8s节点只能部署一个rubik,多个rubik会冲突。 + +- rubik不提供端口访问,只能通过sock通信。 + +- rubik只接收合法http请求路径及网络协议:http://localhost/(POST)、http://localhost/ping(GET)、http://localhost/version(GET)。 + +- rubik磁盘使用需求,配额1GB+。 + +- rubik内存使用需求,配额100MB+。 + +- 禁止低优先级往高优先级切换。如业务A先被设置为低优先级(-1),接着请求设置为高优先级(0),rubik报错。 + +- 容器挂载目录时,rubik本地套接字/run/rubik的目录权限需由业务侧保证最小权限(如700)。 + +- rubik服务端可用时,单个请求超时时间为120s。如果rubik进程进入T、D状态,则服务端不可用,此时服务不会响应任何请求。为了避免此情况的发生,请在客户端设置超时时间,避免无限等待。 + +- cpu和memory的在线、离线配置需要统一,否则可能导致两个子系统的QoS冲突。 + +- 使用混部后,原始的cpu share功能存在限制。具体表现为: + + 若当前cpu中同时存在在线任务和离线任务,则离线任务的cpu share无法生效。 + + 若当前cpu中只有在线任务或只有离线任务,cpu share能生效。 + +- 用户态的优先级反转、smt、cache、numa负载均衡、离线任务的负载均衡,当前不支持。 \ No newline at end of file diff --git a/hack/cluster-role-binding.yaml b/hack/cluster-role-binding.yaml deleted file mode 100644 index c1e020bddcffeda0802f3c345e348eacceea28bc..0000000000000000000000000000000000000000 --- a/hack/cluster-role-binding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: rubik -rules: - - apiGroups: [""] - resources: ["pods"] - verbs: ["list", "watch"] ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: rubik -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: rubik -subjects: - - kind: ServiceAccount - name: rubik - namespace: kube-system diff --git a/hack/rubik-daemonset.yaml b/hack/rubik-daemonset.yaml index ae27966fe68282eee9ae960c9a9915f8e031b4ba..03488b19ee2efed0dc61f50cafa3eb52419919cc 100644 --- a/hack/rubik-daemonset.yaml +++ b/hack/rubik-daemonset.yaml @@ -1,3 +1,25 @@ +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: rubik +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: ["list", "watch"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: rubik +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: rubik +subjects: + - kind: ServiceAccount + name: rubik + namespace: kube-system +--- apiVersion: v1 kind: ServiceAccount metadata: