在 Kubernetes
CustomResourceDefinitions
(CRD)中,我们可以指定 additionalPrinterColumns
,(例如)用于带有 CRD 的 kubectl get
。通常使用 jsonPath
从 CRD 的状态中提取列的值。从Kubernetes文档中,我们还可以看到时间戳以用户友好的方式呈现(例如,5m或2h,表示从该时间戳到现在的持续时间):
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
中内置的特殊行为?
我将部分回答您的问题,以便您对什么/如何/在哪里有一些理解和想法。
kubectl 获取
当执行
kubectl get jobs
时,kubernetes API server
决定在响应中提供哪些字段:
工具依赖于服务器端输出格式。你的 集群的 API 服务器决定由kubectl
命令显示哪些列kubectl get
请参阅此处。
Duration
的 jobs
字段也在服务器端计算。发生这种情况是因为 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
子资源/scale
。CustomResourceDefinition
这个
feature gate
从kubernetes开始默认启用1.16
。
因此,可以在 CRD
duration-execution
的状态中创建像 subresource
这样的自定义字段,并且每当使用 watch update funtion
更改值时,自定义控制器都可以更新给定字段的值。
第 2 部分
controller pruning
需要考虑:
默认情况下,自定义资源的所有未指定字段 版本,被修剪。但可以选择退出 通过添加字段的特定子树
中的 结构 OpenAPI v3 验证架构。x-kubernetes-preserve-unknown-fields: true
这是关于自定义字段的非常相似的 answer 和
additionalPrinterColumns
。