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 代表最大可用资源。
相关推荐
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
AIGC大时代2 小时前
LLM Agent 执行沙箱闸门:失败含义与当天最小实验
docker·沙箱·闸门·bubblewrap·llm agent
灯澜忆梦3 小时前
【docker】#2 | 基础命令
docker·容器·eureka
程序员老赵5 小时前
Docker 部署 WordPress:轻松搭建开源内容管理平台
docker·开源·wordpress
sbjdhjd6 小时前
云安全 | 从特权容器到旧版 runC:Docker 宿主机访问与运行时缺陷复盘
运维·网络安全·docker·云原生·kubernetes·云计算·云安全
Pocker_Spades_A7 小时前
Penpot自托管设计协作:Docker部署、MCP接入与Codex生成UI实操记录
ui·docker·容器
Lvan的前端笔记17 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
谢亮_vipxieliang19 小时前
Kubernetes 的“操作系统化”:从容器编排到 AI 基础设施控制平面
人工智能·平面·kubernetes
sbjdhjd1 天前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全