Implantación de Aplicaciones Web
José Juan Sánchez Hernández
Curso 2023/2024
kubectl
minikube
y kubectl
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 distribuidad 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: Componenetes 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 un entorno de desarrollo:
En esta práctica vamos a utilizar minikube, que es una herramienta de código abierto que permite ejecutar un clúster de Kubernetes de forma local.
Dependiendo del driver utilizado, minikube puede ser desplegado en:
Puede encontrar más información sobre los drivers disponibles en minikube en la documentación oficial.
kubectl
Para gestionar nuestro clúster de Kubernetes vamos a utilizar la
herramienta de línea de comandos kubectl
.
Esta herramienta nos permite interaccionar con la API de Kubernetes.
minikube
y kubectl
La primera actividad que vamos a realizar será la instalación de minikube
y kubectl
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.
Tendrá que crear un clúster de Kubernetes con minikube
con un
solo nodo (Control Plane).
Para realizar la instalación de minikube
y kubectl
se recomienda utilizar los scripts del siguiente repositorio:
En este repositorio puede encontrar los scripts para deplegar minikube en sistemas Debian y Ubuntu, utilizando los siguientes drivers:
Se recomienda utilizar el driver none para realizar una instalación en bare metal.
En esta actividad tendrá que crear un clúster de Kubernetes con minikube 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 conenedor 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 ejecció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 depspliegue 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 tiemo 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.