Kubernetes es una tecnología creada por Google y sirve para la gestión y orquestación de contenedores entre otros Docker.
Un orquestador es el encargado de gestionar el ciclo de vida de los contenedores de una aplicación, los servicios que suele ofrecer un orquestador son los siguientes:
- Manejo del clúster
- Gestión del ciclo de vida de los contenedores
- Service Discovery
- Servicios de red y load-balancing
- Servicios de monitorización
- Servicios de chequeo de estado de salud
Pods son la unidad más pequeña desplegable que puede ser creada, programada y manejada por Kubernetes
Un Pod encapsula el contenedor de una aplicación (o, en algunos casos, múltiples contenedores), recursos de almacenamiento, una IP de red única y opciones que rigen cómo deben ejecutarse los contenedores.
Es importante destacar que el Pod es la unidad de despliegue de Kubernetes.
En un pod, puede correr uno o mas contenedores, los contenedores corriendo en el mismo Pod, comparten el mismo stack de red (son accesibles entre ellos usando localhost). También tienen acceso a los mismos volúmenes e incluso a memoria compartida.
Un Pod solo se considera healthy si todos los contenedores que lo componen están funcionando correctamente.
Los pods son efímeros, cuando se destruyen se pierde toda la información que contenía. Si queremos desarrollar aplicaciones persistentes tenemos que utilizar volúmenes para persistir los datos de los pods.
Esqueleto YAML de un pod
Podemos describir la estructura de un pod en un fichero con formato Yaml, por ejemplo el fichero lab1.yaml:
apiVersion: v1 kind: Pod metadata: name: nodehelloworld.curso.local namespace: default labels: app: helloworld spec: containers: - image: wardviaene/k8s-demo name: k8s-demo
Donde indicamos:
- apiVersion: v1: La versión de la API que vamos a usar.
- kind: Pod: La clase de recurso que estamos definiendo.
- metadata: Información que nos permite identificar unívocamente al recurso.
- spec: Definimos las características del recurso. En el caso de un pod indicamos los contenedores que van a formar el pod, en este caso sólo uno.
Cuando crea definiciones de recursos YAML, necesita conocer los campos y sus significados. Para buscar esta información es en la referencia de la API , que contiene las especificaciones completas de todos los recursos.
Sin embargo, cambiar a un navegador web cada vez que necesita buscar algo es tedioso. Por lo tanto, kubectl proporciona el comando kubectl explain, que puede mostrar las especificaciones de recursos de todos los recursos directamente desde nuestro terminal.
El uso de kubectl explain es el siguiente:
$kubectl explain resource[.field]...
El comando genera la especificación del recurso o campo solicitado. La información mostrada por kubectl es idéntica a la información en la referencia API.
explain
Por defecto, kubectl explain muestra solo un único nivel de campos, podemos mostrar todo el árbol de campos con el parametro –recursive:
$kubectl explain pod.spec –recursive
En caso de que no esté seguro acerca de qué nombres de recursos puede usar kubectl explain, para mostrarlos todos con el siguiente comando:
$ kubectl api-resources
Para más información acerca de la estructura de la definición de los objetos de Kubernetes: Understanding Kubernetes Objects.
Creación y gestión de un pod
Para crear el pod desde el fichero yaml anterior, ejecutamos:
$kubectl create -f lab1.yaml
Y podemos ver que el pod se ha creado:
$kubectl get pods
Si queremos saber en que nodo del cluster se está ejecutando:
$kubectl get pod -o wide
Para obtener información más detallada del pod:
$kubectl describe pod nodehelloworld.curso.local
Para obtener información más detallada del pod, en formato de salida de columnas personalizas:
$ kubectl get pods -o custom-columns='NAME:metadata.name,NODE:spec.nodeName' $ kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
Accediendo al pod con kubectl
Para obtener los logs del pod:
$ kubectl logs nodehelloworld.curso.local
Si quiero conectarme al contenedor:
$ kubectl exec -it nodehelloworld.curso.local -- /bin/bash
Podemos acceder a la aplicación, redirigiendo un puerto de localhost al puerto de la aplicación:
$ kubectl port-forward nodehelloworld.curso.local 8081:3000
Y accedemos al servidor web en la url http://localhost:8081:
$ curl localhost:8081
Para ver los pods, que tenemos en nuestro cluster por label:
kubectl get pod -l app:helloworld
Para eliminar el pod:
$kubectl delete pod nodehelloworld.curso.local





