Termina un lote tras fallos temporales

KubernetesBeginner
Practicar Ahora

Introducción

Field Notes tiene una galería parcialmente preparada. Un grupo recibió un HTTP 503 temporal de su fuente, mientras los otros grupos terminaron. Conservarás esas evidencias del fallo, ejecutarás un nuevo Job con un pequeño margen de reintentos y entregarás la colección completa sin volver a escribir los JPEG que ya son correctos.

Esta VM independiente incluye sus propias veinte fotografías fuente, almacenamiento compartido, sitio web, Job fallido y salidas parciales. No necesitas archivos de la VM anterior. Completa primero Construye la galería por lotes, o maneja con soltura su Job indexado, la copia y edición de YAML, la inspección de Pods y el procedimiento de descarga. La duración de 40 minutos es una estimación del autor.

Usa Workspace para los comandos y Gallery para el sitio web. Conserva los archivos proporcionados, las imágenes fuente y de referencia, el procesador, el plan, los servicios, la PVC, el Job first-try original y sus Pods y registros.

Recupera el grupo de fotos fallido

En este paso, relacionarás la galería incompleta con el índice fallido nativo antes de elegir una política de recuperación.

Abre Gallery, selecciona Open the gallery y confirma 14 of 20 images available. Los grupos primero, tercero y cuarto han terminado; faltan las seis fotografías del grupo 1. Abre Reference en la navegación de la página para ver el ejemplo normal proporcionado y después cambia a Workspace.

El terminal comienza en /home/labex/project/photo-gallery. Usa pwd para confirmarlo; si es necesario, vuelve con cd /home/labex/project/photo-gallery. Lee la correspondencia de grupos y las instrucciones del personal:

cat inputs/groups.txt
cat inputs/brief.txt

Hay cuatro grupos numerados desde cero. El índice 1 contiene de photo-07 a photo-12. Inspecciona el intento conservado:

kubectl describe job first-try -n photo-workshop

Busca Completion Mode: Indexed, Completed Indexes: 0,2,3, un Pod fallido en Pods Statuses y la advertencia FailedIndexes bajo Events. Los índices completados y la tabla de Pods de abajo identifican el grupo que falta. Lee su política en la fuente proporcionada:

cat starter/first-try.yaml

backoffLimitPerIndex: 0 no permite ningún reemplazo después de un fallo en un índice. backoffLimit: 6 es un presupuesto global de fallos independiente: no anula un margen de cero por índice. activeDeadlineSeconds: 180 es el límite de duración activa. El Job permanece fallido aunque varios índices hayan tenido éxito.

Enumera sus Pods reales y sus etiquetas de índice:

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

Lee todos sus registros:

kubectl logs -n photo-workshop job/first-try --all-pods=true --prefix=true

El Pod del índice 1 informa Source returned HTTP 503 y termina; los otros grupos informan de sus fotografías completadas. HTTP 503 significa que la fuente respondió, pero no estaba disponible temporalmente. Difiere de un Pod ausente, un fallo de conexión o un JPEG ilegible.

Copia el nombre completo del Pod del índice 1 de la tabla al siguiente comando, sustituyendo POD_NAME en lugar de escribir literalmente el marcador de posición:

kubectl describe pod POD_NAME -n photo-workshop

Su contenedor terminado muestra Exit Code: 42. Es la respuesta deliberada del worker proporcionado al error HTTP de la fuente, no un código de error HTTP general de Kubernetes. El escenario produce un 503 real para la primera solicitud del índice 1 de cada nuevo Job. El siguiente Pod de reemplazo de ese mismo índice puede leer la fuente correctamente. Este es un ejercicio controlado de fallo temporal, no una afirmación de que todo 503 de producción pueda reintentarse de forma segura.

Conserva el Job fallido, sus Pods y registros, y los catorce JPEG correctos existentes. El procesador solo escribe un JPEG idéntico cuando es necesario; conserva los bytes de imagen que ya coinciden y sus metadatos de archivo. Los comprobantes por Pod y los registros del índice de imágenes pueden actualizarse para identificar el nuevo intento correcto.

Da a cada índice un número finito de reintentos

Ahora crea un nuevo Job con un reintento permitido por índice. No intentes convertir el Job ya fallido en una nueva ejecución.

En Workspace, en /home/labex/project/photo-gallery, copia el borrador de recuperación proporcionado:

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

Como en el laboratorio anterior, cp conserva la fuente intacta. Si no se encuentra la fuente, confirma pwd, vuelve al espacio de trabajo y repite la copia exacta. Lee el borrador:

cat gallery-job.yaml

Ya solicita los cuatro índices con paralelismo 2, pero tiene el nombre provisional gallery-draft y ningún reintento por índice. Usa sed -i para sustituir cada valor literal en tu archivo copiado; las comillas simples protegen las expresiones de sustitución frente a la interpretación del shell:

