JSONPath en Kubernetes con ejemplos
En este artículo vamos a tratar sobre Kubernetes y como podemos navegar y filtrar por datos haciendo uso de JSONPath. Por lo que veremos como hacer uso de JSONPath en Kubernetes con ejemplos para poder ver diferentes casos.
¿Qué es JSONPath?
JSONPath es un lenguaje de búsquedas para JSON, podríamos decir que es como XPath para XML. Es decir, este lenguaje nos va a permitir seleccionar y extraer información de un JSON. Lo cual va a ser de gran utilidad por ejemplo en Kubernetes.
¿Por qué utilizar JSONPath en Kubernetes?
Por qué utilizar JSONPath? Cuando tenemos que recuperar información de kubernetes de múltiples nodos y diferentes objetos como pods, service accounts, deployments etc; vamos a necesitar una manera de obtener la información que necesitamos y poderla filtrar, para esos casos el uso de JSONPath será una opción perfecta.
Cuando queremos recuperar información haciendo uso de Kubectl toda esta información es devuelta en JSON, en donde se muestran solo los campos necesarios, y para poder «navegar» por esa estructura hacer uso de JSONPath nos será de gran utilidad.
Expresiones con JSONPath
Una expresión en JSONPath específica una ruta a un elemento o a un conjunto de elementos que son parte de un JSON.
Por ejemplo:
.spec.containers[0].name
Las expresiones JSONPath incluyen campos y valores y además son sensibles a mayúsculas y minúsculas.
$ representa el nivel root del documento, aunque se puede omitir su uso de manera que sería algo así:
$.metadata .metadata
Selección de elementos en Json con JSONPath
Para poder seleccionar un elemento haciendo uso de JSONPath tenemos dos aproximaciones.
- Aproximación por punto .field o por [‘field’].
- Aproximación basada en índice.
Las aproximaciones anteriores se asocian a obtener los elementos por el campo o por array.
Selección por campo
Para poder realizar selecciones por campo vamos a hacer uso de .field o [‘field’]. El uso de [] nos será útil cuando tengamos espacios o carácteres especiales. Por ejemplo:
.metadata.resourceVersion ['metadata']['resourceVersion']
Otra de las opciones que tenemos es realizar una búsqueda de manera recursiva a través de :
..name
En donde obtendremos una lista con todos los elementos name.
Selección basada en índice
Para aquellos casos en los que nuestro JSON contenga una colección de elementos vamos a realizar una selección basada en índices.
Podemos seleccionar un elemento de un array para ello se hará con [índice]:
.spec.ports[0].targetPort
Para seleccionar múltiples elementos de un Array podemos seleccionar por índice separados por una coma (,).
.spec.ports[0,1].targetPort
Otra de las opciones que nos permite JSONPath es añadir un filtro de comienzo y finalización para buscar en colecciones, es decir un start y un end y además nos permite añadir un step. Por ejemplo:
[start:end:step] -->[1:5:1]
Para aquellas ocasiones que necesitemos obtener los primero n elementos o los últimos n elementos podemos hacer lo siguiente:
[:n] o [-n:]
Es decir la primera expresión selecciona los n primeros y la segunda expresión selecciona los últimos n.
Uso de Wildcar (*) con JSONPath en Kubernetes
El uso de Wildcar con JSONPath en Kubernetes puede ser utilizado tanto para objetos como para Arrays.
Por ejemplo si lo queremos aplicar a un objeto sería con .metadata.* y si lo queremos aplicar a un array sería algo como esto .status.conditions[*].
Filtros en expresiones
Un filtro es una expresión lógica para poder realizar algún filtro tanto en objetos como en elementos de un array.
Por ejemplo para realizar un filtro para un objeto podríamos hacer:
?(expression)
Y para seleccionar en un array sería con [?(expression)]
El filtro selecciona todos los campos en un objeto o todos los elementos. Si queremos únicamente seleccionar los elementos del actual nodo podemos hacer uso de @. Por ejemplo:
.status.conditions[?(@.status==False)]
Operadores para expresiones con JSONPath en Kubernetes
Operador | Descripción |
== | Igual a … |
!= | Distinto de |
> | Mayor que |
< | Menor que |
>= | Mayor o igual |
<= | Menor o igual |
|| | Or lógico |
! | Negación |
Ejemplos con JSONPath en Kubernetes
Para los siguientes ejemplos estoy usando minikube con un único nodo:
Devolver los nombres de los nodos:
kubectl get nodes -o=jsonpath='{.items[*].metadata.name}'
Recuperar el nombre de los pods, independientemente del status:
kubectl get pods -o=jsonpath='{.items[*].metadata.name}'
Obtener los pods en formato JSON:
kubectl get pods -o json
Devolver el número de cores de CPU del nodo:
kubectl get nodes -o=jsonpath='{.items[*].status.capacity.cpu}'
Concatenar dos campos, por ejemplo name y cpu:
kubectl get nodes -o=jsonpath='{.items[*].metadata.name}{.items[*].status.capacity.cpu}'
Mostrar columnas custom para mostrar el nombre del nodo y los core de CPU:
kubectl get nodes -o=custom-columns=minikube:.metadata.name,CPU:.status.capacity.cpu
Obtener el nombre de las imágenes de los pods:
En este caso habrá que tener en cuenta que tanto items como containers son listas.
kubectl get po -o=jsonpath='{.items[*].spec.containers[*].image}'
Conclusión
El uso de JsonPath nos va a facilitar a filtrar y a encontrar información cuando tengamos nodos con mucha información. Aunque al principio puede ser tedioso es fácil acostumbrarse a su uso.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!
Otros Artículos que quizás te interesen
Ejercicios de Labels y Selectors en Kubernetes
Cliente HTTP para conectarse a Kubernetes