Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions 01-contenedores/ejercicios/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Ejercicios

## 1. Creando imágenes

- Ejecuta un contenedor de `ubuntu`, instala `curl` dentro del mismo.
- ¿Con qué comando podrías preservar el cambio?
- Crea un `Dockerfile` que haga lo mismo. Ejecuta la nueva imagen y verifica que puedes usar `curl`
- ¿Cómo podrías ver las distaintas capas del contenedor?
Copy link
Member

@brauliodiez brauliodiez Mar 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo

Le acabo de pasar herramienta para poner ejercicios obligatorios y opcionales, instrucciones de uso etc...,si lo ves bien lo incorporas / modificas y palante, graacias

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjunto el .md por si fuera de ayuda
laboratorio_docker_completo.md


Para instalar `curl` en `ubuntu` puedes usar:

```bash
apt-get install curl
```

## 2. Limpiando imágenes

Construye tres imágenes distintas:

1. Parte de la imagen base de `alpine` o `ubuntu`. Crea un `Dockerfile` y construye la imagen.
2. En una nueva iteración, instala `curl` y construye la imagen.
3. En la siguiente iteración, instala `wget` y construye la imagen.

- Inspecciona tus imágenes locales ¿Qué ocurre?
- ¿Cómo podemos limpiar el sistema?

## 3. Volumenes persistentes

Ejecuta un contenedor de `postgres` con un volumen manejado por Docker y que monte en `/var/lib/postgresql/data`. Conectate a la base de datos y crea una tabla `items`, que tenga doos campos `id` y `name`, siendo `id` primary key. Inserta un registro en la tabla items.

- Para y elimina el contenedor que has creado.
- Vuelve a ejecutar un nuevo contenedor de `postgres` montando el volumen anterior, en el mismo *path*. Verifica que los datos persisten.

## 4. Bind mounts

Crea un fichero `index.html` en tu máquina local. Ejecuta un contenedor de `nginx` mapeando el puerto 80 a un puerto en tu local, y enlace tu fichero `index.html` local con `/usr/share/nginx/html/index.html`.

- ¿Qué ocurre si editas el fichero local `index.html`?

## 5. Auditando volumenes

- ¿Qué comando deberías usar para averiguar dónde alamacena Docker los datos de un volumen dado?
- Si estás usando Docker Desktop en Windows o macOS que diferencia habría con un Linux en el contexto de dónde están alamacenados los datos.

## 6. Creando redes privadas

- Crea una red tipo `bridge` llamada `my-net`. Eejcuta dos conetenedores de tipo `ubuntu`, asegura que `ping` está disponible, ambos deben correr en la red `my-net`.
- Comprueba que puedes usar `ping` en ambos y se alcazan entre si.

## 7. Red `none`

- ¿Cuáles serían los casos de uso de la red `none`?

## 8. Multi-network

Crea dos redes de tipo bridge `secure-zone` y `public-zone`. Arranca un contenedor en `public-zone`.

- ¿Puedes añadir tu contenedor a `secure-zone`? ¿Qué comado deberías utilizar?
- ¿Cómo puedes verificar en que red se encuentra un contenedor?

## 9. Docker Compose - Compartiendo Volumenes

- Crea un manifiesto para Docker Compose con dos servicios que comparten un mismo volumen.
- Nombra al primer servicio como `writer`, este debe montar el volumen en `/app/logs` y añadir un `timestamp` a un fichero cada 30 segundos.
- Nombra al sergundo servicion como `reader`, debe montar el volumen como solo para lectura, y redireccionar su conetnido a `stdout`.

## 10. Docker Compose - Profiles

- Crea un manifiesto para docker compose con `postgres` y `pgadmin`
- `Pgadmin` debe conectar con `Postgres`. Crea los mecanismo adecuados para aegurar que la comunicación entre ambos servicios es posible.
- Crea dos perfiles, uno para levantar ambos servicios y otro para levanatr sólo `Postgres`
77 changes: 77 additions & 0 deletions 02-kubernetes/ejercicios/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Ejercicios
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para este, también le he pedido que añada un previo explicando, ¿Crees que tendrámos que poner la parte obligatoria con menos apartados? El objetivo es que sea fácil para los alumnos que quieran sacar el curso y para los que tengan más inquitudes que tengan más chicha.

