Kubernetes CRD:在 additionalPrinterColumns 中显示持续时间

Kubernetes CRD: Show durations in additionalPrinterColumns

在 Kubernetes CustomResourceDefinitions (CRD) 中,我们可以指定 additionalPrinterColumns,它(例如)用于带有 CRD 的 kubectl get。列的值通常使用 jsonPath 从 CRD 的状态中提取。从 Kubernetes docs,我们还可以看到时间戳以用户友好的方式呈现(例如,5m2h,代表从这个时间戳到现在的持续时间):

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

Kubernetes Job资源是一个资源的例子,它不仅显示了它存在的时间,还显示了for long it was running:

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 中内置的特殊行为?

我会部分回答你的问题,让你对what/how/where有一些了解和想法。


kubectl get

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

The kubectl tool relies on server-side output formatting. Your cluster's API server decides which columns are shown by the kubectl get command

参见 here

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

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

kubectl get job job-name --v=8

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

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

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


可以做什么

让我们从CRDs and controllers开始:

On their own, custom resources let you store and retrieve structured data. When you combine a custom resource with a custom controller, custom resources provide a true declarative API.

The Kubernetes declarative API enforces a separation of responsibilities. You declare the desired state of your resource. The Kubernetes controller keeps the current state of Kubernetes objects in sync with your declared desired state. This is in contrast to an imperative API, where you instruct a server what to do.

前进到 feature gates。我们对 CustomResourceSubresources:

感兴趣

Enable /status and /scale subresources on resources created from CustomResourceDefinition.

feature gate 从 kubernetes 1.16 开始默认启用。

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

第 2 部分

有一个controller prunning应该考虑:

By default, all unspecified fields for a custom resource, across all versions, are pruned. It is possible though to opt-out of that for specific sub-trees of fields by adding x-kubernetes-preserve-unknown-fields: true in the structural OpenAPI v3 validation schema.

这里有一个非常相似的关于自定义字段的 additionalPrinterColumns