Implantación de Aplicaciones Web
José Juan Sánchez Hernández
Curso 2023/2024
kind
NOTA: El contenido de este sitio está en desarrollo.
Kubernetes (K8s) es una plataforma de código abierto para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores.
Un clúster de Kubernetes es un grupo de máquinas físicas o virtuales donde se ha desplegado el software de Kubernetes, para que trabajen juntas y ejecuten aplicaciones en contenedores.
Dentro de un clúster de Kubernetes existen dos tipos de nodos:
Vamos a estudiar cuáles son los componentes que utilizan cada uno de los nodos de un clúster de Kubernetes:
Componente | Descripción |
---|---|
kube-apiserver |
Publica la API de Kubernetes y actualiza la base de datos
etcd . |
etcd |
Es una base de datos distribuida de tipo clave-valor donde se almacena la configuración y el estado del clúster. |
kube-controller-manager |
Ejecuta los controladores que gestionan los recursos del clúster. Gestiona la creación de las réplicas para mantener el estado deseado en el clúster. |
kube-scheduler |
Decide en qué nodo del clúster se ejecutará cada Pod. |
cloud-controller-manager |
Interactua con proveedores externos de servicios en cloud computing como AWS, Azure o GCE. Este componente es opcional |
Componente | Descripción |
---|---|
kubelet |
Ejecuta y gestiona los Pods en los nodos del clúster. |
kube-proxy |
Implementa un proxy de red para los Pods para facilitar la comunicación entre ellos. |
container-runtime |
Runtime que ejecuta los contenedores (Docker, containerd, CRI-O, etc.) |
Imagen 1: Componentes de un clúster de Kubernetes. Imagen obtenida de la página oficial de Kubernetes
Para crear un clúster de Kubernetes existen diferentes soluciones:
Una solución sencilla donde no es necesario realizar ninguna instalación, es hacer uso de los servicios de Kubernetes que ofrecen algunos proveedores de Cloud Computing como:
Existen diferentes proyectos open source que nos permiten realizar la instalación de un clúster de Kubernetes sobre la infraestructura que nosotros queramos. Algunas soluciones son:
También existen otros proyectos que nos permiten crear un clúster en entornos de desarrollo o entornos con recursos limitados. Algunas soluciones son:
minikube
minikube que es una herramienta de código abierto que permite ejecutar un clúster de Kubernetes de forma local.
Dependiendo del driver utilizado a la hora de crear el clúster, minikube puede ser desplegado en:
Puede encontrar más información sobre los drivers disponibles en minikube en la documentación oficial.
La primera actividad que vamos a realizar será la instalación de minikube
sobre una
instancia de OpenStack o AWS. El
sistema operativo de la instancia tendrá que ser la última versión
disponible de Ubuntu Server o
Debian.
Para realizar la instalación de minikube
se
recomienda utilizar los scripts del siguiente repositorio:
En este repositorio puede encontrar los scripts para desplegar minikube en sistemas Debian y Ubuntu, utilizando los siguientes drivers:
Como vamos a trabajar con una instancia en OpenStack o AWS se recomienda utilizar el driver none para realizar una instalación en bare metal, de esta forma podremos utilizar la IP pública de la instancia para acceder al clúster.
minikube
Una vez que hemos instalado minikube
vamos a
crear un clúster con un solo nodo que será el Control
Plane.
Cuando creamos un clúster en minikube
con el
driver none necesitamos indicar qué plugin de CNI
(Container Network Interface) queremos utilizar para gestionar
la red del clúster. Si no indicamos un plugin de CNI, vamos a tener
problemas de conectividad entre los Pods.
En nuestro caso, vamos a utilizar el plugin de red Flannel.
El comando para crear un clúster de Kubernetes de un solo nodo con minikube
,
utilizando el driver none y el plugin de red
Flannel es el siguiente:
Para comprobar el estado del clúster podemos utilizar el comando:
Para detener el clúster podemos utilizar el comando:
Podemos comprobar el driver que estamos utilizando con el siguiente comando:
Para eliminar el clúster podemos utilizar el comando:
Anexo
A continuación, se muestra un ejemplo cómo se podría el clúster de Kubernetes con otros drivers.
kubectl
Para gestionar nuestro clúster de Kubernetes vamos a utilizar kubectl
,
que es una aplicación que nos permite interaccionar con la API de
Kubernetes desde la línea de comandos.
Para realizar la instalación de kubectl
se recomienda utilizar los scripts del siguiente repositorio:
minikube
En esta actividad tendrá que crear un clúster de Kubernetes con minikube con tres nodos:
kind
kind
TODO
kind
En esta actividad tendrá que crear un clúster de Kubernetes con kind con tres nodos:
En esta práctica vamos a trabajar con los siguientes objetos de Kubernetes:
Un Pod es la unidad base de Kubernetes, es el recurso más pequeño que se puede desplegar en el clúster.
Un Pod puede tener un contenedor (principal) y varios contenedores auxiliares (init containers, ephemeral containers o sidecar containers).
Los contenedores que están dentro del mismo pod comparten la misma
dirección IP y se comunican por localhost
. Por este motivo,
no pueden usar los mismos puertos.
En un cluster de Kubernetes podemos tener muchos Pods y cada uno tiene su propia dirección IP.
En este ejemplo vamos a definir un objeto de tipo
Pod en un archivo llamado mi-pod.yaml
con
el siguiente contenido.
apiVersion: v1
kind: Pod
metadata:
name: mi-pod
labels:
mi-clave: mi-valor
spec:
containers:
- name: mi-contenedor
image: nginx
ports:
- containerPort: 80
restartPolicy: Always
Para obtener el listado de Pods podemos utilizar cualquier de estas tres opciones:
Podemos utilizar el flag -o wide
para obtener
información ampliada:
Para obtener un listado de todos los recursos podemos utilizar el comando:
Podemos utilizar cualquiera de estas dos opciones.
Si el Pod sólo tiene un contenedor no es necesario indicar el nombre, es opcional.
Con el flag -f
podemos indicar que la información del
log se mueste en tiempo real.
El siguiente comando ejecuta el comando /bin/bash
dentro
del contenedor del pod mi-pod
.
Para acceder a contenedor del Pod podemos hacemos
hacer una redirección de puertos desde la máquina donde estamos
ejecutando el comando kubectl
hasta el contenedor del
Pod.
En este ejemplo vamos a hacer una redirección entre el puerto
8000
de la máquina donde ejecutamos kubectl
y
el puerto 80
del Pod.
Al ejecutar el comando veremos que la redirección está activa y
finalizará cuando terminemos la ejecución del comando con
Control + C
.
Forwarding from 127.0.0.1:8000 -> 80
Forwarding from [::1]:8000 -> 80
^C
Para acceder al Pod lo haremos accediendo a través de la dirección de
localhost
de la máquina donde hemos ejecutado el
comando.
curl http://localhost:8000
Si queremos hacer la redirección de puertos a una dirección IP que no
sea la de localhost
podemos utilizar el flag
--address
.
Un ReplicaSet es un objeto que se encarga de garantizar que siempre haya en ejecución un número específico de réplicas de un Pod dentro del clúster.
En este ejemplo vamos a definir un objeto de tipo
ReplicaSet en un archivo llamado
mi-replicaset.yaml
con el siguiente contenido.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: mi-replicaset
spec:
# Número de réplicas que queremos tener en ejecución
replicas: 2
# Selecciona todos los Pods que tengan la etiqueta 'app: mi-app'
selector:
matchLabels:
app: mi-app
# Define la plantilla del pod que se utilizará para crear las réplicas
template:
metadata:
# Añade la etiqueta 'app: mi-app' al pod para que coincida con el selector
labels:
app: mi-app
spec:
containers:
- name: mi-contenedor
image: nginx
ports:
- containerPort: 80
restartPolicy: Always
Para obtener el listado de ReplicaSet podemos utilizar cualquier de estas opciones:
Podemos utilizar el flag -o wide
para obtener
información ampliada:
Para obtener un listado de todos los recursos podemos utilizar el comando:
Podemos utilizar cualquiera de estas opciones.
kubectl describe replicasets.apps mi-replicaset
kubectl describe replicasets.apps/mi-replicaset
kubectl describe replicasets mi-replicaset
kubectl describe replicasets/mi-replicaset
kubectl describe rs/mi-replicaset
kubectl describe rs mi-replicaset
Con el flag -f
podemos indicar que la información del
log se mueste en tiempo real.
El Deployment es un objeto que nos permite automatizar el despliegue y la actualización de una aplicación dentro del clúster. Este objeto utiliza en su definición los objetos Pod y ReplicaSet.
Las buenas prácticas recomiendan trabajar con Deployments en lugar de Pods.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mi-deployment
spec:
replicas: 2
selector:
matchLabels:
app: mi-app
# Estrategia de actualización: RollingUpdate
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: mi-app
spec:
containers:
- name: mi-contenedor
image: nginx
ports:
- containerPort: 80
restartPolicy: Always
Cuando se realiza una actualización sobre un Deployment que está en ejecución, es posible indicar cuál será la estrategia que se va a utilizar para reemplazar los Pods de la versión antigua por los Pods de la nueva versión.
Esta estrategia se indica en el parámetro .spec.strategy
y se pueden indicar dos tipos:
Recreate
. Esta estrategia elimina todos los Pods
existentes y una vez eliminados crea los Pods con la nueva versión.
Tiene el inconveniente que durante la actualización hay un tiempo donde
se deja de dar servicio hasta que se hayan creado los nuevos Pods.RollingUpdate
. Es la opción por defecto. En este caso,
se van creando los Pods con la nueva versión y de forma progresiva se
van eliminando los Pods con la versión antigua.Para obtener el listado de Deployments podemos utilizar cualquier de estas opciones:
Podemos utilizar el flag -o wide
para obtener
información ampliada:
Para obtener un listado de todos los recursos podemos utilizar el comando:
Podemos utilizar cualquiera de estas opciones.
kubectl describe deployment.apps mi-deployment
kubectl describe deployment.apps/mi-deployment
kubectl describe deployment mi-deployment
kubectl describe deployment/mi-deployment
kubectl describe deploy/mi-deployment
kubectl describe deploy mi-deployment
Con el flag -f
podemos indicar que la información del
log se mueste en tiempo real.
Esta
página forma parte del curso
Implantación de Aplicaciones
Web de José Juan Sánchez
Hernández y su contenido se distribuye bajo una
licencia
Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0
Internacional.