资源使用

资源使用配置 #

本文档将指导你如何模拟 Pod 的资源使用。

什么是资源使用? #

ResourceUsage 是一个 kwok 配置,允许用户定义和模拟单个 Pod 的资源使用。

下面的 YAML 显示了 ResourceUsage 资源的所有字段

kind: ResourceUsage
apiVersion: kwok.x-k8s.io/v1alpha1
metadata:
  name: <string>
  namespace: <string>
spec:
  usages:
  - containers:
    - <string>
    usage:
      cpu:
        value: <quantity>
        expression: <string>
      memory:
        value: <quantity>
        expression: <string>

要将 ResourceUsage 与要模拟的特定 Pod 关联,用户必须确保 metadata.namemetadata.namespace 与目标 Pod 的名称和命名空间不一致。

Pod 的资源使用通过 usages 字段指定。usages 字段按组组织,每个组对应于共享相同资源使用模拟设置的一组容器。每个组由容器名称列表(containers)和共享的资源使用设置(usage)组成。

如果未在组中给出 containers,则该组中的 usage 将应用于目标 Pod 的所有容器。

您可以简单地通过 cpu.valuememory.value 设置一个静态的 数量值100Mi1000m 等)来分别定义 CPU 和内存资源使用量。此外,用户还可以通过 expressions 提供一个 CEL 表达式 来更灵活地描述资源使用量。例如,以下表达式尝试从 Pod 的注释(如果有)中提取 CPU 资源使用量,或使用默认值。

expression: |
  "kwok.x-k8s.io/usage-cpu" in pod.metadata.annotations
  ? Quantity(pod.metadata.annotations["kwok.x-k8s.io/usage-cpu"])
  : Quantity("1m")  
  1. 如果同时设置了 valueexpressions,则 value 的优先级高于 expressions
  2. 在 CEL 表达式中,数量值必须显式地用 Quantity 函数包装。

使用 CEL 表达式,甚至可以动态模拟资源使用量。例如,以下表达式生成随时间线性增长的内存使用量。

expression: (pod.SinceSecond() / 60.0) * Quantity("1Mi")

请参阅 kwok 中的 CEL 表达式,了解可能有助于配置动态资源使用量的详尽列表。

ClusterResourceUsage #

除了模拟单个 Pod 之外,用户还可以通过 ClusterResourceUsage 模拟多个 Pod 的资源使用量。

以下 YAML 显示了 ClusterResourceUsage 资源的所有字段

kind: ClusterResourceUsage
apiVersion: kwok.x-k8s.io/v1alpha1
metadata:
  name: <string>
spec:
  selector:
    matchNamespaces:
    - <string>
    matchNames:
    - <string>
  usages:
  - containers:
    - <string>
    usage:
    cpu:
      value: <quantity>
      expression: <string>
    memory:
      value: <quantity>
      expression: <string>

与 ResourceUsage 相比,ResourceUsage 的 metadata.namemetadata.namespace 必须与关联的 Pod 匹配,而 ClusterResourceUsage 有一个额外的 selector 字段,用于指定要模拟的目标 Pod。matchNamespacesmatchNames 都表示为列表,它们旨在按不同级别获取 Pod 集合

  1. 如果 matchNamespaces 为空,则 ClusterResourceUsage 将应用于由 kwok 管理且名称列在 matchNames 中的所有 Pod。
  2. 如果 matchNames 为空,则 ClusterResourceUsage 将应用于由 kwok 管理且位于 matchNamespaces 中列出的命名空间下的所有 Pod。
  3. 如果 matchNamesmatchNamespaces 都未设置,则 ClusterResourceUsage 将应用于 kwok 管理的所有 Pod。

ClusterResourceUsage 的 usages 字段与 ResourceUsage 中的 usages 字段具有相同的语义。

依赖 #

  • 指标/metrics/resource 端点
  • metrics-server 版本 >= 0.7.0,它将为节点获取注释 metrics.k8s.io/resource-metrics-path,而不是默认的 /metrics/resource 端点。

从哪里获取模拟数据? #

数据可以从 kwok 的指标服务中获取,路径为 /metrics/nodes/{nodeName}/metrics/resource,其中 {nodeName} 是伪节点的名称。返回的指标类似于 kubelet 的 /metrics/resource 端点的响应。

请参阅 kwok 指标,了解如何将 kwok 模拟的指标端点与 metrics-server 集成。

开箱即用 #

目前,提供了一种配置来快速模拟 Pod 的资源使用情况。

# the <nodeName> should be replaced with the name of the node
kind: Node
apiVersion: v1
metadata:
  annotations:
    metrics.k8s.io/resource-metrics-path: "/metrics/nodes/<nodeName>/metrics/resource"
...
# specify the resource usage of a pod via annotation
kind: Pod
apiVersion: v1
metadata:
  annotations: 
    kwok.x-k8s.io/usage-cpu: "100m"
    kwok.x-k8s.io/usage-memory: "100Mi"
...