k8s 容器 cpu 概念

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 使用率指标

限制>申请, 限制>使用,申请和使用大小不确定,看实际情况。

  1. 使用(实际 cpu 使用量): 容器真实消耗的 cpu 核心数,通过速率计算得到。

    1. 表达式:

      sql 复制代码
      sum(
        irate(
          container_cpu_usage_seconds_total{
            namespace=~"namespace",
            pod=~'^prod.*|^prepare.*',
            container!="POD",
            image!=""
          }[1m]
        )
      ) by (namespace)
  2. 申请(cpu request, 即申请量): pod 容器申请的 cpu 资源配额(调度保障值)。

    1. 表达式:

      sql 复制代码
      sum(
        kube_pod_container_resource_requests{
          namespace=~"namespace",
          pod=~'^prod.*|^prepare.*',
          container!="POD",
          resource="cpu",
          unit="core"
        }
      ) by (namespace)
  3. 限制(cpu limit / 上限值): Pod 容器允许使用的最大 cpu 资源上限。

    1. 表达式:

      sql 复制代码
      sum(
        kube_pod_container_resource_limits{
          namespace=~"namespace",
          pod=~'^prod.*|^prepare.*',
          container!="POD",
          resource="cpu",
          unit="core"
        }
      ) by (namespace)

申请(request)和限制(limit)的关系

  1. request < limit 的做法,是 k8s 实践中的常见做法,称为超配(overcommitment),可以节约资源成本。通俗理解: 物理机器 160 核,每个 pod limit 16 核,request 10 核,则一台物理机器能部署 16 个 pod。预期每个 pod 不会同时达到 16 核(即 cpu 使用率 100%),这样节约资源的同时提供正常服务。
  2. request < limit,无法每个 pod 都能同时使用 limit 额度的 cpu 资源。如果每个 pod 都尝试达到 16 核(即 cpu 使用率 100%),必然有 pod 实际使用的 cpu 资源小于 16 核(cpu 无法达到使用率 100%),影响这些拿不到资源的 pod 的性能。
  3. request = limit,pod 可以同时达到 cpu 使用率 100%,但实践中大部分时间 pod 不会达到 cpu 使用率 100%,闲置资源没有被充分利用。
  4. K8s 根据 request 和 limit 划分服务质量(QoS)分级:
    1. Guaranteed: request = limit
    2. Burstable: request < limit
    3. BestEffort: 无 request
    4. K8s的调度器会根据Pod的QoS类别来决定资源的分配和Pod的调度。在资源紧张的情况下,系统会优先保证 Guaranteed Pod 的资源需求,其次是 Burstable Pod ,而 BestEffort Pod 则会被牺牲。

其他 k8s 名词解释

  1. Kubernetes: Kubernetes(简称 k8s) 是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。应用实例基于该系统进行管理调度。
  2. 容器: 容器是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包到一个独立的单元中,称为容器。容器与传统虚拟机(VM)不同,容器不包含完整的操作系统,而是共享主机操作系统内核。这使得容器更加轻量级和高效,并且可以更快地启动和停止。
  3. docker: 是一个开源的平台,提供了一套解决方案,用于构建、运行、管理和分发容器。
  4. Pod: 在 k8s 中,pod 是最小调度单元,也是我们通常理解的应用实例,但 pod 是可以包含一个或多个容器的。
  5. sidecar: 通常 1 个 pod 中包含主容器和辅助容器,其中1个为业务容器,也就是主容器。其他为辅助容器,提供如健康监测、debug工具、日志收集等功能。k8s 中将这些辅助容器称为 sidecar 容器,辅助容器会占用部分 pod 资源。
  6. Resource: k8s 中容器的资源分配,如 cpu、memory,其中对这两者资源分配有两个配置,即 requests、limits,request 代表最小可用资源,limits 代表最大可用资源。
相关推荐
harmony&30 分钟前
ETCD 存储系统实战:从单节点部署到 Kubernetes 高可用集群
数据库·kubernetes·etcd
随便做点啥2 小时前
32卡-64G-910B4-16后端-(Qwen3.8-27B-W8A8)集群部署报告
运维·服务器·经验分享·docker·vllm
CJY6218 小时前
k8spod管理
云原生·容器·kubernetes
Orange_sparkle10 小时前
从 Docker 到 Doris:建立后端基础设施全景图
运维·docker·ai·容器·claude code
gx234812 小时前
控制器管理
docker·容器·kubernetes
白清羽13 小时前
7.3系统安装docker
运维·docker·容器
dazhong201215 小时前
Docker 入门篇(八)-- CentOS7 安装 MySQL 8
mysql·docker·容器
w2005122415 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
典典分享指南17 小时前
用大模型把写作 SOP 变成可复用 Prompt
docker·jupyter·eclipse·phpstorm·myeclipse
sryyd_0217 小时前
Kubernetes Pod 管理从入门到实战:命令、YAML 与生命周期全解析
云原生·容器·kubernetes