쿠버네티스 설명 영상 만들기
출력은 강의용 MP4 파일입니다: 그래픽, 애니메이션, 거의 텍스트 없음, 자막 없음.
인자 voiceover=on|off (기본값 on). on은 로컬 Kokoro TTS 음성으로 나레이션을 추가합니다. off는 무음 영상을 만들고 Kokoro를 설치하거나 로드하지 않습니다.
인자 setup: 설치만 수행하고 영상은 만들지 않습니다. 아래 "환경 확인" 단계를 수행한 후 중단합니다.
두 개의 폴더. SKILL은 스킬의 기본 디렉토리(이 파일이 있는 폴더)입니다. 이 폴더에는 .venv/, icons/, references/, scripts/가 있습니다. OUT은 <사용자 작업 디렉토리>/<주제>이며, 영상마다 생성됩니다. 씬 파일, media/, 최종 MP4는 OUT에 위치하며 SKILL에는 절대 두지 않습니다(스킬을 업데이트하거나 제거하면 SKILL이 삭제됩니다). 절대 경로를 사용하고 현재 디렉토리에 의존하지 마십시오.
스킬에 포함된 파일
icons/: 공식 쿠버네티스 커뮤니티 아이콘(라벨 세트, CC-BY-4.0). 쿠버네티스 구성 요소 및 리소스에는 이 아이콘만 사용하십시오. 아이콘이 있는 구성 요소를 다시 그리거나, 다른 색으로 바꾸거나, 일반 도형으로 대체하지 마십시오. 아이콘이 없는 개념(CSR, 인증서, 패킷, iptables 규칙 등)은 참조 파일의Doc,Packet같은 간단한 도형을 사용하세요.references/node_join.py: 완전하고 승인된 예제(kubeadm 노드 조인). 스타일, 팔레트, 헬퍼 클래스를 복사하세요.references/kokoro_service.py: manim-voiceover에 연결된 Kokoro-82M.references/kit.py: 공유 팔레트, 헬퍼,Explainer기본 씬과voiced(Scene). 새 씬은 여기에서 임포트합니다.scripts/setup.sh [voiceover=on|off] [--yes]: 누락된 항목을 보고하고 설치 계획을 출력합니다(macOS, Arch, Debian/Ubuntu).--yes를 붙이면 설치를 진행합니다.
| 파일 | 구성 요소 | 파일 | 구성 요소 | 파일 | 구성 요소 |
|---|---|---|---|---|---|
| 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 | 컨트롤 플레인 노드 | svc | Service | role / c-role | Role / ClusterRole |
| node | 워커 노드 | ep | Endpoints | rb / crb | RoleBinding / ClusterRoleBinding |
| hpa | HorizontalPodAutoscaler | ing | Ingress | quota | ResourceQuota |
| crd | CustomResourceDefinition | netpol | NetworkPolicy | limits | LimitRange |
Manim은 SVG에 포함된 텍스트를 무시하며, api, c-m, sched, kubelet, k-proxy는 동일한 기어 글리프를 공유합니다. 항상 Icon(name, label) 헬퍼로 아이콘에 라벨을 붙이세요.
워크플로우
1. 환경 확인
bash SKILL/scripts/setup.sh voiceover=<on|off>를 실행하세요. Ready.가 출력되면 계속 진행합니다. 그렇지 않으면 누락된 항목과 설치 계획이 출력됩니다(이 머신에서 처음 실행하는 경우): 사용자에게 계획을 보여주고 설치 전에 허락을 구하세요.
- 허락을 받으면
--yes를 붙여 다시 실행하세요. 느릴 수 있으므로(torch, 시스템 패키지) 백그라운드에서 실행하거나 긴 타임아웃을 설정하세요. - 계획에
sudo줄이 있어 비밀번호를 입력할 수 없는 경우: 사용자가 직접 실행할 명령어를 알려주세요(! bash SKILL/scripts/setup.sh voiceover=<on|off> --yes). - Kokoro는 무료, Apache-2.0(유료 강좌에 사용 가능), 오프라인, 상업용에 준하는 품질입니다. 사용자가 원하지 않으면
voiceover=off를 제안하세요.
2. 스토리보드 협의
주제가 주어지지 않았다면 먼저 주제를 물어보세요. 그런 다음 채팅에서 스토리보드를 제안하고 승인을 기다리세요. 렌더링에 몇 분이 걸리기 때문입니다:
- 6
12개의 비트, 각 비트는 13단어의 단계 라벨, 화면에서 움직이는 요소, 한 문장의 나레이션으로 구성됩니다. - 움직임을 통해 이야기를 전달합니다: 박스 안의 아이콘, 호 위의 패킷, 상태 변화를 나타내는 색상 변경. 화면에는 짧은 라벨만 표시됩니다.
- 사실은 현재 쿠버네티스 버전에 맞게 정확해야 합니다. 세부 사항이 확실하지 않으면 추측하지 말고 그렇다고 말하세요.
3. 씬 작성
references/node_join.py를 모델로 삼으세요:
- 하나의
NARRATION딕셔너리(비트 → 문장)를 클래스 속성으로, 비트당 하나의 메서드;Explainer.construct가with self.voice(line)안에서 비트를 반복합니다. OUT/<topic>.py를 작성하고from references.kit import *로 임포트한 후Explainer를 서브클래싱하고 마지막에<Name>Voiced = voiced(<Name>)를 추가하세요. 비트는def beat(self, i)입니다. 무음<Name>과 나레이션<Name>Voiced는 동일한 코드에서 비롯됩니다.- 씬 파일 이름을 표준 라이브러리 모듈 이름(
operator.py는 Python 임포트를 깨뜨림)으로 짓지 마세요. - 팔레트(어두운
#0b1220, k8s 블루#326ce5, 골드 토큰, 틸 네트워크, 앰버 NotReady, 그린 Ready)와 헬퍼Icon,Packet,Doc,Step,Pill,send를 재사용하세요. - 작은 클래스, 최소한의 코드.
- 용어는 나레이션에서 발음되는 방식으로 표기하세요: kubeadm → "kube admin", etcd → "et-cee-dee", kubectl → "kube control".
4. 프리뷰 후 렌더링
OUT 디렉토리에서 manim을 다음과 같이 실행하세요: PYTHONPATH=SKILL SKILL/.venv/bin/manim --media_dir OUT/media ...
- 프리뷰:
... -ql <topic>.py <Name>, 그런 다음 ffmpeg로 약 8프레임을 추출하여 하나의 콘택트 시트로 만들고 한 번 확인하세요. 겹침, 잘린 라벨, 어둡거나 읽기 어려운 텍스트를 수정하세요. - 최종 렌더링:
voiceover=off일 때... -qh <topic>.py <Name>,voiceover=on일 때<Name>Voiced.OUT/media/videos/<topic>/1080p60/<Name>.mp4를OUT/<topic>.mp4로 복사하세요. voiceover=on인 경우 MP4에 오디오 스트림이 있는지 확인하세요(ffprobe).- 완료되면 MP4를 여세요(macOS에서는
open, Linux에서는xdg-open, 디스플레이가 없으면 경로만 출력).
절대 MP4 경로, 길이, 주의할 점(특이한 용어 발음)을 보고하고 아이콘에 "Kubernetes community icons, CC BY 4.0" 크레딧이 필요함을 알리세요(아웃트로에 이미 표시됨). 음성 옵션: af_heart(기본값), am_michael, am_fenrir; voiced(<Name>, voice="am_michael")로 전달하세요.