Kubernetes CRD: Mostrar duraciones en additionalPrinterColumns
En Kubernetes, en las CustomResourceDefinitions
(CRDs), podemos especificar additionalPrinterColumns
, que (por ejemplo) se utilizan para kubectl get
con una CRD. El valor de una columna se extrae generalmente del estado de una CRD utilizando un jsonPath
. Según la documentación de Kubernetes, también podemos ver que las marcas de tiempo se presentan de una manera amigable para el usuario (por ejemplo, 5m o 2h, representando la duración desde esta marca de tiempo hasta ahora):
yaml
additionalPrinterColumns:
- name: Duration
type: date
jsonPath: .status.completitionTimestamp
El recurso Kubernetes Job es un ejemplo de un recurso que no solo muestra desde cuándo existe, sino también cuánto tiempo se ejecutó:
NAME COMPLETIONS DURATION AGE
hello-4111706356 0/1 0s
hello-4111706356 0/1 0s 0s
hello-4111706356 1/1 5s 5s
Estoy buscando construir algo similar para mi CRD, es decir: mostrar la duración entre dos marcas de tiempo de la misma manera. Más específicamente, me gustaría obtener la duración entre dos campos de estado, como .status.startTimestamp
y .status.completitionTimestamp
, evaluados y formateados por Kubernetes.
Dado que exactamente lo mismo se hace en el recurso Job, me pregunto si esto es de alguna manera posible o si este es un comportamiento especial incorporado en kubectl
.
davy.ai
Sí, es posible mostrar la duración entre dos marcas de tiempo de manera similar al recurso Job utilizando
additionalPrinterColumns
en unaCustomResourceDefinition
de Kubernetes. Puedes definir una columna con unajsonPath
que extraiga las dos marcas de tiempo y luego usar unago-template
personalizada para calcular y formatear la duración entre ellas.Aquí tienes un ejemplo de definición de
additionalPrinterColumns
para un recurso hipotéticoYourCRD
, suponiendo que tiene los camposstartTimestamp
ycompletionTimestamp
en su estado:La expresión
jsonPath
$[status.startTimestamp, status.completionTimestamp]
extrae un array JSON con dos marcas de tiempo del campostatus
del CRD. Ten en cuenta que la sintaxis de array parajsonPath
solo está disponible en Kubernetes 1.16 y versiones posteriores.La directiva
format: duration
indica a Kubernetes que formatee el valor de la columna como una duración, utilizando la misma lógica que se utiliza para los recursos Job. Sin embargo, necesitamos definir unago-template
personalizada para restar las dos marcas de tiempo y formatear el resultado.Aquí tienes un ejemplo de
go-template
para calcular la duración entre las dos marcas de tiempo y formatearla como una cadena de texto:Esta
go-template
primero extrae las dos marcas de tiempo del array JSON de entrada y las convierte en objetos de tiempo de Go. Luego calcula la duración entre ellos como la diferencia de sus marcas de tiempo Unix en segundos.Finalmente, formatea la duración como una cadena de texto en el formato
d h m s
, donded
es el número de días,h
es el número de horas,m
es el número de minutos ys
es el número de segundos.Cuando uses
kubectl get yourcrd -o=custom-columns=...
con esta definición deadditionalPrinterColumns
, la columnaDURATION
mostrará la duración entre los camposstartTimestamp
ycompletionTimestamp
de cada objeto CRD de la misma manera que para los recursos Job.