K8S 102 - Workloads, ahora se pone lindo!

K8S 102 - Workloads, ahora se pone lindo!

Workloads en K8s? Vamos a aprender que son y como utilizarlos

Qué son los Workloads?

Nunca me voy a cansar de decirlo, pero para aprender algo vamos a ir a las fuentes. Tomando la definición que kubernetes le da a un workload. Workload

Un workload no es más que una aplicación corriendo en kubernetes, tan simple como eso!. Tengamos una aplicación de un solo componente o de miles, siempre vivirán dentro de un conjunto de pods. Y, que es un pod? Un pod representa uno o varios contenedores corriendo en nuestro cluster.

Ahora, cuando creamos pods directamente dentro de nuestro cluster, nadie "vela" por la salud de los mismos y en caso que por alguna causa (falla en el código, falla en el nodo, etc) el pod muera deberíamos crear otro manualmente que lo reemplace. Bastante flojito kubernetes he? Tranquilos que hay muchos tipos de workloads que nos permiten solucionar este y otros inconvenientes.

POD

Como comentamos anteriormente un POD es una representación de uno o varios contenedores en K8S, sería la unidad mínima que podemos desplegar dentro del cluster.

Crear un POD

Antes de ir por los diferentes tipos de workloads, vamos a ver como lanzamos un pod solito en nuestro cluster.

Supuestos
  • Tenemos ya corriendo en nuestra máquina nuestro cluster con kind

  • Tenemos instalado nuestro kubectl

Para el ejemplo vamos a crear un pod con la imágen de nginx

kubectl run nginx --image=nginx --restart=Never

Si vemos el comando lo que inicia es un pod llamado "nginx" utilizando la imágen de nginx. El parámetro --restart=Never debemos agregarlo sino K8S utilizaría otro tipo de workload para lanzarlo (deployment)

Luego de unos segundos podemos verificar que nuestro pod existe y está running

"Ver" un pod

kubectl get pod nginx

Vamos a obtener una salida similar a esta:

image.png

Detalles de un pod

Para saber detalles sobre nuestro pod podemos ejecutar el siguiente comando

kubectl describe pod nginx

Aca podemos ver algunas cositas interesantes como los contenedores que estan dentro del pod, recordemos que pueden ser mas de uno, la ip que tienen, la imágen que usan etc...

image.png

Eliminar un pod

Para poder eliminar nuestro POD ejecutamos simplemente:

kubectl delete pod nginx

Vamos a obtener una salida similar a la siguiente

image.png

Notemos que al eliminar el POD, para volver a disponer del mismo debemos nosotros mismos crear otro, esto esta bastante feo!. Veamos como los demás tipos de workloads nos pueden ayudar

Workloads resources

Para no tener que manejar los PODs directamente y que todo sea un lio, en K8S existen diferentes recursos que podemos utilizar dependiendo del tipo de aplicación que necesitamos desplegar, veamos los más utilizados!

Deployment

Como ya conocemos del apartado anterior, un POD es la unidad core al momento de desplegar aplicaciones en K8S. Un deployment no es más que una unidad de más alto nivel que nos permite no solo desplegar PODs sino que además nos brinda:

  • Control de réplicas
  • Escabilidad de pods
  • Actualizaciones continuas
  • Despliegues automáticos
  • Rollback a versiones anteriores

Lo más importante quizas sobre los deployment es que nos permiten realizar actualizaciones de forma declarativa. Que es esto? Simplemente declaramos el estado que queremos en un archivo YAML y K8S se encargará de intentar cumplir siempre con este estado deseado.

Veamos la definicion de un deployment, tomada de LA DOCUMENTACION OFICIAL!

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Sin entrar mucho en detalle por el momento podemos ver que tenemos:

  • Un objeto tipo deployment

  • Con el nombre nginx-deployment

  • Que le especificamos la cantidad de replicas, en este caso 3

  • Y que dentro de un "template", especificamos los contenedores (1 en este caso). Para el ejemplo usamos el contenedor con nombre nginx que utiliza la imágen nginx:1.14.2 y el puerto del contenedor es el 80

Desplegando un deployment

kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml

Luego de desplegarlo podemos verificar que es lo que se desplegó, con el comando:

kubectl get all

image.png

Como podemos notar tenemos:

  • 3 pods con nombre nginx-deployment, según indica nuestro manifiesto
  • 1 deployment llamado nginx-deployment.
  • 1 replica set para este deployment. El replica set, permite correr cierta cantidad de pods para nuestra aplicación y mantener el número de pods especificado en nuestro deployment.

Listar deployment

Para listar los deployment simplemente podemos ejecutar

```kubectl get deployments


#### Eliminar un deployment

Finalmente si quisieramos eliminar el deployment, ejecutamos


```kubectl delete deployment nginx-deployment

Este comando eliminará, los pods, el deployment y el replica set asociado a este deployment!

StatefulSets

No entraremos mucho en detalle pero los statefulset son usados para manejar aplicaciones "con estado".

Del mismo modo que los deployment, los statefulset manejan pods pero con una característica especial: Mantienen un identificador fijo en cada uno de estos pods, esto lo hace muy útil al momento de montar volumenes a esos pods para persistencia de datos. Los pods podrían fallar pero ese identificador se mantiene en el pod siguiente!

Para ampliar los conocimientos podemos irnos a la documentacion oficial

DaemonSet

Esta clase de workload tiene por objetivo asegurarse que todos (o algunos) de los nodos corran un pod de la aplicación que lo usa. Esto es sumamente útil en aplicaciones que requieren recolectar metricas de los nodos por ejemplo, ya que debemos asegurarnos que tenemos un pod en cada nodo siempre!.

Más información de daemonset en Documentacion oficial

Jobs

Workload interesante, lo que hace es ejecutar un POD y hacerlo hasta que una cierta cantidad de PODs terminen de manera correcta el "trabajo" que tienen que hacer.

Imaginemos por ejemplo que tenemos que verificar un estado de otro componente y necesitamos 3 verificaciones positivas para darlo por valido. Un workload tipo job podría ser útil. "Ejemplo muy malo, lo se!"

Para más información Documentación oficial!

CronJob

Quién no tuvo nunca que ejecutar cierto proceso en algún linux a una hora específica y en algunos días de la semana? Bueno este tipo de workload sirve justamente para esto.

No los quiero aburrir acá ya que es muy introductorio pero básicamente le indicamos cuando vamos a ejecutar este cronjob y K8S se encargará de hacerlo por nosotros

Más info en la documentación oficial

conclusion

Si llegaste hasta acá ya te mereces mis respetos! espero que te sirva y que puedas seguir aprendiendo que es de lo que se trata todo esto!