CEL 表达式

kwok 中的 CEL 表达式 #

该页面简要说明了如何在 kwok CR 中编写 CEL 表达式。

以下是 kwok 中包含基于 CEL 字段的所有 CR 的列表。

编写表达式时,必须遵循 CEL 语言规范。有关 CEL 的预定义函数,请参阅 CEL 预定义函数

除了内置函数之外,kwok 还提供了一些自定义扩展函数。下面给出了所有扩展函数及其用法详尽列表。

  • Now():不带任何参数,返回当前时间戳。
  • Rand():不带任何参数,返回一个随机的 float64 值。
  • SinceSecond() 返回给定资源(podnode)创建以来的秒数。例如:SinceSecond(pod)node.SinceSecond(node)
  • UnixSecond() 返回给定时间(time.Time 类型)的 Unix 时间。例如:,UnixSecond(Now())UnixSecond(node.metadata.creationTimestamp)
  • Quantity() 返回给定数量值的一个 float64 值。例如:Quantity("100m")Quantity("10Mi")
  • Usage() 返回当前瞬时资源使用情况,其中包含 [ResourceUsage (ClusterResourceUsage)] 中的模拟数据。例如:Usage(pod, "memory")Usage(node, "memory")Usage(pod, "memory", container.name) 返回资源(pod、节点或容器)的当前工作集(以字节为单位)。
  • CumulativeUsage() 返回秒为单位的累积资源使用情况,其中包含 [ResourceUsage (ClusterResourceUsage)] 中给出的模拟数据。例如:CumulativeUsage(pod, "cpu")CumulativeUsage(node, "cpu")CumulativeUsage(pod, "cpu", container.name) 返回资源(pod、节点或容器)消耗的累积 CPU 时间(以核心秒为单位)。

此外,kwok 提供了三个特殊的 CEL 变量 nodepodcontainer,这些变量可用于表达式中。这三个变量分别设置为相应的节点、pod、容器资源对象,用户可以通过 CEL 字段选择表达式(e.f 格式)简单地引用资源对象的任何嵌套字段。例如,您可以使用表达式 node.metadata.name 来获取节点名称。

具有至少一个参数的函数可以在接收器调用样式中调用。也就是说,像 f(e1, e2) 这样的函数调用也可以用 e1.f(e2) 样式调用。例如,您可以使用 pod.Usage("memory") 作为 Usage(pod, "memory") 的替代方法。

值得注意的是,某些扩展函数的使用仅限于特定的 CR 和上下文,因为它们不是通用的,而是为特殊的评估任务设计的。详细限制如下所述。

函数限制 #

函数 Usage()CumulativeUsage() 只能在指标资源中使用。对于上面列出的其他函数,用户还可以在 ResourceUsage 和 ClusterResourceUsage 中使用它们来构建动态资源使用模式。

原因在于,当 kwok 评估函数 Usage()CumulativeUsage() 时,它实际上会获取 ResourceUsage 和 ClusterResourceUsage 中给出的模拟数据来获取指标值。因此,请确保在使用函数 Usage()CumulativeUsage() 时,还提供了具有所需资源类型(cpu 或内存)的关联 ResourceUsage 或 ClusterResourceUsage。

变量限制 #

在指标资源中使用三个特殊 CEL 变量 nodepodcontainer 时,应遵循以下规则。

  • dimensionnode 时:只能使用 node 变量。
  • dimensionpod 时:只能使用 nodepod
  • dimensioncontainer 时:nodepodcontainer 都可以使用。