[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80250":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":28,"discoverSource":29},80250,"kubekosh","zeborg\u002Fkubekosh","zeborg","Interactive Kubernetes Playground",null,"JavaScript",175,31,2,1,0,34,115,6,4.52,"Apache License 2.0",false,"main",true,[],"2026-06-12 02:04:00","\u003Cdiv align=\"center\">\n  \u003Cimg src=\"frontend\u002Fpublic\u002Flogo.svg\" alt=\"KubeKosh Logo\" width=\"100\" \u002F>\n\n  \u003Ch1>KubeKosh\u003C\u002Fh1>\n\n  \u003Cp>\u003Cstrong>Self-hosted Kubernetes Lab for Hands-on Learning\u003C\u002Fstrong>\u003C\u002Fp>\n\n  \u003Cp>\n    \u003Ca href=\"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fzeborg\u002Fkubekosh\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fzeborg\u002Fkubekosh?style=flat-square&logo=docker&label=Docker%20Hub\" alt=\"Docker Hub\" \u002F>\u003C\u002Fa>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache%202.0-blue?style=flat-square\" alt=\"License\" \u002F>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatforms-amd64%20%7C%20arm64-lightgrey?style=flat-square\" alt=\"Platforms\" \u002F>\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\n---\n\nKubeKosh runs a real [K3s](https:\u002F\u002Fk3s.io\u002F) Kubernetes cluster inside a single Docker container and pairs it with a browser-based terminal and automated scenario validation — no cloud account or local cluster required.\n\n## Quick Start\n\n**Prerequisite:** [Docker](https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F)\n\n```bash\ndocker run -itd --name kubekosh --privileged -p 7554:80 zeborg\u002Fkubekosh:latest\n```\n\nOpen **http:\u002F\u002Flocalhost:7554** — wait ~30 seconds for the *Cluster Ready* indicator to turn green.\n\n> `--privileged` is required — K3s needs access to kernel namespaces and cgroups.\n\n### Persist Progress\n\n```bash\ndocker run -itd --name kubekosh --privileged -p 7554:80 \\\n  -v \u003Cyour_custom_directory>:\u002Fdata zeborg\u002Fkubekosh:latest\n```\n\nProgress is stored in SQLite at `\u002Fdata\u002Fprogress.db` inside the container. You may mount your own custom directory to `\u002Fdata` to persist the progress across container restarts.\n\n### Build From Source\n\n```bash\ndocker build -t kubekosh .\n# multi-platform\ndocker buildx build --platform linux\u002Famd64,linux\u002Farm64 -t kubekosh .\n```\n\n---\n\n## What's Inside\n\n| Bundle | Focus | Exam Mode |\n|---|---|---|\n| 🌱 Kubernetes Basics | Core concepts | 60 min |\n| 🧑‍✈️ Kubernetes Administrator | CKA | 120 min |\n| 🛠️ Kubernetes Developer | CKAD | 120 min |\n| 🛡️ Kubernetes Security | CKS | 120 min |\n\n**Scenario types:**\n- **Task** — Hands-on challenge in the live terminal. Click **Validate** for automated cluster-state checking.\n- **MCQ** — Multiple-choice question with a detailed explanation on submission.\n\n### Shell Aliases\n\nThe terminal comes pre-configured with:\n\n| Alias | Expands to |\n|---|---|\n| `k` | `kubectl` |\n| `kgp` | `kubectl get pods` |\n| `kga` | `kubectl get pods --all-namespaces` |\n| `kgd` | `kubectl get deployments` |\n| `kgs` | `kubectl get services` |\n| `kaf` | `kubectl apply -f` |\n| `kex` | `kubectl exec -it` |\n| `kns \u003Cns>` | `kubectl config set-context --current --namespace=\u003Cns>` |\n\n---\n\n## Architecture\n\n| Component | Technology |\n|---|---|\n| Frontend | React + Vite, `xterm.js` |\n| Backend | Node.js \u002F Express, `node-pty` WebSocket PTY |\n| Cluster | K3s (single-node, in-container) |\n| Proxy | nginx on container port `80`, mapped to host port `7554` |\n| Storage | SQLite (`better-sqlite3`) at `\u002Fdata\u002Fprogress.db` |\n\nEverything runs inside a **single Docker image** managed by `scripts\u002Fentrypoint.sh`.\n\n---\n\n## Contributing\n\nContributions are what make open-source projects like this one grow — and every contribution counts, big or small. Whether you're fixing a typo, polishing a scenario description, or building a completely new exercise from scratch, you're helping the next person learn Kubernetes in the best way possible. **Thank you for taking the time!**\n\n### Adding Scenarios\n\nScenarios live in `scenarios\u002Fscenarios.json`; bundles in `scenarios\u002Fbundles.json`. See [`scenarios\u002FSCHEMA.md`](scenarios\u002FSCHEMA.md) for the full schema.\n\n**Task checklist:**\n- `validation.commands` — idempotent `kubectl` commands only\n- `setup_commands` \u002F `teardown_commands` — `kubectl` or native Ubuntu commands only\n\n**MCQ checklist:**\n- `correct_option` must match one of the `options[].id` values\n- Always include an `explanation`\n\n### Workflow\n\n```bash\n# 1. Fork the repo on GitHub, then clone your fork\ngit clone https:\u002F\u002Fgithub.com\u002F\u003Cyour-username>\u002Fkubekosh.git\ncd kubekosh\n\n# 2. Create a branch\ngit checkout -b feat\u002Fmy-scenario\n\n# 3. Edit scenarios\u002Fscenarios.json (and\u002For bundles.json)\n\n# 4. Build and test locally\ndocker build -t kubekosh . && docker run --rm -itd --privileged -p 7554:80 kubekosh\n\n# 5. Commit and push to your fork\ngit add scenarios\u002Fscenarios.json\ngit commit -m \"feat: add \u003Cscenario-name> scenario\"\ngit push -u origin feat\u002Fmy-scenario\n```\n\nOpen a Pull Request from your fork's branch against `main`.\n\n---\n\n## License\n\nApache 2.0 License — see [LICENSE](LICENSE).\n","KubeKosh 是一个自托管的 Kubernetes 实验环境，专为动手学习设计。它在一个 Docker 容器中运行真实的 K3s Kubernetes 集群，并配备了一个基于浏览器的终端和自动化的场景验证功能，无需云账户或本地集群即可使用。该项目支持多种 Kubernetes 相关认证（如 CKA、CKAD 和 CKS）的学习路径，通过任务型挑战和选择题的形式帮助用户掌握 Kubernetes 的核心概念与高级特性。适用于希望在安全可控的环境中提升 Kubernetes 技能的技术人员或团队，无论是初学者还是有经验的开发者都能从中受益。","2026-06-11 03:59:49","CREATED_QUERY"]