[英]Kubernetes CRD: Show durations in additionalPrinterColumns
在 Kubernetes CustomResourceDefinitions (CRDs) 中,我們可以指定additionalPrinterColumns
,(例如)用於kubectl get
與 CRD。 列的值通常使用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
決定提供哪些字段作為響應:
kubectl
工具依賴於服務器端的 output 格式。 集群的 API 服務器決定kubectl get
命令顯示哪些列
見這里。
jobs
的Duration
字段也在服務器端計算。 發生這種情況是因為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
將顯示在 output 中。
可以做什么
讓我們從CRD 和控制器開始:
就其本身而言,自定義資源可讓您存儲和檢索結構化數據。 當您將自定義資源與自定義 controller 結合使用時,自定義資源將提供真正的聲明性 API。
Kubernetes 聲明性 API 強制執行職責分離。 您聲明資源的所需 state。 The Kubernetes controller keeps the current state of Kubernetes objects in sync with your declared desired state. 這與命令式 API 形成對比,您可以在其中指示服務器做什么。
前進到feature gates
。 我們對CustomResourceSubresources
感興趣:
對從
CustomResourceDefinition
創建的資源啟用/status
和/scale
子資源。
從 kubernetes 1.16
開始,默認啟用此feature gate
。
因此,可以在 CRD subresource
的狀態中創建諸如duration-execution
之類的自定義字段,並且自定義 controller 可以在使用watch update funtion
function 更改值時更新給定字段的值。
第2部分
應該考慮到controller prunning
:
默認情況下,所有版本的自定義資源的所有未指定字段都會被修剪。 不過,可以通過在結構 OpenAPI v3 驗證模式中添加
x-kubernetes-preserve-unknown-fields: true
來選擇退出特定的字段子樹。
這是關於自定義字段和additionalPrinterColumns
的非常相似的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.