BubblyWolf/lab-in-a-box
GitHub: BubblyWolf/lab-in-a-box
一条命令在本地笔记本上启动的离线生产级 Kubernetes 学习平台,集成 GitOps、可观测性、安全策略与 CI/CD 的完整技术栈。
Stars: 0 | Forks: 0
# 🧪 lab-in-a-box
[](https://opensource.org/licenses/MIT)
[](https://github.com/BubblyWolf/lab-in-a-box/actions)
[](https://kubernetes.io/)
[](https://helm.sh/)
[](https://argoproj.github.io/cd/)
## ⚡ TL;DR
- 💻 **在你的笔记本上离线运行** — [Kind](https://kind.sigs.k8s.io/) (Kubernetes-in-Docker)。无需云账号,无需信用卡,也不会有莫名其妙的账单。
- 🎓 **专为学习而构建** — 每一个组件都已连接*并进行了解释*。启动集群,然后阅读[引导式演练](docs/walkthrough.md),观察每一层是如何工作的。
- 🧱 **真正的生产级模式** — GitOps (app-of-apps)、可观测性、准入控制安全、已签名的镜像 + SBOM。绝不是玩具级别的 YAML。
- ⚡ **可用的演示应用** — "Pulse"(3 个 Node.js 微服务 + Redis),并配有一个可以实时观察更新状态的 Grafana 仪表盘。
```
make up # Kind cluster + Argo CD + Monitoring + Security stack
make deploy-local # Pulse app via Helm (no remote Git push needed)
make demo # Port-forward all UIs: Argo CD, Grafana, Pulse frontend
```
## 🎯 为什么会有这个项目
我想学习生产级平台实际上是如何运作的——不仅仅是阅读相关内容,而是真正地去*运行*它们。云服务让这一切成本高昂,而且教程往往会在不同工具之间留下知识空白。因此,我将所有东西整合到了一个单一的、可复现的本地环境中,可以在几分钟内从零开始实现 GitOps。现在,任何人都可以免费学习、破坏并体验一个真实的平台技术栈。
## 🏗️ 架构
```
flowchart TB
subgraph Developer["👤 Developer"]
GH["GitHub Repo
BubblyWolf/lab-in-a-box"] GHA["GitHub Actions CI"] end subgraph Cluster["☸️ Kind Cluster"] subgraph GitOps["🔄 GitOps Layer"] Argo["Argo CD
(app-of-apps)"] end subgraph AppLayer["🎯 Pulse Application"] API["API Service"] Worker["Worker Service"] FE["Frontend"] Redis[("Redis")] end subgraph Observability["📊 Observability"] Prom["Prometheus"] Graf["Grafana
+ Pulse Dashboard"] Loki["Loki"] Promtail["Promtail"] end subgraph Security["🔐 Security"] Kyverno["Kyverno Policies"] Sealed["Sealed Secrets"] TrivyOp["Trivy Operator"] end end subgraph Registry["📦 GHCR"] Images["Signed Images
+ SBOMs"] end GH -->|Git Push| Argo Argo -->|Sync| API Argo -->|Sync| Worker Argo -->|Sync| FE Argo -->|Sync| Prom Argo -->|Sync| Graf Argo -->|Sync| Kyverno API --> Redis Worker --> Redis Promtail -->|Collect Logs| Loki Prom -->|Scrape /metrics| API Prom -->|Scrape /metrics| Worker Prom -->|Scrape /metrics| FE Prom --> Graf GHA -->|Build, Scan, Sign & Push| Images Images -->|Pull| API Images -->|Pull| Worker Images -->|Pull| FE Kyverno -->|Admission Control| AppLayer ``` ## 🚀 快速开始 ### 前置条件 | 工具 | 用途 | 检查命令 | |------|---------|-------| | [Docker](https://docs.docker.com/get-docker/) | 用于 Kind 的容器运行时 | `docker --version` | | [kubectl](https://kubernetes.io/docs/tasks/tools/) | Kubernetes CLI | `kubectl version --client` | | [kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) | 本地 Kubernetes 集群 | `kind version` | | [helm](https://helm.sh/docs/intro/install/) | Kubernetes 包管理器 | `helm version` | ### 步骤 ``` # 1. Clone git clone https://github.com/BubblyWolf/lab-in-a-box.git cd lab-in-a-box # 2. Bootstrap 所有内容 (Kind cluster + Argo CD + platform) make up # 3. 本地部署 Pulse demo app (无需 Git push) make deploy-local # 4. Port-forward 并打开 UI make demo ``` | URL | 你将看到 | |-----|-----------------| | https://localhost:8080 | **Argo CD** — 实时查看应用同步过程 | | http://localhost:3000 | **Grafana** — 定制的 "Pulse" 仪表盘 | | http://localhost:8081 | **Pulse 前端** — 提交作业,观察处理过程 | ## 🧩 包含哪些内容 | 功能 | 工具 | 为什么重要 | |------------|------|----------------| | **GitOps** | Argo CD (app-of-apps 模式) | Git 是唯一的单一事实来源;每一次更改都是可审计且能自我修复的 | | **可观测性** | Prometheus + Grafana + Loki + 定制的 "Pulse" 仪表盘 | 指标和日志集中在一处,通过 pod 注解自动抓取 | | **安全性** | Kyverno + Sealed Secrets + Trivy Operator | 准入阶段的策略执行,Git 中的加密机密,镜像扫描 | | **CI/CD** | GitHub Actions (构建、Trivy 扫描、SBOM、cosign 签名) | 包含供应链安全工件的可复现构建 | | **演示应用** | Pulse — Node.js API + worker + 前端 + Redis | 真正的微服务,带有 Redis 作业队列、`/metrics` 和 `/healthz` | ## 🔐 安全演示 实时观察 Kyverno 阻止一个不合规的 pod: ``` kubectl apply -f security/examples/bad-pod.yaml # 被 admission control 拒绝: # 来自服务器的错误:admission webhook "validate.kyverno.svc-fail" 拒绝了该请求: # require-non-root: 'Pod 必须以 non-root 运行。' # disallow-privileged: '不允许使用 Privileged containers。' ``` 这个违规的 pod 以 **特权模式** 和 **root 身份** 运行,因此被两条强制执行的策略拒绝。Pulse 应用的 pod 则能顺利通过检查(它们已经以非 root 和非特权身份运行)。 **包含的策略** (`security/policies/`): | 策略 | 模式 | 效果 | |--------|------|--------| | `require-non-root` | Enforce | 阻止未以非 root 身份运行的 pod | | `disallow-privileged` | Enforce | 阻止特权容器 | | `require-resources` | Audit | 当缺少 CPU/内存请求时发出警告 | | `disallow-latest-tag` | Audit | 对 `:latest` / 未打标签的镜像发出警告 | 系统命名空间被排除在外,因此平台本身永远不会被阻止运行。 ## 📊 可观测性 **Pulse 仪表盘** 会自动加载到 Grafana 中(通过仪表盘 sidecar 实现),并显示: - **作业率** — `rate(pulse_jobs_submitted_total)` 对比 `rate(pulse_jobs_processed_total)` - **总提交数** 和 **总处理数** 计数器 指标会自动从任何带有 `prometheus.io/scrape` 注解的 pod 中抓取——无需修改 Prometheus 配置。来自所有 pod 的日志会通过 Promtail 流向 **Loki**,并且可以在 Grafana 的 Explore 视图中进行查询。 ## 🗺️ 仓库布局 ``` lab-in-a-box/ ├── Makefile # make up / down / status / demo / deploy-local / build-load ├── bootstrap/ # Kind cluster config, install.sh, build-images.sh ├── apps/demo/ # Pulse app source: api/ worker/ frontend/ (+ Dockerfiles) ├── charts/pulse/ # Helm chart that deploys Pulse + Redis ├── gitops/ # Argo CD manifests (root app + app-of-apps) ├── observability/ # Grafana dashboard ConfigMap ├── security/ # Kyverno policies, bad-pod example, docs ├── .github/workflows/ # CI (build/scan/sign) + Validate (lint/smoke) └── docs/ # Architecture, runbook, launch post ``` ## 📄 许可证 MIT © 2026 [Chitranjan Jegadeesan](https://github.com/BubblyWolf) *专为学习、复刻和改进而生。如果这个项目帮你省下了一笔云服务费,或者教会了你一些东西,请给它点个 ⭐ 并告诉我你构建了什么。*
BubblyWolf/lab-in-a-box"] GHA["GitHub Actions CI"] end subgraph Cluster["☸️ Kind Cluster"] subgraph GitOps["🔄 GitOps Layer"] Argo["Argo CD
(app-of-apps)"] end subgraph AppLayer["🎯 Pulse Application"] API["API Service"] Worker["Worker Service"] FE["Frontend"] Redis[("Redis")] end subgraph Observability["📊 Observability"] Prom["Prometheus"] Graf["Grafana
+ Pulse Dashboard"] Loki["Loki"] Promtail["Promtail"] end subgraph Security["🔐 Security"] Kyverno["Kyverno Policies"] Sealed["Sealed Secrets"] TrivyOp["Trivy Operator"] end end subgraph Registry["📦 GHCR"] Images["Signed Images
+ SBOMs"] end GH -->|Git Push| Argo Argo -->|Sync| API Argo -->|Sync| Worker Argo -->|Sync| FE Argo -->|Sync| Prom Argo -->|Sync| Graf Argo -->|Sync| Kyverno API --> Redis Worker --> Redis Promtail -->|Collect Logs| Loki Prom -->|Scrape /metrics| API Prom -->|Scrape /metrics| Worker Prom -->|Scrape /metrics| FE Prom --> Graf GHA -->|Build, Scan, Sign & Push| Images Images -->|Pull| API Images -->|Pull| Worker Images -->|Pull| FE Kyverno -->|Admission Control| AppLayer ``` ## 🚀 快速开始 ### 前置条件 | 工具 | 用途 | 检查命令 | |------|---------|-------| | [Docker](https://docs.docker.com/get-docker/) | 用于 Kind 的容器运行时 | `docker --version` | | [kubectl](https://kubernetes.io/docs/tasks/tools/) | Kubernetes CLI | `kubectl version --client` | | [kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) | 本地 Kubernetes 集群 | `kind version` | | [helm](https://helm.sh/docs/intro/install/) | Kubernetes 包管理器 | `helm version` | ### 步骤 ``` # 1. Clone git clone https://github.com/BubblyWolf/lab-in-a-box.git cd lab-in-a-box # 2. Bootstrap 所有内容 (Kind cluster + Argo CD + platform) make up # 3. 本地部署 Pulse demo app (无需 Git push) make deploy-local # 4. Port-forward 并打开 UI make demo ``` | URL | 你将看到 | |-----|-----------------| | https://localhost:8080 | **Argo CD** — 实时查看应用同步过程 | | http://localhost:3000 | **Grafana** — 定制的 "Pulse" 仪表盘 | | http://localhost:8081 | **Pulse 前端** — 提交作业,观察处理过程 | ## 🧩 包含哪些内容 | 功能 | 工具 | 为什么重要 | |------------|------|----------------| | **GitOps** | Argo CD (app-of-apps 模式) | Git 是唯一的单一事实来源;每一次更改都是可审计且能自我修复的 | | **可观测性** | Prometheus + Grafana + Loki + 定制的 "Pulse" 仪表盘 | 指标和日志集中在一处,通过 pod 注解自动抓取 | | **安全性** | Kyverno + Sealed Secrets + Trivy Operator | 准入阶段的策略执行,Git 中的加密机密,镜像扫描 | | **CI/CD** | GitHub Actions (构建、Trivy 扫描、SBOM、cosign 签名) | 包含供应链安全工件的可复现构建 | | **演示应用** | Pulse — Node.js API + worker + 前端 + Redis | 真正的微服务,带有 Redis 作业队列、`/metrics` 和 `/healthz` | ## 🔐 安全演示 实时观察 Kyverno 阻止一个不合规的 pod: ``` kubectl apply -f security/examples/bad-pod.yaml # 被 admission control 拒绝: # 来自服务器的错误:admission webhook "validate.kyverno.svc-fail" 拒绝了该请求: # require-non-root: 'Pod 必须以 non-root 运行。' # disallow-privileged: '不允许使用 Privileged containers。' ``` 这个违规的 pod 以 **特权模式** 和 **root 身份** 运行,因此被两条强制执行的策略拒绝。Pulse 应用的 pod 则能顺利通过检查(它们已经以非 root 和非特权身份运行)。 **包含的策略** (`security/policies/`): | 策略 | 模式 | 效果 | |--------|------|--------| | `require-non-root` | Enforce | 阻止未以非 root 身份运行的 pod | | `disallow-privileged` | Enforce | 阻止特权容器 | | `require-resources` | Audit | 当缺少 CPU/内存请求时发出警告 | | `disallow-latest-tag` | Audit | 对 `:latest` / 未打标签的镜像发出警告 | 系统命名空间被排除在外,因此平台本身永远不会被阻止运行。 ## 📊 可观测性 **Pulse 仪表盘** 会自动加载到 Grafana 中(通过仪表盘 sidecar 实现),并显示: - **作业率** — `rate(pulse_jobs_submitted_total)` 对比 `rate(pulse_jobs_processed_total)` - **总提交数** 和 **总处理数** 计数器 指标会自动从任何带有 `prometheus.io/scrape` 注解的 pod 中抓取——无需修改 Prometheus 配置。来自所有 pod 的日志会通过 Promtail 流向 **Loki**,并且可以在 Grafana 的 Explore 视图中进行查询。 ## 🗺️ 仓库布局 ``` lab-in-a-box/ ├── Makefile # make up / down / status / demo / deploy-local / build-load ├── bootstrap/ # Kind cluster config, install.sh, build-images.sh ├── apps/demo/ # Pulse app source: api/ worker/ frontend/ (+ Dockerfiles) ├── charts/pulse/ # Helm chart that deploys Pulse + Redis ├── gitops/ # Argo CD manifests (root app + app-of-apps) ├── observability/ # Grafana dashboard ConfigMap ├── security/ # Kyverno policies, bad-pod example, docs ├── .github/workflows/ # CI (build/scan/sign) + Validate (lint/smoke) └── docs/ # Architecture, runbook, launch post ``` ## 📄 许可证 MIT © 2026 [Chitranjan Jegadeesan](https://github.com/BubblyWolf) *专为学习、复刻和改进而生。如果这个项目帮你省下了一笔云服务费,或者教会了你一些东西,请给它点个 ⭐ 并告诉我你构建了什么。*
标签:API集成, GitOps, MITM代理, 可观测性, 子域名突变, 搜索引擎查询, 教学示例, 本地开发环境, 自定义脚本, 自定义请求头, 请求拦截