Einführung
Field Notes hat zwanzig lizenzierte Gartenfotografien und benötigt eine kleine Galerie, die das Team herunterladen kann. Du probierst zunächst eine Gruppe aus und verarbeitest anschließend alle vier Gruppen mit einem Kubernetes-Job. Die letzte Gruppe enthält nur zwei Fotografien; trotzdem benötigt sie ihren eigenen erfolgreich abgeschlossenen Index.
Du solltest Pods, Deployments, Services, Labels, einfaches YAML und grundlegende Terminalpfade bereits kennen. Jobs, Abschlussindizes, dieses gemeinsam genutzte Volume und die hier verwendeten Bearbeitungsbefehle werden im Folgenden eingeführt. Cluster, Verarbeitungsimage, Originalfotografien, Website und Speicher sind vorbereitet. Du musst weder Python schreiben noch ein Image bauen oder ein Cloud-Konto besitzen.
Verwende Workspace für Befehle und Gallery für die Website. Beide Zugänge verwenden eine Trainings-VM. Lasse die bereitgestellten Dateien unter starter/ und inputs/, die Quellfotografien, die Referenz, das Verarbeitungsprogramm, die Services und den Speicher unverändert. Die Dauer von 45 Minuten ist eine Schätzung des Autors, die Lesen und gewöhnliche Fehler einschließt.
Zuerst eine Gruppe ausprobieren
In diesem Schritt vergleichst du ein normales fertiges Beispiel mit seiner Quelle und verarbeitest anschließend mit einem Job mit einem einzigen Index ein separates Muster.
Öffne Gallery. Die Startseite kennzeichnet ihre große Fotografie mit Source collection · licensed garden photographs: Sie ist eine Eingabe und kein von dir fertiggestelltes Ergebnis. Wähle See the reference. Das Thumbnail ist ein bereitgestelltes JPEG mit 320 × 220 Pixeln; die Licensed source copy behält ihre ursprünglichen Proportionen. Der Zuschnitt erklärt, warum sich ihre Ränder unterscheiden. Wähle Gallery in der Seitennavigation. Anfangs erscheint dort 0 of 20 images available.
Wechsle zu Workspace. Dieses Terminal startet in /home/labex/project/photo-gallery. pwd gibt dieses Arbeitsverzeichnis aus:
pwd
Falls du in ein anderes Verzeichnis gewechselt bist, kehre mit cd /home/labex/project/photo-gallery zurück. Alle folgenden relativen Dateinamen gehen von dort aus. Dateien bleiben in dieser VM erhalten, ein anderes Lab beginnt jedoch mit eigenen unabhängigen Dateien und Clusterressourcen.
Ein Deployment hält einen Service am Laufen. Ein Job führt dagegen Pods aus, bis eine endliche Aufgabe abgeschlossen ist. Unser bereitgestellter Worker verarbeitet eine Gruppe von Fotografien und beendet sich. Bei einem Indexed Job weist Kubernetes jedem erforderlichen Abschluss eine Nummer zu, beginnend bei null. Der Worker liest seinen nativen Wert JOB_COMPLETION_INDEX und wählt die entsprechende Gruppe aus. Du konfigurierst den Job, statt den Worker zu schreiben.
Lies das bereitgestellte Mustermanifest. cat zeigt eine Datei an, ohne sie zu verändern:
cat starter/sample-job.yaml
Seine wichtigen Felder sind completionMode: Indexed, completions: 1 und parallelism: 1. Sie fordern ausschließlich Index 0 an, mit einem gewünschten gleichzeitig laufenden Worker. restartPolicy: Never bedeutet, dass ein fehlgeschlagener Container in seinem Pod fehlgeschlagen bleibt; die Job-Richtlinie entscheidet, ob ein weiterer Pod benötigt wird. backoffLimit: 0 bedeutet in dieser Übung mit funktionierender Quelle keine Wiederholung, und activeDeadlineSeconds: 180 begrenzt die aktive Lebensdauer des Jobs. Die übrigen Felder verbinden das vorbereitete Image, den Eingabeplan und das Ausgabe-Volume; lasse sie unverändert.
Ein PersistentVolumeClaim, kurz PVC, fordert dauerhaften Speicher an. Der vorbereitete PVC gallery-output bewahrt Dateien auf, nachdem ein Worker beendet ist. Sein ReadWriteOnce-Volume kann hier von mehreren Pods auf demselben Knoten eingebunden werden. Das verspricht kein gemeinsames Schreiben über mehrere Knoten hinweg. Das Muster schreibt in ein separates Verzeichnis sample, sodass es die endgültige Galerie nicht unbemerkt füllen kann.
Wende das Muster an. apply -f liest die benannte YAML-Datei; -n wählt den Namespace aus, der die Kubernetes-Ressourcen dieses Projekts zusammenfasst:
kubectl apply -n photo-workshop -f starter/sample-job.yaml
Warte auf die native Bedingung Complete des Jobs. --timeout=180s begrenzt, wie lange dieser Befehl wartet; die Frist des Jobs wird dadurch nicht geändert:
kubectl wait -n photo-workshop --for=condition=Complete job/gallery-sample --timeout=180s
Erwartetes Ende: job.batch/gallery-sample condition met. Eine Zeitüberschreitung allein beweist keinen Fehlschlag: Untersuche den Job und seine Logs mit den in Schritt 3 erklärten Befehlen, bevor du entscheidest, was du änderst. Führe das Setup nicht erneut aus und lösche die bereitgestellten Ressourcen nicht.
Wechsle zu Gallery, wähle Sample und bestätige 6 of 6 images available. Öffne Windmill garden, vergleiche das Vorschaubild mit der Quelle und wähle Back to sample. Wähle Gallery in der Seitennavigation: Die endgültige Sammlung ist weiterhin leer. Diese Unterscheidung verhindert, dass ein erfolgreicher Probelauf mit der vollständigen Lieferung verwechselt wird.
Jeden Abschlussindex planen
In diesem Schritt überträgst du die Gruppierung der Eingaben in ein gespeichertes Job-Manifest. Noch keine Operation in diesem Schritt startet die endgültige Verarbeitung.
Wechsle zu Workspace, beginnend in /home/labex/project/photo-gallery. Lies die vollständige Eingabezuordnung:
cat inputs/groups.txt
Es gibt vier Zeilen, von Index 0 bis Index 3. Die ersten drei enthalten jeweils sechs Fotografien; Index 3 enthält photo-19 und photo-20. completions zählt Gruppen und keine Fotografien: Diese Lieferung benötigt 4 erfolgreiche Indizes, nicht 20 und nicht 3.
Lies den Auftrag des Teams:
cat inputs/brief.txt
Er erlaubt eine angeforderte Parallelität von 1 bis 2. Wir fordern 2 an, damit zwei Gruppen gleichzeitig vorankommen können. Kubernetes kann weniger Pods ausführen, solange Ressourcen nicht verfügbar sind; die angeforderte Parallelität ist keine absolute Grenze für jeden Prozess während Wiederholungen oder Beendigungen. Dieses Projekt verwendet einen kleinen vorbereiteten Knoten und keine verteilte Verarbeitungsplattform.
Kopiere die vorbereitete Vorlage für den endgültigen Job in deine bearbeitbare Datei. cp kopiert eine Datei und lässt die Quelle unter starter/ intakt:
cp starter/gallery-job.yaml gallery-job.yaml
Falls cp No such file or directory meldet, prüfe pwd, kehre in das oben genannte Verzeichnis zurück und wiederhole denselben Kopiervorgang mit dem genauen Dateinamen. Erstelle keine leere Ersatzvorlage.
Ändere mit sed zwei wörtliche Feldwerte in der kopierten Datei. -i bearbeitet diese Datei direkt. Jeder Ausdruck hat die Form s/old/new/: Ersetze den alten Text durch den neuen Text. Einfache Anführungszeichen sorgen dafür, dass die Shell den Ausdruck wörtlich weitergibt. Diese genauen Felder kommen in dieser bereitgestellten Vorlage jeweils einmal vor:
sed -i 's/completions: 1/completions: 4/' gallery-job.yaml
sed -i 's/parallelism: 1/parallelism: 2/' gallery-job.yaml
Lies das gespeicherte Ergebnis, bevor du es anwendest:
cat gallery-job.yaml
Bestätige metadata.name: gallery-batch, completionMode: Indexed, completions: 4 und parallelism: 2. Behalte das vorbereitete Verarbeitungsimage, den Befehl, die Umgebung, die Einbindungen, die Ressourceneinstellungen, die Richtlinie ohne Wiederholungen und die Frist von 180 Sekunden bei. Gleichwertige YAML-Formatierung oder ein anderer neuer Name für den endgültigen Job sind zulässig; die gespeicherte Datei muss den Job beschreiben, den du tatsächlich ausführst.
Ein falsch geschriebener Ersetzungsausdruck kann erfolgreich enden, ohne etwas zu treffen; deshalb ist das Lesen des Ergebnisses wichtig. Falls du die Datei noch nicht angewendet hast, stelle sie wieder her, indem du die ursprüngliche Vorlage erneut kopierst und die beiden Änderungen wiederholst. Vermeide nach dem Anwenden eines Jobs das erneute Kopieren mit einem widersprüchlichen Namen: Aufgabenvorlagen von Jobs sind im Allgemeinen unveränderlich, bereite für einen anderen Versuch daher einen neuen Job-Namen vor.
Die vollständige Stapelverarbeitung ausführen
In diesem Schritt wendest du deinen gespeicherten Job an und verknüpfst seine nativen Abschlussbelege mit den tatsächlichen Worker-Pods.
Wende in Workspace, unter /home/labex/project/photo-gallery, die gespeicherte Datei an:
kubectl apply -n photo-workshop -f gallery-job.yaml
Warte auf alle erforderlichen Indizes:
kubectl wait -n photo-workshop --for=condition=Complete job/gallery-batch --timeout=180s
Lies die native Job-Zusammenfassung:
kubectl get job gallery-batch -n photo-workshop
Der abgeschlossene Job sollte 4/4 Abschlüsse anzeigen. describe ergänzt Details und Events:
kubectl describe job gallery-batch -n photo-workshop
Suche nach Completion Mode: Indexed und Completed Indexes: 0-3. Ein Bereich schließt beide Enden ein; damit sind alle vier Gruppen einschließlich der kurzen letzten Gruppe abgedeckt. Abschlussbelege allein weisen keine korrekten Bildinhalte nach; diese prüfst du anschließend und lädst sie herunter.
Liste nur Pods auf, die zu diesem Job gehören. -l wählt anhand eines Labels aus. -L ergänzt eine Spalte für ein weiteres Label, hier den Abschlussindex:
kubectl get pods -n photo-workshop -l batch.kubernetes.io/job-name=gallery-batch -L batch.kubernetes.io/job-completion-index
Erwarte abgeschlossene Pods für die Indizes 0, 1, 2 und 3. Completed in dieser Tabelle entspricht der erfolgreichen Phase des Pods. Lies ihre tatsächliche Worker-Ausgabe. --all-pods=true schließt die Pods des Jobs ein, und --prefix=true kennzeichnet, welcher Pod die jeweilige Zeile erzeugt hat:
kubectl logs -n photo-workshop job/gallery-batch --all-pods=true --prefix=true
Jeder Worker nennt seine zugewiesenen Fotografien und meldet Ausgaben mit 320 x 220 Pixeln. Index 3 sollte zwei Fotografien fertigstellen. Diese Logs helfen zu erklären, was geschehen ist; zusätzlich werden die tatsächlichen Dateien, ihre Quellbeziehungen und die erfolgreichen, zum Job gehörenden Pods geprüft.
Wenn die Wartezeit überschritten wird, verwende describe und dieselben Pod-/Log-Befehle, um eine noch nicht fertige von einer fehlgeschlagenen Verarbeitung zu unterscheiden. Ein unbekannter Job-Name bedeutet meist, dass die Datei nicht angewendet wurde oder ihr Name abweicht: Lies gallery-job.yaml und verwende diesen tatsächlichen Namen. Lösche weder abgeschlossene Pods noch das Muster. Das nächste geführte Lab erklärt die Wiederherstellung nach einem absichtlich herbeigeführten vorübergehenden Quellfehler.
Echte Bilder übergeben
In diesem Schritt prüfst du die vollständige Website und speicherst beide nutzbaren Übergabedateien.
Wechsle zu Gallery, wähle Gallery in der Seitennavigation und aktualisiere die Seite. Bestätige 20 of 20 images available. Öffne Blue and yellow flowers (photo-20) aus der kurzen letzten Gruppe. Vergleiche das Vorschaubild mit seiner eigenen Quelle; es darf keine wiederholte Kopie einer anderen Blume sein. Wähle Download thumbnail und dann Back to gallery.

