【问题标题】:Kubernetes CRD: Show durations in additionalPrinterColumnsKubernetes CRD:在附加打印机列中显示持续时间
【发布时间】:2022-01-13 19:57:50
【问题描述】:

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

【问题讨论】:

  • 所以现在我只能部分回答:这是kubectl 行为。您可以通过kubectl proxy --port=8080 &查看,然后直接curl localhost:8080/apis/batch/v1/namespaces/default/jobs/pi获取工作详情。您提到的两个领域都有。我将尝试找到更多详细信息,它究竟是如何发生的。顺便问一下,你要使用哪个版本的kubectl
  • @SörenHenning。所以我对第一条评论有误,请在下面找到答案。

标签: kubernetes kubectl kubernetes-custom-resources


【解决方案1】:

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


kubectl 获取

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

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

here

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

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

kubectl get job job-name --v=8

然后使用设置为falseserver-print 标志(默认为true 以供人类阅读):

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

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


可以做什么

让我们从CRDs and controllers开始:

自定义资源可让您自行存储和检索结构化资源 数据。当您将自定义资源与自定义控制器组合时, 自定义资源提供了真正的声明式 API。

Kubernetes 声明式 API 强制将 责任。您声明资源的所需状态。这 Kubernetes 控制器将 Kubernetes 对象的当前状态保存在 与您声明的所需状态同步。这与 命令式 API,您可以在其中指示服务器做什么。

转到feature gates。我们对CustomResourceSubresources感兴趣:

在创建的资源上启用 /status/scale 子资源 CustomResourceDefinition.

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

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

第 2 部分

应该考虑到controller prunning

默认情况下,自定义资源的所有未指定字段,跨越所有 版本,被修剪。虽然可以选择退出 通过添加字段的特定子树 x-kubernetes-preserve-unknown-fields: truestructural OpenAPI v3 validation schema

这是关于自定义字段的answeradditionalPrinterColumns 非常相似。

【讨论】:

  • 非常感谢您的详细解释和建议的解决方法!需要一些时间来阅读这个和提供的链接。尤其是链接的 SO 答案真的很有帮助。
  • 要明确一点:watch update funtion 的意思类似于自定义控制器,watches 用于更改 CR 并更新状态,而不会在服务器端运行,对吧?
  • @SörenHenning 抱歉延迟回答。如果这是一个控制器,我会说它已经是服务器端的意思。如果这是operator,那么它不是服务器端的。这取决于实际的实现和架构。
猜你喜欢
  • 2011-04-05
  • 2015-05-24
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多