Kubernetes (k8s) es una tecnología que ayuda al despliegue, escalabilidad y gestión de aplicaciones distribuida de manera eficiente.
Cómo ayuda a la escalabilidad y a la disponibilidad exactamente?
Es usado por grandes compañías como Netflix, Spotify, entre otras.
Es como un orquestador:
- Si un músico deja de tocar, lo reemplaza por otro.
- Si la audiencia aumenta, el orquestador aumenta el número de músicos.
Explicar exactamente qué es un orquestador.
Cuáles alternativas hay para k8s?
Cuáles son las ventajas y desventajas de usar k8s en un proyecto?
Cuándo usar y no usar k8s?
Instalación en local
Instalar kubectl
Kubectl es una herramienta para ejecutar comandos en clústeres de k8s. Link de como instalar.
Instalar minikube
Minikube es una instancia local de k8s que nos permite aprender y desarrollar de forma fácil en k8s. Link de como instalar.
Iniciar el cluster
Para poder crear un clúster y configurarlo en kubectl, hay que ejecutar este comando.
minikube start --driver=docker
Esto creará un clúster llamado minikube
y un namespace llamado default
Expandir en drivers
Podemos revisar los nodos usando kubectl get nodes
y, ya que estamos usando Docker, podemos revisar el contenedor que se está ejecutando usando docker ps
.
Add-ons
Minikube nos proporciona diferentes add-ons que podemos instalar en nuestro clúster. Para comprobar cuales son podemos ejecutar minikube addons list
.
Hay dos add-ons importantes que se tienen que instalar que son registry
para habilitar el registro local y metrics-server
para habilitar el servidor de métricas. Para esto, usamos los siguientes comandos:
minikube addons enable registry
minikube addons enable metrics-server
Un comando útil es eval $(minikube docker-env)
que nos permite usar Docker para ver qué componentes están instalados en minikube (como por ejemplo las imágenes).
El comando kubectl config get-contexts
nos permite saber en qué clúster estamos ejecutando los comando (por ejemplo, en la máquina local o en una remota). Para cambiar de contexto podemos usar el comando kubectl config set-context NOMBRE_CONTEXTO
Expandir en contextos de Docker
Para ejecutar un contenedor de ejemplo, podemos usar:
kubectl run hello-cloud --image=gcr.io/google-samples/hello-app:2.0 --restart=Never --port=8080
Una utilidad que podemos usar a la hora de usar k8s con minikube es el dashboard web:
minikube dashboard
Partes principales
Clústeres
Un clúster es un conjunto de nodos, los cuales ejecutan aplicaciones en contenedores gestionados por un Control Plane.
Crear uno o dos nodos maestros por clúster y múltiples nodos workers para garantizar alta disponibilidad, capacidad de ejecución y operación.
Namespaces
Los namespaces nos ayudan a nombrar o categorizar los recursos de un cluster de forma lógica. Por ejemplo podemos tener un namespace por tipo de aplicación como back-end o front-end, o por equipo como payments o profiles.
Nodos
Existen dos tipos de nodos: maestros y workers.
Maestros
- Gestionan el clúster.
- Se aseguran que todo esté funcionando en armonía
- Son como la central de operaciones.
API Server
Esta es la interfaz principal del cluster. Se asegura que todas las solicitudes (tanto externas como internas) sean procesadas correctamente.
etcd
Base de datos llave-valor que almacena el estado del cluster. Asegura que el cluster siempre tenga un registro actualizado de su estado.
Scheduler
Asigna los pods a los nodos workers segun los recursos disponibles.
Controller manager
Supervisa el estado de los recursos y asegura que coincidan con el estado deseado. Si un pod falla, este componente se asegura de que se cree uno nuevo.
Workers
- Ejecutan las aplicaciones
- Hacen el trabajo pesado
- Usan Docker
Kubelet
Se comunica con el nodo maestro para recibir instrucciones y reportar el estado del worker.
kube-proxy
Se encarga de las reglas de red y balanceo de carga.
Pods
Es la unidad más básica y mínima de ejecución en k8s. Contiene uno o más contenedores. Si un nodo falla, los pods se redistribuyen para mantener el servicio.
Cada pod tiene una IP única dentro del clúster.
Servicios
Son componentes instalables en un clúster, los cuales facilitan la comunicación entre diferentes partes de la aplicación y el exterior.
Definen un conjunto de pods y una política de acceso.
Un ejemplo de servicio sería redirigir tráfico del front a un grupo de pods del back.
De los servicios más usados son ClusterIP, NodePort, LoadBalancer y ExternalName.