Construye la galería por lotes

KubernetesBeginner
Practicar Ahora

Introducción

Field Notes tiene veinte fotografías de jardines con licencia y necesita una pequeña galería que el personal pueda descargar. Primero probarás un grupo y después ejecutarás los cuatro grupos con un Job de Kubernetes. El último grupo solo contiene dos fotografías; aun así, necesita su propio índice de finalización correcto.

Debes conocer ya los Pods, Deployments, Services, las etiquetas, el formato YAML básico y las rutas básicas del terminal. A continuación se presentan los Jobs, los índices de finalización, este volumen compartido y los comandos de edición utilizados aquí. El clúster, la imagen del procesador, las fotografías originales, el sitio web y el almacenamiento están preparados. No necesitas escribir Python, construir una imagen ni tener una cuenta en la nube.

Usa Workspace para los comandos y Gallery para el sitio web. Ambas entradas usan una VM de formación. Mantén sin cambios los archivos proporcionados bajo starter/ e inputs/, las fotografías fuente, la referencia, el procesador, los servicios y el almacenamiento. La duración de 45 minutos es una estimación del autor que incluye la lectura y los errores habituales.

Prueba primero un grupo

En este paso, compararás un ejemplo terminado normal con su fuente y después usarás un Job de un solo índice para procesar una muestra independiente.

Abre Gallery. La página de inicio identifica su fotografía grande como Source collection · licensed garden photographs: es una entrada, no trabajo que hayas completado. Selecciona See the reference. Thumbnail es un JPEG de 320 × 220 proporcionado; Licensed source copy conserva sus proporciones originales. El recorte explica por qué sus bordes difieren. Selecciona Gallery en la navegación de la página. Inicialmente muestra 0 of 20 images available.

Cambia a Workspace. Este terminal comienza en /home/labex/project/photo-gallery. pwd muestra ese directorio de trabajo:

pwd

Si te has desplazado a otro lugar, vuelve con cd /home/labex/project/photo-gallery. Todos los nombres de archivo relativos que aparecen a continuación parten de ahí. Los archivos persisten en esta VM, pero otro laboratorio comienza con sus propios archivos y recursos de clúster independientes.

Un Deployment mantiene un servicio en ejecución. Un Job, en cambio, ejecuta Pods hasta completar un trabajo finito. El worker proporcionado procesa un grupo de fotografías y termina. En un Job indexado, Kubernetes asigna a cada finalización requerida un número que empieza en cero. El worker lee su valor nativo JOB_COMPLETION_INDEX y elige el grupo correspondiente. Tú configuras el Job en lugar de escribir el worker.

Lee el manifiesto de muestra proporcionado. cat muestra un archivo sin cambiarlo:

cat starter/sample-job.yaml

Sus campos importantes son completionMode: Indexed, completions: 1 y parallelism: 1. Solicitan solo el índice 0, con un worker concurrente deseado. restartPolicy: Never significa que un contenedor que falla permanece fallido en su Pod; la política del Job decide si se necesita otro Pod. backoffLimit: 0 significa que no hay reintentos en este ejercicio con una fuente saludable, y activeDeadlineSeconds: 180 limita la duración activa del Job. Los demás campos conectan la imagen preparada, el plan de entrada y el volumen de salida; déjalos sin cambios.

Una PersistentVolumeClaim, o PVC, solicita almacenamiento persistente. La PVC gallery-output preparada conserva los archivos después de que un worker termina. Aquí su volumen ReadWriteOnce puede montarse en varios Pods del mismo nodo. Eso no promete escritura compartida entre varios nodos. La muestra escribe en un directorio sample independiente, por lo que no puede completar silenciosamente la galería final.

Aplica la muestra. apply -f lee el archivo YAML indicado; -n selecciona el espacio de nombres, que agrupa los recursos de Kubernetes de este proyecto:

kubectl apply -n photo-workshop -f starter/sample-job.yaml

Espera a la condición nativa Complete del Job. --timeout=180s limita cuánto espera este comando; no cambia el plazo del Job:

kubectl wait -n photo-workshop --for=condition=Complete job/gallery-sample --timeout=180s

Final esperado: job.batch/gallery-sample condition met. Un tiempo de espera agotado por sí solo no demuestra un fallo: inspecciona el Job y sus registros con los comandos enseñados en el paso 3 antes de decidir qué cambiar. No vuelvas a ejecutar la preparación ni elimines los recursos proporcionados.

