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 代表最大可用资源。
相关推荐
BIGmustang4 小时前
基于rancher-rke部署 k8s集群
容器·kubernetes·rancher
Cat_Rocky5 小时前
通过k8s实现单pod部署
java·容器·kubernetes
运维全栈笔记5 小时前
K8S部署WordPress+MySQL:模块化YAML配置详解
服务器·mysql·docker·云原生·容器·kubernetes·服务发现
张青贤5 小时前
linux离线部署docker和docker-compose
linux·docker·docker-compose
Zender Han6 小时前
Docker 部署 OpenClaw:从安装到日常使用的完整指南
docker·openclaw
眷蓝天6 小时前
k8s-pod资源对象实验
云原生·容器·kubernetes·pod资源对象
木雷坞6 小时前
Physical AI 数据工厂怎么落地?先把 CUDA、K8s、Quay 镜像拉取稳定下来
人工智能·容器·kubernetes
杨浦老苏7 小时前
自托管网络监控工具LanLens
网络·docker·监控·群晖
剩下了什么8 小时前
docker-compose up -d --build 和 docker-compose up -d 和 docker-compose build 区别
docker·容器·eureka