Crear un video explicativo de Kubernetes
El resultado es un MP4 para una conferencia: gráfico, animado, casi sin texto y sin subtítulos.
Argumento voiceover=on|off (por defecto on). on narra con la voz local de Kokoro TTS; off genera un video silencioso y nunca instala ni carga Kokoro.
Argumento setup: solo instala, no genera video. Realiza el paso "Verificar el entorno" que se indica a continuación y luego detente.
Dos carpetas. SKILL es el directorio base de la habilidad (la carpeta que contiene este archivo). Contiene .venv/, icons/, references/ y scripts/. OUT es <directorio de trabajo del usuario>/<tema>, creado por video. El archivo de escena, media/ y el MP4 final residen en OUT, nunca en SKILL (actualizar o eliminar la habilidad borra SKILL). Usa rutas absolutas; no confíes en el directorio actual.
Qué incluye esta habilidad
icons/: los iconos oficiales de la comunidad de Kubernetes (conjunto etiquetado, CC-BY-4.0). Usa solo estos iconos para componentes y recursos de Kubernetes. Nunca los redibujes, recolorees ni sustituyas con formas genéricas para un componente que tenga un icono aquí. Para conceptos sin icono (CSR, certificado, paquete, reglas iptables), usa formas simples comoDocyPacketde la referencia.references/node_join.py: un ejemplo completo y aprobado (kubeadm node join). Copia su estilo, paleta y clases auxiliares.references/kokoro_service.py: Kokoro-82M integrado con manim-voiceover.references/kit.py: paleta compartida, ayudantes y la escena baseExplainermásvoiced(Scene). Las nuevas escenas importan desde aquí.scripts/setup.sh [voiceover=on|off] [--yes]: informa qué falta y muestra el plan de instalación (macOS, Arch, Debian/Ubuntu); solo instala con--yes.
| archivo | componente | archivo | componente | archivo | componente |
|---|---|---|---|---|---|
| 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 | nodo de plano de control | svc | Service | role / c-role | Role / ClusterRole |
| node | nodo trabajador | ep | Endpoints | rb / crb | RoleBinding / ClusterRoleBinding |
| hpa | HorizontalPodAutoscaler | ing | Ingress | quota | ResourceQuota |
| crd | CustomResourceDefinition | netpol | NetworkPolicy | limits | LimitRange |
Manim elimina el texto incrustado en estos SVG, y api, c-m, sched, kubelet, k-proxy comparten el mismo glifo de engranaje. Siempre etiqueta los iconos con el ayudante Icon(name, label).
Flujo de trabajo
1. Verificar el entorno
Ejecuta bash SKILL/scripts/setup.sh voiceover=<on|off>. Si imprime Ready., continúa. De lo contrario, imprime qué falta y el plan (primera ejecución en esta máquina): muestra el plan al usuario y pide confirmación antes de instalar.
- Tras la confirmación, ejecútalo de nuevo con
--yes. Es lento (torch, paquetes del sistema), así que ejecútalo en segundo plano o con un timeout largo. - Si el plan tiene una línea
sudoy no puedes escribir la contraseña: dale al usuario el comando para que lo ejecute él mismo (! bash SKILL/scripts/setup.sh voiceover=<on|off> --yes). - Kokoro es gratuito, Apache-2.0 (válido para cursos de pago), offline y de calidad casi comercial; si el usuario no lo quiere, sugiere
voiceover=off.
2. Acordar el guion gráfico
Pregunta por el tema si no se ha proporcionado. Luego propón un guion gráfico en el chat y espera la aprobación, porque el renderizado lleva minutos:
- 6–12 tiempos, cada uno con: una etiqueta de paso de 1–3 palabras, qué se mueve en pantalla, una oración hablada.
- Historia contada mediante movimiento: iconos en cajas, paquetes en arcos, cambios de color para estados. Solo etiquetas cortas en pantalla.
- Los datos deben ser correctos para la versión actual de Kubernetes. Si no estás seguro de un detalle, dilo en lugar de adivinar.
3. Escribir la escena
Modélala en references/node_join.py:
- Un diccionario
NARRATION(tiempo → oración) como atributo de clase, un método por tiempo;Explainer.constructitera sobre ellos dentro dewith self.voice(line). - Escribe
OUT/<tema>.pyconfrom references.kit import *, subclase deExplainer, y añade<Nombre>Voiced = voiced(<Nombre>)al final. Los tiempos sondef beat(self, i). El<Nombre>silencioso y el<Nombre>Voicednarrado provienen del mismo código. - Nunca nombres el archivo de escena como un módulo de la stdlib (
operator.pyrompe las importaciones de Python). - Reutiliza la paleta (fondo oscuro
#0b1220, azul k8s#326ce5, token dorado, red verde azulado, ámbar NotReady, verde Ready) y los ayudantesIcon,Packet,Doc,Step,Pill,send. - Clases pequeñas, código mínimo.
- Escribe los términos como se pronuncian en la narración: kubeadm → "kube admin", etcd → "et-cee-dee", kubectl → "kube control".
4. Previsualizar, luego renderizar
Ejecuta manim como PYTHONPATH=SKILL SKILL/.venv/bin/manim --media_dir OUT/media ... desde OUT.
- Previsualización:
... -ql <tema>.py <Nombre>, luego extrae ~8 cuadros con ffmpeg en una hoja de contactos y revísala una vez. Corrige superposiciones, etiquetas recortadas y texto oscuro o ilegible. - Renderizado final:
... -qh <tema>.py <Nombre>cuandovoiceover=off, o<Nombre>Voicedcuandovoiceover=on. CopiaOUT/media/videos/<tema>/1080p60/<Nombre>.mp4aOUT/<tema>.mp4. - Con
voiceover=on, confirma que el MP4 tenga un flujo de audio (ffprobe). - Abre el MP4 al terminar (
openen macOS;xdg-openen Linux, o si no hay pantalla solo imprime la ruta).
Informa de la ruta absoluta del MP4, la duración, cualquier cosa a la que prestar atención (pronunciación de términos inusuales) y recuerda al usuario que los iconos necesitan el crédito "Kubernetes community icons, CC BY 4.0" (el outro ya lo muestra). Opciones de voz: af_heart (por defecto), am_michael, am_fenrir; pásalo como voiced(<Nombre>, voice="am_michael").