-
Notifications
You must be signed in to change notification settings - Fork 0
ejercicios contenedores y K8s #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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? | ||
|
|
||
| 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` | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| # Ejercicios | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 KubernetesEn este laboratorio practicarás conceptos fundamentales de Kubernetes:
Entrega del laboratorioEste laboratorio debe entregarse mediante un repositorio público en El repositorio debe contener un fichero: En este fichero deberás documentar:
El objetivo es que cualquier persona pueda seguir tu documentación y Ejemplo de entrega: Criterios de evaluaciónEl laboratorio se divide en:
Parte obligatoria (mínimo para aprobar)Debes completar correctamente los siguientes ejercicios:
Si estos ejercicios no funcionan o no están documentados, el Parte opcional (para subir nota)Puedes completar uno o varios de los siguientes ejercicios para mejorar
1. Naked PodLevanta un Pod desde consola utilizando la imagen: ComprobaciónVerifica que el Pod está ejecutándose correctamente. LimpiezaBorra el Pod que has creado. 2. Self-Healing DeploymentCrea un Deployment con:
ComprobaciónVerifica que las 3 réplicas están corriendo. ExperimentoElimina manualmente uno de los Pods del Deployment. Pregunta: ¿Qué ocurre pasado un tiempo? Observación en tiempo realPregunta: ¿Qué comando puedes usar para ver cómo aparecen las réplicas en tiempo 3. Zero-downtime RolloutsCrea un Deployment utilizando la imagen: Actualiza la imagen del Deployment a: Pregunta: ¿Qué opciones tienes para actualizar la imagen sin eliminar el Pregunta: ¿Qué comando puedes usar para verificar el estado del rollout? 4. PersistentVolumeClaimCrea un: solicitando: de almacenamiento. Crea un Pod que monte el volumen. Dentro del Pod crea un fichero en: Comprobación
5. StorageClass (opcional)Verifica si tu cluster tiene una: Crea un volumen usando esa StorageClass. Comprueba que el volumen se ha creado correctamente. 6. Networking --- ClusterIPCrea un Deployment con la imagen: Expón el Deployment mediante un: Test de conectividadUsa un Pod con imagen: para conectarte al servicio. Pregunta: Si el Pod de busybox estuviera en otro namespace, ¿qué FQDN Pregunta: ¿Cómo podemos aislar completamente namespaces en Kubernetes? 7. Networking --- NodePort (opcional)Convierte el servicio anterior a tipo: Comprueba que 8. Networking --- Ingress Controller (opcional)Crea dos Deployments usando YAML. Usa la imagen: 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:
Expón ambos mediante servicios. Crea un Ingress con las rutas: Comprueba el funcionamiento usando: Refactoriza el Ingress para usar un Virtual Host por cada 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:
Resumen de evaluaciónNivel Requisitos Aprobado Parte obligatoria completa
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Adjunto el .md por si fuera de ayuda |
||
|
|
||
| ## 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. | ||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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