注意:QoS 相关的能力仅支持在 原生节点 上使用,若你的节点不是原生节点,或工作负载不在原生节点上,相关能力无法生效。
一、部署在集群内的 Kubernetes 对象
| Kubernetes 对象名称 | 类型 | 默认占用资源 | 所属 Namespaces |
| avoidanceactions.ensurance.crane.io | CustomResourceDefinition | – | – |
| nodeqoss.ensurance.crane.io | CustomResourceDefinition | – | – |
| podqoss.ensurance.crane.io | CustomResourceDefinition | – | – |
| timeseriespredictions.prediction.crane.io | CustomResourceDefinition | – | – |
| kube-system | Namespace | – | – |
| all-be-pods | PodQOS | – | kube-system |
| qos-agent | ClusterRole | – | – |
| qos-agent | ClusterRoleBinding | – | – |
| crane-agent | Service | – | kube-system |
| qos-agent | ServiceAccount | – | kube-system |
| qos-agent | Daemonset | – | kube-system |
二、功能说明
| 功能 | 说明 |
| CPU 使用优先级 | CPU 使用优先级的功能可以通过对工作负载设置优先级,保证高优先级业务在发生资源竞争时的资源供给量,并压制低优先级业务。详情见 CPU 使用优先级。 |
| CPU Burst | CPU Burst 可以临时给延迟敏感型应用提供超过 Limit 数量的资源,保证其稳定性。详情见 CPU Burst。 |
| CPU 超线程隔离 | 避免高优先级容器线程的 L2 Cache 受到运行在同一个 CPU 物理核上的低优先级线程的影响。详情见 CPU 超线程隔离。 |
| 内存 QoS 增强 | 全方位提升内存表现,以及灵活限制容器对内存的使用。详情见 内存 QoS 增强。 |
| 网络 QoS 增强 | 全方位提升网络表现,以及灵活限制容器对网络的使用。详情见 网络 QoS 增强。 |
| 磁盘 IO QoS 增强 | 全方位提升磁盘表现,以及灵活限制容器对磁盘的使用。详情见 磁盘 IO QoS 增强。 |
三、QoS Agent 权限
注意:说明:
注意:权限场景章节中仅列举了组件核心功能涉及到的相关权限,完整权限列表请参考权限定义章节。
四、权限说明
该组件权限是当前功能实现的最小权限依赖。
五、权限场景
| 功能 | 涉及对象 | 涉及操作权限 |
| 读取 podqos、nodeqos、时间序列等配置。 | podqoss / nodeqoss / avoidanceactions | get/list/watch/update |
| 查看当前节点的 pod 信息。 | pod | get/list/watch |
| 根据 Podqos 开启隔离能力 / 修改 node resource 以增加离线资源。 | pod status | update/patch |
| 给 node 添加污点。 | node | get/list/watch/update |
| 根据隔离开启情况、资源干扰情况发送 event。 | event | 所有权限 |
六、权限定义
rules: – apiGroups: – "" resources: – pods verbs: – get – list – watch – apiGroups: – "" resources: – pods/status verbs: – update – patch – apiGroups: – "" resources: – nodes verbs: – get – list – watch – update – apiGroups: – "" resources: – nodes/status – nodes/finalizers verbs: – update – patch – apiGroups: – "" resources: – pods/eviction verbs: – create – apiGroups: – "" resources: – configmaps verbs: – get – list – watch – apiGroups: – "" resources: – events verbs: – "*" – apiGroups: – "ensurance.crane.io" resources: – podqoss – nodeqoss – avoidanceactions verbs: – get – list – watch – update – apiGroups: – "prediction.crane.io" resources: – timeseriespredictions – timeseriespredictions/finalizers verbs: – get – list – watch – create – update – patch – apiGroups: – "topology.crane.io" resources: – "noderesourcetopologies" verbs: – get – list – watch – create – update – patch
七、部署方式
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。
4. 在新建组件管理页面中勾选 QoS Agent。
5. 单击完成即可安装组件。
注意:在部署完成之后,因为集群的 cgroup 驱动可能不同,需要你手动选择对应的驱动。操作方式如下:
注意:1. 在集群里的扩展组件里,找到部署成功的 QoS Agent,单击右侧的更新配置。
注意:2. 在修改 QoS Agent 的组件配置页面,选择 cgroupDrive 选项右侧的下拉框,选择与自己集群匹配的 cgroupDrive。
注意:3. 单击完成。
八、如何确认自己集群的 cgroupDrive?
集群的 cgroupDrive 只可能是 cgroupfs 或 systemd。确认方式如下:
首先查看集群的运行时,可以在集群的“基本信息”页里的“运行时组件”判断当前集群是 docker 还是 containerd。
如果运行时是 docker 的话,在集群的任意节点上执行 docker info 查看 Cgroup Driver 的字段内容。
如果运行时是 containerd,在集群的任意节点的 /etc/containerd/config.toml 文件里,如果字段:SystemdCgroup = true,代表是 systemd,否则是 cgroup。
九、如何选择作用的业务或者节点?
支持通过 label 或者 scope 选择某种资源对象。
注意:当同时存在下面两种 selector 的时候,会取“与”,也即满足所有条件。
十、labelSelector
labelSelector 通过关联资源对象的 label 对资源对象进行筛选,常用的使用方式是,业务侧在指定的工作负载上打上特定的标签,并将该标签提供给运维侧,运维在创建 PodQOS 时通过 labelSelector 字段关联该标签,即可赋予不同的业务不同的 QoS 能力。
十一、scopeSelector
scopeSelector 由多个 MatchExpressions 组成,这些 MatchExpressions 之间是“与”的关系,MatchExpressions 中有三个字段,分别是 ScopeName,Operator 和 ScopeName 对应的 Values;
其中 ScopeName 包括 QOSClass,Priority,Namespace 三种;
·QOSClass 是指希望关联具有特定的 QOSClass 的 Workload,Values 可以填:Guaranteed,Burstable,BestEffort 中的一种或多种;
·Priority 是指希望关联具有特定的 Priority 的 workload,Values 可以填特定的 priority 数值,如["1000", "2000-3000"],支持 priority 范围;
·Namespace 是指希望关联特定的 Namespace 的 Workload,Values 可以填一个或多个。
Operator 包含两种,分别是 In 和 NotIn,不填默认为 In。
如下述示例,表示将满足 app-type=offline 的 BestEffortPod,CPU 优先级设置为7:
apiVersion: ensurance.crane.io/v1alpha1kind: PodQOSmetadata: name: offline-taskspec: allowedActions: – eviction resourceQOS: cpuQOS: cpuPriority: 7 scopeSelector: matchExpressions: – operator: In scopeName: QOSClass values: – BestEffort labelSelector: matchLabels: app-type: offline