Kubernetes CRD:在 additionalPrinterColumns 中显示持续时间
Kubernetes CRD: Show durations in additionalPrinterColumns
在 Kubernetes CustomResourceDefinitions
(CRD) 中,我们可以指定 additionalPrinterColumns
,它(例如)用于带有 CRD 的 kubectl get
。列的值通常使用 jsonPath
从 CRD 的状态中提取。从 Kubernetes docs,我们还可以看到时间戳以用户友好的方式呈现(例如,5m 或 2h,代表从这个时间戳到现在的持续时间):
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
最后一个命令只会返回一般信息,name
和 age
会显示在输出中。
可以做什么
让我们从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
。
在 Kubernetes CustomResourceDefinitions
(CRD) 中,我们可以指定 additionalPrinterColumns
,它(例如)用于带有 CRD 的 kubectl get
。列的值通常使用 jsonPath
从 CRD 的状态中提取。从 Kubernetes docs,我们还可以看到时间戳以用户友好的方式呈现(例如,5m 或 2h,代表从这个时间戳到现在的持续时间):
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 thekubectl 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
最后一个命令只会返回一般信息,name
和 age
会显示在输出中。
可以做什么
让我们从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 fromCustomResourceDefinition
.
此 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
。