背景信息
在离线混部的核心目标是通过将在线应用和离线应用混合部署到同一个集群中,最大程度地提高集群的资源利用率,进而降低企业的运营成本。值得注意的是,在线应用和离线应用这两种不通类型的应用对服务质量的要求是不一样,在线应用往往是延时高度敏感,对资源质量要求也更高。而离线应用则对延迟要求相对宽松,有更好的重试容错能力。针对在线应用对服务质量的要求,在离线混部实现超卖资源的同时,还需要提供稳定可靠的资源模型,减少对在线应用服务质量的影响。
资源模型
造成资源利用率低的原因有多种,比如资源碎片、流量波谷、申请高于实际的使用量等。云容器引擎的在离线混部插件支持动态检测闲置的资源,能够将这些资源有效地分配给离线应用,从而提高整个集群的资源利用效率。
闲置资源会通过扩展资源方式更新到节点信息中,提交离线应用时候可以申请使用这些闲置资源,以达到超卖资源的效果。
快速入门
介绍如何利用云容器引擎的在离线混部能力,快速部署在线应用和离线应用。
服务质量QoS
目前的服务质量QoS包括以下两个服务质量等级:
QoS等级 | 说明 |
---|---|
LS (Latency Sensitive) | 延迟敏感型,即在线服务。资源质量优先保障。 |
BE (Best Effort) | 资源消耗型,即混部对应的离线作业。 资源紧张时会受到限制或者被驱逐。 |
前提条件
已安装cube-coordinator插件,安装插件步骤请参考安装插件。
部署应用
1、部署在线应用
此处以nginx应用为例,添加延时敏感型(LS)标签。
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "nginx"
namespace: "default"
spec:
replicas: 1
selector:
matchLabels:
name: "nginx"
template:
metadata:
labels:
app: ""
ccse_app_name: ""
kubernetes.io/qos: "LS" # QoS等级设置为LS
name: "nginx"
source: "CCSE"
spec:
containers:
- image: "registry-vpc-crs-huadong1.ctyun.cn/library/nginx:alpine"
imagePullPolicy: "IfNotPresent"
name: "nginx"
resources:
limits:
cpu: "500m"
memory: "256Mi"
requests:
cpu: "500m"
memory: "256Mi"
除了可以在yaml文件中指定QoS等级,在新建工作负载页面同样可以设置,展开高级设置后即可设置QoS等级,如图:
2、部署离线应用
此处用stress镜像模拟离线应用,添加kubernetes.io/qos=BE的标签,将该应用的QoS等级设置为BE。
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "be-demo"
namespace: "default"
spec:
replicas: 1
selector:
matchLabels:
name: "be-demo"
template:
metadata:
labels:
app: ""
ccse_app_name: ""
kubernetes.io/qos: "BE" # QoS等级设置为BE
name: "be-demo"
source: "CCSE"
spec:
containers:
- image: "registry-vpc-crs-huadong1.ctyun.cn/library/stress:latest"
imagePullPolicy: "IfNotPresent"
name: "be-demo"
- args:
- '--vm'
- '1'
command:
- stress
resources:
limits:
cpu: "1"
memory: "256Mi"
requests:
cpu: "1"
memory: "256Mi"
QoS等级也可以在页面中设置,如图:
3、执行以下命令,查看Pod的运行信息
Kubectl get pod <be-demo-857bb76ddc-n69dw> -o yaml
输出信息如下,可以看到离线应用的Pod使用的是弹性闲置资源kubernetes.io/batch-cpu 和 kubernetes.io/batch-memory。
limits:
kubernetes.io/batch-cpu: "1k"
kubernetes.io/batch-memory: "256Mi"
requests:
kubernetes.io/batch-cpu: "1k"
kubernetes.io/batch-memory: "256Mi"