简介
在通常情况下,应用程序在发布或重启过程中可能会出现 CPU 使用率波动增高,甚至可以消耗掉集群所有资源的现象。这主要是因为在应用程序启动时,Java虚拟机(JVM)需要重新进行类加载和对象初始化操作,导致 CPU 在整个过程中承担更多的编译任务。
在 Kubernetes 的场景中,应用程序都是通过 Pod 中的容器部署,每个容器都可以设置 Request 和 Limit 来控制资源使用的下限和上限。如果 Limit 设置的过低,就容易导致上述应用启动缓慢,甚至因为资源不够无法启动;如果 Limit 设置得过高,那后续在应用的运行过程中,又容易使用过量资源,与其他应用形成资源竞争关系。
功能说明
使用方式
设置应用的启动时间,以及 Limit 扩大的倍数,在应用启动的初始阶段增加应用使用资源的上限。
注意事项
业务启动时资源突增的能力依赖原生节点的内核,该功能仅支持在 原生节点 中使用。
在使用该功能之前,需要提前安装 QoS Agent。确保 QoS Agent 组件版本在1.1.4及以上。
功能原理
在 Kubernetes 中,资源限制(Limit)是通过 CPU cgroup 控制模块中的 cpu.cfs_period_us 和 cpu.cfs_quota_us 两个配置来实现的。Kubernetes 会为容器的 cgroup 配置这两个信息。通过调整 Pod 所在节点的 cgroup 中 cpu.cfs_quota_us 的数值,实现临时资源突增,从而增加应用在启动阶段的资源使用上限。
使用方式
安装组件
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。
4. 在新建组件管理页面中勾选 QoS Agent。
5. 单击完成即可安装组件。
开启应用启动时资源突增能力
1. 在组件管理页面,查看 QoS Agent 组件版本。确保 QoS Agent 组件版本在1.1.4及以上。如果版本低于此要求,请单击组件右侧的升级进行升级。如下图所示:
2. 通过 kubectl 创建 PodQoS CRD 对象,将其应用到需要启动突增的工作负载上。示例代码如下:
apiVersion: ensurance.crane.io/v1alpha1kind: PodQOSmetadata:name: exceedspec:labelSelector:matchLabels:app: 0kusa3 # 匹配到需要启动突增的工作负载上的标签resourceQOS:cpuQOS:limitExceed:time: 5 # 应用启动多长时间需要突增 Limit。单位:minsvalue: "1.2" # Limit 突增的倍数
3. 创建工作负载。示例代码如下:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: 0kusa3 # 和 PodQoS 对象中的 matchLabels 要保持一致spec:replicas: 3selector:matchLabels:app: 0kusa3template:metadata:labels:app: 0kusa3spec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80
4. 登录 Pod 所在节点,在节点上查看容器对应的 cfs_quota 数值。
路径:
/sys/fs/cgroup/cpu/kubepods/burstble/pod<id>/<containerid>/cpu.cfs_quota_us
示例:
/sys/fs/cgroup/cpu/kubepods/burstable/pod44ad741a-cbe6-48a2-a5b7-b6920df2fe40/645a0a88f23c2aca4b207ec2c3d83bbe760a5f2a4db812938042df5cb5054e18/cpu.cfs_quota_us
其中:
pod<id>:<id>来自 Pod YAML 中的 UID 字段。
<containerid>:来自 Pod YAML 中的 containerID 字段。
在创建 PodQoS 之前,cpu.cfs_quota_us 的值为 cpu.cfs_period_us * Limit,例如:100000 * 0.5核 = 50000。
在创建 PodQoS 之后,当 Pod 重建后的前 5 分钟内,新的 cpu.cfs_quota_us 值为旧值乘以 1.2,即 Limit 被放大了。
注意:
Pod 重建后 Pod ID 会变化。