sed -i 's/name: gallery-draft/name: gallery-retry/' gallery-job.yaml
sed -i 's/backoffLimitPerIndex: 0/backoffLimitPerIndex: 1/' gallery-job.yaml

Vuelve a leer el archivo:

cat gallery-job.yaml

Confirma name: gallery-retry, completions: 4, parallelism: 2 y backoffLimitPerIndex: 1. Conserva backoffLimit: 6, activeDeadlineSeconds: 180 y todos los ajustes proporcionados del procesador, los montajes, la identidad y los recursos. Esta tarea acepta uno o dos reintentos por índice, pero basta con un pequeño margen finito. Eliminar el plazo o permitir reintentos ilimitados ocultaría un problema persistente.

Un nuevo Job tiene una nueva identidad de Kubernetes. Puede procesar grupos que ya tuvieron éxito; el worker proporcionado maneja esta ejecución repetida sin volver a escribir los JPEG coincidentes. No deduzcas un procesamiento exactamente una vez a partir de un Job correcto. Conservar el Job fallido anterior también mantiene visible el motivo de esta recuperación. Si una edición no encontró coincidencia, vuelve a copiar y corrige el borrador antes de aplicarlo. Si ya creaste un Job final inadecuado, conserva sus evidencias y prepara un nombre nuevo diferente en el archivo guardado en lugar de cambiar una plantilla de Pod inmutable o eliminar first-try.

Aplica el nuevo Job guardado:

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

Espera a que se complete correctamente:

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

Inspecciona sus índices y su política:

kubectl describe job gallery-retry -n photo-workshop

Espera ver Completed Indexes: 0-3. El comando wait anterior ya ha confirmado la condición nativa Complete. Enumera los Pods reales:

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

El índice 1 tiene ahora un Pod fallido y otro Pod de reemplazo completado para el mismo índice. El Pod fallido es una evidencia esperada de esta prueba controlada. Lee su salida:

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

Debes ver el HTTP 503 real, seguido del procesamiento correcto en su reemplazo. Los otros grupos informan Kept para los JPEG que ya coincidían. Si se agota el tiempo de espera, inspecciona el nuevo Job y los registros de los Pods; no borres el fallo anterior, no restablezcas la preparación ni aumentes los límites de reintentos a ciegas. El paralelismo solicitado es un ajuste de concurrencia deseada, no una garantía absoluta del número de procesos durante el reemplazo.

Entrega la colección recuperada

En este paso, demostrarás que el reintento produjo la galería completa utilizable y guardarás sus descargas actuales.

Cambia a Gallery, selecciona Gallery en la navegación de la página y actualiza. Confirma 20 of 20 images available. Abre Black-and-white blossoms (photo-07), la primera fotografía del grupo recuperado, y compárala con su propia fuente. Selecciona Download thumbnail y Back to gallery. Abre también Blue and yellow flowers (photo-20), del último grupo corto.

Colección de Field Notes recuperada

La colección recuperada incluye ahora las seis fotografías que faltaban y el último grupo corto. La página sigue enlazando a la referencia sin cambios y a las fuentes con licencia.

Vuelve a la galería y usa Download source index CSV y Download gallery ZIP. Selecciona Reference para confirmar que el ejemplo proporcionado permanece intacto y Credits para comprobar la atribución de las fuentes. El sitio solo muestra las salidas reales legibles de los workers; no completa las imágenes que faltan a partir de la colección fuente.

Cambia a Workspace, en /home/labex/project/photo-gallery. Guarda los archivos reales actuales de entrega con las mismas opciones enseñadas en el primer laboratorio:

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

Inspecciona la cabecera del CSV y las primeras filas:

head -n 3 gallery-index.csv

Enumera el contenido del archivo de forma segura sin extraerlo:

python3 -m zipfile -l gallery.zip

Contiene index.csv y veinte JPEG reales, incluidos el grupo recuperado y photos/photo-20.jpg. Los hashes de fuente y miniatura relacionan cada fotografía con su propio resultado; los nombres de archivo por sí solos no bastan.

Por último, confirma que ambos intentos siguen disponibles:

kubectl get jobs -n photo-workshop

El first-try original está fallido y el nuevo gallery-retry está completo. Este es el estado final previsto. Deja disponibles el manifiesto guardado, las descargas, los Pods completados correctamente y los fallidos, los catorce JPEG originales, las fuentes y la referencia. Si una descarga falla o está incompleta, corrige la carga de trabajo o el servicio y descarga de nuevo; no repares a mano los archivos recibidos.

Resumen

Diagnosticaste un fallo parcial de un Job indexado, conservaste sus evidencias nativas y usaste un nuevo Job con reintentos finitos por índice para terminar la colección real. Ahora coinciden los archivos derivados de las fuentes, los JPEG originales correctos, la galería en ejecución, el manifiesto guardado y la entrega.