Lo dejo, por aquí

Laboratorio Kubernetes

En este laboratorio practicarás conceptos fundamentales de Kubernetes:

  • Pods
  • Deployments
  • Rollouts
  • Persistencia de datos
  • Servicios
  • Networking
  • Ingress
  • Gateway API

Entrega del laboratorio

Este laboratorio debe entregarse mediante un repositorio público en
GitHub
.

El repositorio debe contener un fichero:

README.md

En este fichero deberás documentar:

  • Los pasos que has realizado
  • Los comandos utilizados
  • Una breve explicación de cada paso
  • Las respuestas a las preguntas del laboratorio

El objetivo es que cualquier persona pueda seguir tu documentación y
reproducir el laboratorio
.

Ejemplo de entrega:

https://github.com/usuario/kubernetes-lab

Criterios de evaluación

El laboratorio se divide en:

  • Parte obligatoria (necesaria para aprobar)
  • Parte opcional (para subir nota)

Parte obligatoria (mínimo para aprobar)

Debes completar correctamente los siguientes ejercicios:

  • Ejercicio 1 --- Naked Pod
  • Ejercicio 2 --- Self-Healing Deployment
  • Ejercicio 3 --- Zero-downtime Rollouts
  • Ejercicio 4 --- PersistentVolumeClaim
  • Ejercicio 6 --- Networking ClusterIP

Si estos ejercicios no funcionan o no están documentados, el
laboratorio no se considerará aprobado.


Parte opcional (para subir nota)

Puedes completar uno o varios de los siguientes ejercicios para mejorar
tu nota.

  • Ejercicio 5 --- StorageClass
  • Ejercicio 7 --- NodePort
  • Ejercicio 8 --- Ingress Controller
  • Ejercicio 9 --- Gateway API
  • Ejercicio 10 --- Canary Deployment

1. Naked Pod

Levanta un Pod desde consola utilizando la imagen:

nginx:alpine

Comprobación

Verifica que el Pod está ejecutándose correctamente.


Limpieza

Borra el Pod que has creado.


2. Self-Healing Deployment

Crea un Deployment con:

  • imagen httpd:alpine
  • 3 réplicas

Comprobación

Verifica que las 3 réplicas están corriendo.


Experimento

Elimina manualmente uno de los Pods del Deployment.

Pregunta:

¿Qué ocurre pasado un tiempo?


Observación en tiempo real

Pregunta:

¿Qué comando puedes usar para ver cómo aparecen las réplicas en tiempo
real?


3. Zero-downtime Rollouts

Crea un Deployment utilizando la imagen:

nginx:1.19

Actualiza la imagen del Deployment a:

nginx:1.21

Pregunta:

¿Qué opciones tienes para actualizar la imagen sin eliminar el
Deployment
?


Pregunta:

¿Qué comando puedes usar para verificar el estado del rollout?


4. PersistentVolumeClaim

Crea un:

PersistentVolumeClaim

solicitando:

1Gi

de almacenamiento.


Crea un Pod que monte el volumen.

Dentro del Pod crea un fichero en:

/temp

Comprobación

  1. Elimina el Pod
  2. Crea uno nuevo que monte el mismo PVC
  3. Comprueba que el fichero sigue existiendo

5. StorageClass (opcional)

Verifica si tu cluster tiene una:

StorageClass default

Crea un volumen usando esa StorageClass.


Comprueba que el volumen se ha creado correctamente.


6. Networking --- ClusterIP

Crea un Deployment con la imagen:

nginx

Expón el Deployment mediante un:

Service ClusterIP

Test de conectividad

Usa un Pod con imagen:

busybox

para conectarte al servicio.


Pregunta:

Si el Pod de busybox estuviera en otro namespace, ¿qué FQDN
deberíamos usar?


Pregunta:

¿Cómo podemos aislar completamente namespaces en Kubernetes?


7. Networking --- NodePort (opcional)

Convierte el servicio anterior a tipo:

NodePort

Comprueba que nginx sigue siendo accesible.


8. Networking --- Ingress Controller (opcional)

Crea dos Deployments usando YAML.

Usa la imagen:

hashicorp/http-echo

Ejemplo:

kind: Pod
apiVersion: v1
metadata:
  name: apple-app
  labels:
    app: apple