Cambia a Gallery, selecciona Sample y confirma 6 of 6 images available. Abre Windmill garden, compara su miniatura y su fuente y selecciona Back to sample. Selecciona Gallery en la navegación de la página: la colección final sigue vacía. Esta distinción evita confundir una práctica correcta con la entrega completa.

Planifica todos los índices de finalización

En este paso, convertirás la agrupación de entradas en un manifiesto de Job guardado. Nada de este paso inicia todavía el trabajo final.

Cambia a Workspace, comenzando en /home/labex/project/photo-gallery. Lee la correspondencia completa de entradas:

cat inputs/groups.txt

Hay cuatro líneas, de Index 0 a Index 3. Las tres primeras contienen seis fotografías cada una; el índice 3 contiene photo-19 y photo-20. completions cuenta grupos, no fotografías: esta entrega necesita 4 índices completados correctamente, no 20 ni 3.

Lee las instrucciones del personal:

cat inputs/brief.txt

Permiten un paralelismo solicitado de 1 a 2. Solicitaremos 2 para que dos grupos puedan avanzar a la vez. Kubernetes puede ejecutar menos Pods cuando no hay recursos disponibles; el paralelismo solicitado no es un límite absoluto para todos los procesos durante los reintentos o la terminación. Este proyecto usa un pequeño nodo preparado en lugar de una plataforma de procesamiento distribuido.

Copia la plantilla preparada del Job final a tu archivo editable. cp copia un archivo; deja intacta la fuente bajo starter/:

cp starter/gallery-job.yaml gallery-job.yaml

Si cp indica No such file or directory, comprueba pwd, vuelve al directorio anterior y repite la misma copia con el nombre de archivo exacto. No crees una plantilla de sustitución vacía.

Usa sed para cambiar dos valores de campo literales en el archivo copiado. -i edita ese archivo directamente. Cada expresión tiene la forma s/old/new/: sustituye el texto anterior por el nuevo. Las comillas simples hacen que el shell pase la expresión literalmente. Cada uno de estos campos exactos aparece una sola vez en esta plantilla proporcionada:

sed -i 's/completions: 1/completions: 4/' gallery-job.yaml
sed -i 's/parallelism: 1/parallelism: 2/' gallery-job.yaml

Lee el resultado guardado antes de aplicarlo:

cat gallery-job.yaml

Confirma metadata.name: gallery-batch, completionMode: Indexed, completions: 4 y parallelism: 2. Conserva la imagen del procesador preparada, el comando, el entorno, los montajes, los ajustes de recursos, la política sin reintentos y el plazo de 180 segundos. Se aceptan un formato YAML equivalente o un nombre nuevo diferente para el Job final; el archivo guardado debe describir el Job que realmente ejecutes.

Una sustitución mal escrita puede terminar correctamente sin encontrar ninguna coincidencia, por lo que es importante leer el resultado. Si aún no has aplicado el archivo, recupérate copiando de nuevo la plantilla original y repitiendo las dos ediciones. Después de aplicar un Job, evita volver a copiar un nombre que entre en conflicto: las plantillas de tarea de los Jobs son generalmente inmutables, así que prepara un nuevo nombre de Job para un intento diferente.

Ejecuta el lote completo

En este paso, aplicarás tu Job guardado y relacionarás sus evidencias nativas de finalización con los Pods de workers reales.

En Workspace, en /home/labex/project/photo-gallery, aplica el archivo guardado:

kubectl apply -n photo-workshop -f gallery-job.yaml

Espera a todos los índices requeridos:

kubectl wait -n photo-workshop --for=condition=Complete job/gallery-batch --timeout=180s

Lee el resumen nativo del Job:

kubectl get job gallery-batch -n photo-workshop

El Job completado debe mostrar 4/4 finalizaciones. describe añade detalles y eventos:

kubectl describe job gallery-batch -n photo-workshop

Busca Completion Mode: Indexed y Completed Indexes: 0-3. Un intervalo incluye ambos extremos, así que cubre los cuatro grupos, incluido el último grupo corto. Las evidencias de finalización por sí solas no demuestran que el contenido de las imágenes sea correcto; a continuación las inspeccionarás y descargarás.

Enumera solo los Pods que pertenecen a este Job. -l selecciona mediante una etiqueta. -L añade una columna que muestra otra etiqueta, en este caso el índice de finalización:

kubectl get pods -n photo-workshop -l batch.kubernetes.io/job-name=gallery-batch -L batch.kubernetes.io/job-completion-index

