2

在 Kubernetes CustomResourceDefinitions(CRD) 中,我们可以指定additionalPrinterColumns,(例如)kubectl get与 CRD 一起使用。列的值通常使用 . 从 CRD 的状态中提取jsonPath。从Kubernetes 文档中,我们还可以看到时间戳以用户友好的方式呈现(例如,5m2h,表示从该时间戳到现在的持续时间):

additionalPrinterColumns:
  - name: Duration
    type: date
    jsonPath: .status.completitionTimestamp

Kubernetes Job资源是资源的一个示例,它不仅显示了它何时存在,而且还显示了它的运行时间:

NAME               COMPLETIONS   DURATION   AGE
hello-4111706356   0/1                      0s
hello-4111706356   0/1           0s         0s
hello-4111706356   1/1           5s         5s

我正在寻找为我的 CRD 构建类似的东西,即:以相同的方式显示两个时间戳之间的持续时间。更具体地说,我想获得两个状态字段之间的持续时间,例如由 Kubernetes 评估和格式化.status.startTimestamp.status.completitionTimestamp

由于在Job资源中完成了完全相同的事情,我想知道这是否可能,或者这是否是内置的特殊行为kubectl

4

1 回答 1

1

我将部分回答您的问题,以便您对什么/如何/在哪里有一些了解和想法。


kubectl 获取

何时kubectl get jobs执行,kubernetes API server决定提供哪些字段作为响应:

kubectl工具依赖于服务器端输出格式。kubectl get您的集群的 API 服务器决定命令显示哪些列

这里

Duration字段 forjobs也是在服务器端计算的。发生这种情况是因为job它是 Kubernetes 服务器的众所周知的资源,并且它内置在“如何打印响应”代码中。请参阅JobDuration - 打印机

这也可以通过运行常规命令来检查:

kubectl get job job-name --v=8

然后使用server-print标志设置为false(默认是true出于人类可读的原因):

kubectl get job job-name --v=8 --server-print=false

最后一个命令只会返回一般信息name,并将age显示在输出中。


可以做什么

让我们从CRD 和控制器开始:

就其本身而言,自定义资源可让您存储和检索结构化数据。当您将自定义资源与自定义控制器结合使用时,自定义资源会提供真正的声明式 API。

Kubernetes 声明式 API 强制执行职责分离。您声明资源的所需状态。Kubernetes 控制器使 Kubernetes 对象的当前状态与您声明的所需状态保持同步。这与命令式 API 形成对比,您可以在其中指示服务器做什么。

前进到feature gates. 我们感兴趣CustomResourceSubresources

对从创建的资源 启用/status和子资源。/scaleCustomResourceDefinition

feature gate从 kubernetes 开始默认启用此功能1.16

因此duration-execution,可以在 CRDsubresource的状态中创建自定义字段,并且自定义控制器可以在使用更改值时更新给定字段的值watch update funtion

第2部分

有一个controller prunning需要考虑的:

默认情况下,所有版本的自定义资源的所有未指定字段都会被修剪。不过,可以通过添加 结构化 OpenAPI v3 验证模式x-kubernetes-preserve-unknown-fields: true来为特定的字段子树选择退出。

这是关于定义字段和additionalPrinterColumns.

于 2022-01-12T15:01:56.770 回答