spec:
  containers:
    - name: apple-app
      image: hashicorp/http-echo
      args:
        - "-text=apple"

Requisitos:

  • Un Deployment devolverá red
  • Otro Deployment devolverá yellow

Expón ambos mediante servicios.


Crea un Ingress con las rutas:

example.com/red
example.com/yellow

Comprueba el funcionamiento usando:

curl -H "Host: example.com"

Refactoriza el Ingress para usar un Virtual Host por cada
Deployment
.


9. Gateway API (opcional)

Investiga:

Si quisiéramos utilizar Gateway API en lugar de Ingress:

¿Qué consideraciones deberíamos tener?


10. Canary Deployment (opcional)

Explica:

  • Qué es un Canary Deployment
  • Qué ventajas tiene
  • Qué pasos se podrían seguir para implementarlo en Kubernetes

Resumen de evaluación

Nivel Requisitos


Aprobado Parte obligatoria completa
Notable Parte obligatoria + ejercicios opcionales
Sobresaliente Parte obligatoria + opcionales

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjunto el .md por si fuera de ayuda

laboratorio_kubernetes_completo.md


## 1. Naked Pod

- Levanta un Pod desde consola, su imagen debe ser `nginx:alpine`.
- Verfica que el Pod se está ejecutando
- Borra el Pod.

## 2. Self-Healing Deployment

- Crea un Deployment con 3 replicas desde consola cuya imagen sea `httpd:alpine`.
- Verifica que las 3 replicas están corriendo.
- Elimina una de la réplicas. ¿Qué ocurre pasado un tiempo?
- ¿Qué comando deberías usar para ver cómo aparacen las replicas en tiempo real?

## 3. Zero-downtime Rollouts

- Crea un Deployment usando la imagen `nginx:1.19`.
- Actualiza la imagen a `nginx:1.21` ¿Qué opciones tienes para actualizar la imagen sin eliminar el Depolyment?
- ¿Qué comando puedes usar para verificar el estado del *rollout*?

## 4. PVC

- Crea un `PersistentVolumClaim` solicitando 1Gi de alamacenamiento.
- Monta el PVC en un POd y crea un fichero en el path `/temp`.
- Elmina el Pod, crea un nuevo que monte el PVC anterior, verifica que el fichero sigue existiendo.

## 5. StorageClass

- Verifica si en tu cluster existe una `StorageClass default`.
- Crea un volumen a través de la `StorageClass default`.
- Verifica que el volumen se ha creado.

## 6. Networking - ClusterIP

- Crea un Deployment con la imagen `nginx`, expón el Deployment a través de un servicio ClusterIP.
- Verifica que eres capaz de interactuar con `nginx` a través del servicio que has creado. Para ello usa una imagen `busybox`.
- Si el Pod de `busybox` se hallará en otro `namespace` que FQN deberíamos usar.
- ¿Cómo podemos aislar `namespaces` completamente en K8s?

## 7. Networking - NodePort

- Convierte el servicio anterior a NodePort.
- Verifica `nginx` sigue siendo accesible.

## 8. Networking - Ingress Controller

Crea dos Deployments en `yaml` y exponlo a través de un servicio, también en `yaml`. Usa la imagen `hashicorp/http-echo`. Esta imagen permite pasar como argumento un 'echo'. Aquí tienes un ejemplo, usando un Pod:

```yml
kind: Pod
apiVersion: v1
metadata:
name: apple-app
labels:
app: apple
spec:
containers:
- name: apple-app
image: hashicorp/http-echo
args:
- "-text=apple"
```

- El primer Deployment dará como echo la palabra *red*
- El segundo Deployment dará como echo la palabra *yellow*
- Crea un Ingress que exponga el primer Deployment en `example.com/red`, y el segundo en `example.com/yellow`.
- Comprueba que funciona usando `curl -H "Host: example.com" ...`
- Refactoriza el Ingress para que existan un Virtual Host por cada uno de los Deloyments.

## 9. Networking - Gateway API

Si quisieramos utilizar la [Gateway API](https://gateway-api.sigs.k8s.io/) en vez del Ingress del ejercicio anetrior, ¿qué consideraciones deberíamos tomar?

## 10. Canary Deployment

- Explica que es un Canary Deployment y los pasos para ejecutarlo en K8s.