k8s 容器 cpu 使用率计算公式
JSON
cpu 使用率 = (使用 / 申请) * 100 / (限制 / 申请)
PromQL 表达式
SQL
(sum(sum(irate(container_cpu_usage_seconds_total{namespace=~'namespace',pod=~'^prod.*|^prepare.*',container!='POD',image!=''}[1m])) by (namespace,pod)) by (namespace)
/
sum(sum(kube_pod_container_resource_requests{container!='POD',namespace=~'namespace',pod=~'^prod.*|^prepare.*',resource='cpu',unit='core'}) by (namespace,pod)) by (namespace))
* 100
/
(sum(sum(kube_pod_container_resource_limits{container!='POD',namespace=~'namespace',pod=~'^prod.*|^prepare.*',container!='POD',resource='cpu',unit='core'}) by (namespace,pod)) by (namespace)
/
sum(sum(kube_pod_container_resource_requests{container!='POD',namespace=~'namespace',pod=~'^prod.*|^prepare.*',container!='POD',resource='cpu',unit='core'}) by (namespace,pod)) by (namespace))
可简化为:
JSON
使用率 = (使用 / 限制) * 100
PromQL 表达式
SQL
sum(irate(container_cpu_usage_seconds_total{namespace=~'namespace',pod=~'^prod.*|^prepare.*',container!='POD',image!=''}[1m])) by (namespace)
/
sum(kube_pod_container_resource_limits{namespace=~'namespace',pod=~'^prod.*|^prepare.*',container!~'POD|checkurl-sidecar|bistoury-agent|filebeat',resource='cpu',unit='core'}) by (namespace)
* 100
名词解释
cpu 使用率指标
限制>申请, 限制>使用,申请和使用大小不确定,看实际情况。
-
使用(实际 cpu 使用量): 容器真实消耗的 cpu 核心数,通过速率计算得到。
-
表达式:
sqlsum( irate( container_cpu_usage_seconds_total{ namespace=~"namespace", pod=~'^prod.*|^prepare.*', container!="POD", image!="" }[1m] ) ) by (namespace)
-
-
申请(cpu request, 即申请量): pod 容器申请的 cpu 资源配额(调度保障值)。
-
表达式:
sqlsum( kube_pod_container_resource_requests{ namespace=~"namespace", pod=~'^prod.*|^prepare.*', container!="POD", resource="cpu", unit="core" } ) by (namespace)
-
-
限制(cpu limit / 上限值): Pod 容器允许使用的最大 cpu 资源上限。
-
表达式:
sqlsum( kube_pod_container_resource_limits{ namespace=~"namespace", pod=~'^prod.*|^prepare.*', container!="POD", resource="cpu", unit="core" } ) by (namespace)
-
申请(request)和限制(limit)的关系
- request < limit 的做法,是 k8s 实践中的常见做法,称为超配(overcommitment),可以节约资源成本。通俗理解: 物理机器 160 核,每个 pod limit 16 核,request 10 核,则一台物理机器能部署 16 个 pod。预期每个 pod 不会同时达到 16 核(即 cpu 使用率 100%),这样节约资源的同时提供正常服务。
- request < limit,无法每个 pod 都能同时使用 limit 额度的 cpu 资源。如果每个 pod 都尝试达到 16 核(即 cpu 使用率 100%),必然有 pod 实际使用的 cpu 资源小于 16 核(cpu 无法达到使用率 100%),影响这些拿不到资源的 pod 的性能。
- request = limit,pod 可以同时达到 cpu 使用率 100%,但实践中大部分时间 pod 不会达到 cpu 使用率 100%,闲置资源没有被充分利用。
- K8s 根据 request 和 limit 划分服务质量(QoS)分级:
- Guaranteed: request = limit
- Burstable: request < limit
- BestEffort: 无 request
- K8s的调度器会根据Pod的QoS类别来决定资源的分配和Pod的调度。在资源紧张的情况下,系统会优先保证 Guaranteed Pod 的资源需求,其次是 Burstable Pod ,而 BestEffort Pod 则会被牺牲。
其他 k8s 名词解释
- Kubernetes: Kubernetes(简称 k8s) 是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。应用实例基于该系统进行管理调度。
- 容器: 容器是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包到一个独立的单元中,称为容器。容器与传统虚拟机(VM)不同,容器不包含完整的操作系统,而是共享主机操作系统内核。这使得容器更加轻量级和高效,并且可以更快地启动和停止。
- docker: 是一个开源的平台,提供了一套解决方案,用于构建、运行、管理和分发容器。
- Pod: 在 k8s 中,pod 是最小调度单元,也是我们通常理解的应用实例,但 pod 是可以包含一个或多个容器的。
- sidecar: 通常 1 个 pod 中包含主容器和辅助容器,其中1个为业务容器,也就是主容器。其他为辅助容器,提供如健康监测、debug工具、日志收集等功能。k8s 中将这些辅助容器称为 sidecar 容器,辅助容器会占用部分 pod 资源。
- Resource: k8s 中容器的资源分配,如 cpu、memory,其中对这两者资源分配有两个配置,即 requests、limits,request 代表最小可用资源,limits 代表最大可用资源。