Espera ver Pods completados para los índices 0, 1, 2 y 3. Completed en esta tabla corresponde a la fase de éxito del Pod. Lee la salida real de sus workers. --all-pods=true incluye los Pods del Job y --prefix=true identifica qué Pod produjo cada línea:

kubectl logs -n photo-workshop job/gallery-batch --all-pods=true --prefix=true

Cada worker nombra sus fotografías asignadas e informa de salidas de 320 x 220. El índice 3 debe terminar dos fotografías. Estos registros ayudan a explicar lo ocurrido; también se comprueban los archivos reales, sus relaciones con las fuentes y los Pods que pertenecen al Job y se completaron correctamente.

Si se agota el tiempo de espera, usa describe y los mismos comandos de Pods y registros para distinguir una carga de trabajo sin terminar de una fallida. Un nombre de Job desconocido suele significar que el archivo no se aplicó o que su nombre difiere: lee gallery-job.yaml y usa ese nombre real. No borres los Pods completados ni la muestra. El siguiente laboratorio guiado enseña a recuperarse de un fallo temporal deliberado de la fuente.

Entrega imágenes reales

En este paso, inspeccionarás el sitio web completo y guardarás los dos archivos de entrega utilizables.

Cambia a Gallery, selecciona Gallery en la navegación de la página y actualiza. Confirma 20 of 20 images available. Abre Blue and yellow flowers (photo-20), del último grupo corto. Compara la miniatura con su propia fuente; no debe ser una copia repetida de otra flor. Selecciona Download thumbnail y después Back to gallery.

Galería completa de Field Notes

La galería final contiene veinte fotografías preparadas diferentes, incluidas las dos imágenes del último grupo corto. Las acciones de descarga están debajo de la colección.

En Take the collection with you, selecciona Download source index CSV y Download gallery ZIP. El CSV relaciona cada salida con el hash de su fuente, el hash de la miniatura, el creador y la página de la fuente. El ZIP contiene index.csv y los JPEG reales bajo photos/. La página informa de los archivos realmente disponibles; no regenera el trabajo que falta a partir de los originales. También se puede descargar una colección incompleta, así que verifica el resultado completo antes de entregarlo.

Selecciona Reference en la navegación de la página y confirma que el ejemplo original proporcionado sigue funcionando. Selecciona Credits para ver los creadores y los enlaces a las fuentes de Wikimedia Commons. Las fotografías son recursos de prueba con licencia CC0, no fotografías tomadas por LabEx.

Cambia a Workspace, en /home/labex/project/photo-gallery. Guarda aquí las mismas descargas reales. curl solicita una URL; --fail devuelve un error ante un fallo HTTP, --silent --show-error oculta el indicador de progreso y mantiene los errores, y -o indica el nombre del archivo de salida. El puerto 8091 permite acceder al Service de la galería preparado desde esta VM:

curl --fail --silent --show-error http://127.0.0.1:8091/download/index.csv -o gallery-index.csv
curl --fail --silent --show-error http://127.0.0.1:8091/download/gallery.zip -o gallery.zip

El navegador guarda sus descargas; estos dos comandos guardan las copias requeridas en el espacio de trabajo de la VM. Si falla una solicitud, inspecciona el sitio web y repite la solicitud después de resolver el problema. No edites un índice recibido para ocultar imágenes que faltan.

Muestra la cabecera y las dos primeras filas. head -n 3 lee las tres primeras líneas:

head -n 3 gallery-index.csv

La cabecera comienza con id,title,source_file,thumbnail,width,height. Cada fila relaciona una fotografía con su propio photos/photo-NN.jpg, con dimensiones 320,220 y sus créditos de fuente reales.

Enumera el contenido del archivo sin extraerlo. python3 -m zipfile ejecuta la utilidad ZIP estándar de Python; -l enumera los miembros:

python3 -m zipfile -l gallery.zip

Busca index.csv y las veinte rutas JPEG, incluida photos/photo-20.jpg. Los nombres o las cantidades por sí solos no pueden demostrar que las imágenes sean correctas, por lo que las comprobaciones funcionales también decodifican los JPEG reales y comparan cada uno con su propio resultado derivado de la fuente. Mantén disponibles gallery-job.yaml, ambas descargas, la muestra, los Pods completados, los archivos fuente, la referencia y los servicios preparados.

Resumen

Entregaste una galería de fotos real con un Job indexado. Relacionaste las fotografías con los índices de finalización, limitaste el paralelismo solicitado, comprobaste las evidencias nativas de Pods y Jobs y entregaste las imágenes reales con un índice de fuentes. La muestra y la referencia se mantuvieron separadas del trabajo final.