es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible mostrar la duración entre dos marcas de tiempo de manera similar al recurso Job utilizando additionalPrinterColumns en una CustomResourceDefinition de Kubernetes. Puedes definir una columna con una jsonPath que extraiga las dos marcas de tiempo y luego usar una go-template personalizada para calcular y formatear la duración entre ellas.

    Aquí tienes un ejemplo de definición de additionalPrinterColumns para un recurso hipotético YourCRD, suponiendo que tiene los campos startTimestamp y completionTimestamp en su estado:

    additionalPrinterColumns:
    - name: DURATION
      type: string
      jsonPath: |
        $[status.startTimestamp, status.completionTimestamp]
      format: duration
    

    La expresión jsonPath $[status.startTimestamp, status.completionTimestamp] extrae un array JSON con dos marcas de tiempo del campo status del CRD. Ten en cuenta que la sintaxis de array para jsonPath 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 una go-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:

    goTemplate: |
      {{- $start := (index . 0).Time }}
      {{- $end := (index . 1).Time }}
      {{- $duration := div (sub $end.Unix $start.Unix) 1e9 | int }}
      {{- $days := div $duration 86400 }}
      {{- $hours := mod (div $duration 3600) 24 }}
      {{- $minutes := mod (div $duration 60) 60 }}
      {{- $seconds := mod $duration 60 }}
      {{- printf "%dd %dh %dm %ds" $days $hours $minutes $seconds }}
    

    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, donde d es el número de días, h es el número de horas, m es el número de minutos y s es el número de segundos.

    Cuando uses kubectl get yourcrd -o=custom-columns=... con esta definición de additionalPrinterColumns, la columna DURATION mostrará la duración entre los campos startTimestamp y completionTimestamp de cada objeto CRD de la misma manera que para los recursos Job.

Comments are closed.