Die endgültige Galerie enthält zwanzig unterschiedliche aufbereitete Fotografien, einschließlich der beiden Bilder der kurzen letzten Gruppe. Die Download-Aktionen befinden sich unterhalb der Sammlung.
Wähle unter Take the collection with you die Aktionen Download source index CSV und Download gallery ZIP. Die CSV-Datei ordnet jede Ausgabe ihrem Quellhash, Vorschaubildhash, Urheber und ihrer Quellseite zu. Die ZIP-Datei enthält index.csv und die tatsächlichen JPEGs unter photos/. Die Seite meldet tatsächlich verfügbare Dateien; sie erzeugt fehlende Arbeit nicht aus den Originalen neu. Auch eine unvollständige Sammlung kann heruntergeladen werden, prüfe deshalb vor der Übergabe das vollständige Ergebnis.
Wähle Reference in der Seitennavigation und bestätige, dass das ursprünglich bereitgestellte Beispiel weiterhin funktioniert. Wähle Credits, um die Urheber und die Quelllinks zu Wikimedia Commons zu sehen. Die Fotografien sind unter CC0 lizenzierte Übungsdateien und keine von LabEx aufgenommenen Fotografien.
Wechsle zu Workspace, unter /home/labex/project/photo-gallery. Speichere hier dieselben echten Downloads. curl ruft eine URL auf; --fail gibt bei einem HTTP-Fehlschlag einen Fehler zurück, --silent --show-error blendet die Fortschrittsanzeige aus und behält Fehlermeldungen bei, und -o benennt die Ausgabedatei. Der Port 8091 erreicht von dieser VM aus den vorbereiteten Galerie-Service:
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
Browserdownloads werden vom Browser gespeichert; diese beiden Befehle speichern die im VM-Arbeitsbereich erforderlichen Kopien. Falls eine Anfrage fehlschlägt, untersuche die Website und wiederhole die Anfrage, nachdem du das Problem behoben hast. Bearbeite keinen empfangenen Index, um fehlende Bilder zu verbergen.
Zeige die Kopfzeile und die ersten beiden Datenzeilen an. head -n 3 liest die ersten drei Zeilen:
head -n 3 gallery-index.csv
Die Kopfzeile beginnt mit id,title,source_file,thumbnail,width,height. Jede Zeile ordnet eine Fotografie ihrer eigenen Datei photos/photo-NN.jpg zu, mit den Abmessungen 320,220 und ihrer tatsächlichen Quellenangabe.
Liste das Archiv auf, ohne es zu entpacken. python3 -m zipfile führt Pythons Standard-ZIP-Werkzeug aus; -l listet die Mitglieder auf:
python3 -m zipfile -l gallery.zip
Suche index.csv und alle zwanzig JPEG-Pfade einschließlich photos/photo-20.jpg. Namen oder Anzahlen allein können die Korrektheit der Bilder nicht beweisen; deshalb decodieren die Funktionsprüfungen auch tatsächliche JPEGs und vergleichen jedes mit seinem eigenen, aus der Quelle abgeleiteten Ergebnis. Halte gallery-job.yaml, beide Downloads, das Muster, abgeschlossene Pods, Quelldateien, die Referenz und die vorbereiteten Services verfügbar.
Zusammenfassung
Du hast mit einem Indexed Job eine echte Fotogalerie geliefert. Du hast Fotografien Abschlussindizes zugeordnet, die angeforderte Parallelität begrenzt, native Pod- und Job-Belege geprüft und tatsächliche Bilder mit einem Quellenindex übergeben. Muster und Referenz blieben von der endgültigen Arbeit getrennt.



