Erstelle ein Kubernetes-Erklärvideo
Die Ausgabe ist ein MP4 für einen Vortrag: grafisch, animiert, fast kein Text, keine Untertitel.
Argument voiceover=on|off (Standard on). on vertont mit der lokalen Kokoro-TTS-Stimme; off erstellt ein stummes Video und installiert oder lädt Kokoro nie.
Argument setup: nur Installation, kein Video. Führe den Schritt "Umgebung prüfen" unten aus und stoppe dann.
Zwei Ordner. SKILL ist das Basisverzeichnis des Skills (der Ordner, der diese Datei enthält). Er enthält .venv/, icons/, references/ und scripts/. OUT ist <das Arbeitsverzeichnis des Benutzers>/<Thema>, wird pro Video erstellt. Die Szenendatei, media/ und das endgültige MP4 befinden sich in OUT, niemals in SKILL (Aktualisieren oder Entfernen des Skills löscht SKILL). Verwende absolute Pfade; verlasse dich nicht auf das aktuelle Verzeichnis.
Was mit diesem Skill geliefert wird
icons/: die offiziellen Kubernetes-Community-Icons (beschriftetes Set, CC-BY-4.0). Verwende ausschließlich diese Icons für Kubernetes-Komponenten und -Ressourcen. Zeichne sie nie neu, färbe sie in etwas anderes um oder ersetze eine Komponente, die hier ein Icon hat, durch eine generische Form. Für Konzepte ohne Icon (CSR, Zertifikat, Paket, iptables-Regeln) verwende einfache Formen wieDocundPacketaus der Referenz.references/node_join.py: ein vollständiges, genehmigtes Beispiel (kubeadm-Knotenbeitritt). Kopiere dessen Stil, Farbpalette und Hilfsklassen.references/kokoro_service.py: Kokoro-82M eingebunden in manim-voiceover.references/kit.py: gemeinsame Palette, Helfer und dieExplainer-Basis-Szene sowievoiced(Scene). Neue Szenen importieren daraus.scripts/setup.sh [voiceover=on|off] [--yes]: meldet, was fehlt, und gibt den Installationsplan aus (macOS, Arch, Debian/Ubuntu); installiert nur mit--yes.
| Datei | Komponente | Datei | Komponente | Datei | Komponente |
|---|---|---|---|---|---|
| api | kube-apiserver | pod | Pod | cm | ConfigMap |
| etcd | etcd | rs | ReplicaSet | secret | Secret |
| sched | kube-scheduler | deploy | Deployment | pv | PersistentVolume |
| c-m | kube-controller-manager | sts | StatefulSet | pvc | PersistentVolumeClaim |
| c-c-m | cloud-controller-manager | ds | DaemonSet | sc | StorageClass |
| kubelet | kubelet | job | Job | ns | Namespace |
| k-proxy | kube-proxy | cronjob | CronJob | sa | ServiceAccount |
| control-plane | Steuerungsebene-Knoten | svc | Service | role / c-role | Role / ClusterRole |
| node | Worker-Knoten | ep | Endpoints | rb / crb | RoleBinding / ClusterRoleBinding |
| hpa | HorizontalPodAutoscaler | ing | Ingress | quota | ResourceQuota |
| crd | CustomResourceDefinition | netpol | NetworkPolicy | limits | LimitRange |
Manim entfernt den in diese SVGs eingebetteten Text, und api, c-m, sched, kubelet, k-proxy teilen sich dasselbe Zahnrad-Symbol. Beschrifte Icons immer mit dem Icon(name, label)-Helfer.
Arbeitsablauf
1. Umgebung prüfen
Führe bash SKILL/scripts/setup.sh voiceover=<on|off> aus. Wenn es Ready. ausgibt, fahre fort. Andernfalls wurde ausgegeben, was fehlt, und der Plan (erster Lauf auf diesem Rechner): Zeige dem Benutzer den Plan an und frage vor der Installation.
- Bei Bestätigung führe es erneut mit
--yesaus. Es ist langsam (torch, Systempakete), also führe es im Hintergrund oder mit einem langen Timeout aus. - Wenn der Plan eine
sudo-Zeile enthält und du das Passwort nicht eingeben kannst: Gib dem Benutzer den Befehl, den er selbst ausführen soll (! bash SKILL/scripts/setup.sh voiceover=<on|off> --yes). - Kokoro ist kostenlos, Apache-2.0 (geeignet für bezahlte Kurse), offline und nahezu kommerzielle Qualität; wenn der Benutzer es nicht möchte, schlage
voiceover=offvor.
2. Storyboard abstimmen
Frage nach dem Thema, falls es nicht angegeben wurde. Schlage dann ein Storyboard im Chat vor und warte auf Genehmigung, da das Rendern Minuten dauert:
- 6–12 Szenen, jede mit: einer 1–3 Wörter umfassenden Schritthezeichnung, was sich auf dem Bildschirm bewegt, einem gesprochenen Satz.
- Geschichte durch Bewegung erzählt: Icons in Kästchen, Pakete auf Bögen, Farbänderungen für Zustände. Nur kurze Beschriftungen auf dem Bildschirm.
- Fakten müssen für die aktuelle Kubernetes-Version korrekt sein. Wenn du dir bei einem Detail unsicher bist, sage es, anstatt zu raten.
3. Szene schreiben
Modelliere sie nach references/node_join.py:
- Ein
NARRATION-Wörterbuch (Szene → Satz) als Klassenattribut, eine Methode pro Szene;Explainer.constructdurchläuft sie innerhalb vonwith self.voice(line). - Schreibe
OUT/<Thema>.pymitfrom references.kit import *, erstelle eine Unterklasse vonExplainerund füge am Ende<Name>Voiced = voiced(<Name>)hinzu. Szenen sinddef beat(self, i). Die stumme<Name>und die vertonte<Name>Voicedstammen aus demselben Code. - Benenne die Szenendatei niemals nach einem stdlib-Modul (
operator.pyunterbricht Pythons Importe). - Verwende die Palette wiederverwenden (dunkel
#0b1220, k8s-blau#326ce5, goldener Token, teal Netzwerk, amber NotReady, grün Ready) und die HelferIcon,Packet,Doc,Step,Pill,send. - Kleine Klassen, minimaler Code.
- Schreibe Begriffe so, wie sie in der Erzählung gesprochen werden: kubeadm → "kube admin", etcd → "et-cee-dee", kubectl → "kube control".
4. Vorschau, dann rendern
Führe manim aus als PYTHONPATH=SKILL SKILL/.venv/bin/manim --media_dir OUT/media ... von OUT aus.
- Vorschau:
... -ql <Thema>.py <Name>, extrahiere dann mit ffmpeg etwa 8 Frames in ein Kontaktblatt und betrachte es einmal. Behebe Überlappungen, abgeschnittene Beschriftungen und dunklen oder unlesbaren Text. - Endgültiges Rendern:
... -qh <Thema>.py <Name>wennvoiceover=off, oder<Name>Voicedwennvoiceover=on. KopiereOUT/media/videos/<Thema>/1080p60/<Name>.mp4nachOUT/<Thema>.mp4. - Mit
voiceover=onbestätige, dass das MP4 einen Audiostream hat (ffprobe). - Öffne das MP4, wenn du fertig bist (
openauf macOS;xdg-openauf Linux, oder wenn es kein Display gibt, gib einfach den Pfad aus).
Melde den absoluten MP4-Pfad, die Dauer, worauf zu achten ist (Aussprache ungewöhnlicher Begriffe) und erinnere den Benutzer daran, dass die Icons die Quellenangabe "Kubernetes community icons, CC BY 4.0" benötigen (der Abspann zeigt sie bereits). Sprachoptionen: af_heart (Standard), am_michael, am_fenrir; übergib eine als voiced(<Name>, voice="am_michael").