从零搭建一个单节点 K8S 可观测实验室(十三):总结——这个实验室如何服务工作、学习和开源项目

引子:我们搭的其实不只是一个 Kubernetes 集群

从第一篇安装 Ubuntu 24.04 开始,到第十二篇做告警和故障注入,这个系列终于走到了最后一篇。

最开始,我给它起的名字是:

从零搭建一个单节点 K8S 可观测实验室。

现在回头看,这个名字其实已经有一点"装不下"它了。

因为经过前十二篇,我们搭起来的已经不只是一个 Kubernetes 集群,也不只是 Prometheus、Grafana、Loki、Tempo 这些可观测组件的集合。

它已经逐渐变成了一套完整的个人技术实验环境:

复制代码
Hardware / VM
      │
      ▼
Ubuntu / Linux
      │
      ▼
Docker / containerd / CRI
      │
      ▼
Kubernetes
      │
      ├───────────────┐
      │               │
      ▼               ▼
Application        CI / CD
      │               │
      │         Jenkins / GitHub Actions
      │               │
      │             Harbor
      │               │
      └───────┬───────┘
              │
              ▼
        Observability
              │
      ┌───────┼────────┐
      ▼       ▼        ▼
   Metrics   Logs    Traces
      │       │        │
 Prometheus  Loki    Tempo
      │       │        │
      └───────┼────────┘
              │
           Grafana
              │
              ▼
           Alerting
              │
              ▼
      Troubleshooting
              │
              ▼
        Fault Recovery

这套结构已经覆盖了现代云原生基础设施中的很多关键环节。Kubernetes 本身就是面向容器化工作负载的声明式、自动化平台,而它下面依赖 Linux、容器运行时和网络,上面又天然连接应用交付、可观测性和平台工程。

所以,如果现在让我重新定义这个实验室,我更愿意称它为:

一个属于自己的个人技术练兵场。

在这里可以学习 Linux,可以折腾虚拟化,可以研究 Docker 和 containerd,可以理解 Kubernetes,可以做网络和权限实验,可以搭 CI/CD,可以研究 Metrics、Logs、Traces,可以接 OpenTelemetry。

而在这个基础上,只要继续增加硬件和软件能力,它还完全可以继续向两个很有意思的方向生长:

AI Infra 和高性能网络。

这也是这篇总结真正想说的事情:

这个系列结束了,但这个实验室的价值,才刚刚开始。

回头看这十三篇,我们真正走过了什么?

先把整个系列完整放在这里。

篇章 文章
从零搭建一个单节点 K8S 可观测实验室(一):从 Ubuntu 24.04 开始 ✅
从零搭建一个单节点 K8S 可观测实验室(二):安装单节点 Kubernetes ✅
从零搭建一个单节点 K8S 可观测实验室(三):安装 Prometheus + Grafana,看懂集群指标 ✅
从零搭建一个单节点 K8S 可观测实验室(四):修复 kubectl exec 失败问题------一次 cri-dockerd Streaming API 排查 ✅
从零搭建一个单节点 K8S 可观测实验室(五):安装 Loki + Fluent Bit,构建日志采集链路 ✅
从零搭建一个单节点 K8S 可观测实验室(六):安装 Tempo + OpenTelemetry,构建链路追踪链路 ✅
从零搭建一个单节点 K8S 可观测实验室(七):从一次 Pod 创建过程,看懂 Kubernetes 核心原理 ✅
从零搭建一个单节点 K8S 可观测实验室(八):安装 Jenkins,把 CI 接进实验室 ✅
从零搭建一个单节点 K8S 可观测实验室(九):GitHub Actions------用 Self-hosted Runner 自动部署 ✅
从零搭建一个单节点 K8S 可观测实验室(十):加入 Harbor 镜像仓库,完善 Kubernetes 发布链路 ✅
十一 从零搭建一个单节点 K8S 可观测实验室(十一):压测与 Grafana------让监控数据真正动起来 ✅
十二 从零搭建一个单节点 K8S 可观测实验室(十二):告警与故障注入------从 Pending、Firing 到故障恢复 ✅
十三 从零搭建一个单节点 K8S 可观测实验室(十三):总结------这个实验室如何服务工作、学习和开源项目

表面看,它是一条:

复制代码
Ubuntu
  ↓
Kubernetes
  ↓
Prometheus / Grafana
  ↓
Loki
  ↓
Tempo / OpenTelemetry
  ↓
Jenkins
  ↓
GitHub Actions
  ↓
Harbor
  ↓
压测
  ↓
告警
  ↓
故障注入

的安装路线。

但实际上,每往前一步,我们都多接触了一层系统。

第一篇看似只是在安装 Ubuntu,实际上碰到的是 Linux 这个所有上层软件最终依赖的基础平台

第二篇安装 Kubernetes 后,我们开始面对 kube-apiserver、scheduler、controller、kubelet、容器运行时和 CNI。Kubernetes 官方架构本身就是由 control plane 和运行工作负载的 node 组成,而 Pod 最终还是运行在节点上的容器。

第四篇甚至尤其典型。

一个看似简单的:

复制代码
kubectl exec

失败,最后一路追到了:

复制代码
kubectl
   │
   ▼
kube-apiserver
   │
   ▼
kubelet
   │
   ▼
CRI / cri-dockerd
   │
   ▼
Streaming API
   │
   ▼
Container

这类问题恰恰说明了实验环境最大的价值。

正常的时候,我们看到的是命令;出问题的时候,我们才开始看到系统。

今天 Kubernetes 已经不再内置 dockershim,节点必须通过 CRI 对接符合要求的容器运行时;containerd 自身则内置 CRI 插件,由它接收 kubelet 的 CRI 请求并管理容器生命周期。也正因为存在这些明确的接口边界,我们才有机会沿着调用链逐层定位问题。

到了后面,可观测系统加入以后,实验室又多了一双"眼睛"。

Prometheus 负责采集和存储时间序列指标,并可以基于数据执行规则;Loki 是面向日志的聚合系统;Tempo 是分布式追踪后端;OpenTelemetry 则提供了生成、采集、处理和导出 traces、metrics、logs 的厂商中立框架。

于是我们开始能够从三个角度看同一个问题:

复制代码
                 一个故障
                    │
         ┌──────────┼──────────┐
         │          │          │
         ▼          ▼          ▼
      Metrics      Logs      Traces
         │          │          │
    发生了吗?   发生了什么?   发生在哪里?
    严重吗?     为什么报错?   哪一段最慢?

再到 Jenkins、GitHub Actions 和 Harbor,实验室开始有了"发布能力"。

Jenkins Pipeline 可以把 Build、Test、Deploy 等阶段以 Pipeline as Code 的方式组织起来;GitHub Self-hosted Runner 则允许自己管理执行 Actions Job 的机器和环境;Harbor 不只是一个镜像存储点,也可以继续扩展漏洞扫描等供应链能力。

于是,一条真正的软件生命周期链路开始出现:

复制代码
Developer
    │
    ▼
  Git
    │
    ▼
CI Pipeline
    │
    ├── Build
    ├── Test
    └── Image Build
            │
            ▼
          Harbor
            │
            ▼
       Kubernetes
            │
            ▼
        Application
            │
      ┌─────┼─────┐
      ▼     ▼     ▼
   Metrics Logs Traces
      │     │     │
      └─────┼─────┘
            ▼
          Alert
            │
            ▼
     Troubleshooting
            │
            ▼
      Fault Recovery

这里有一个很重要的变化:

我们不再只是"把 Kubernetes 装起来了"。

我们第一次从头到尾走了一遍:

代码如何进入系统,系统如何运行,运行状态如何被观察,异常如何被发现,故障又如何被定位和恢复。

这才是前十二篇真正串起来之后的意义。

它真正能服务什么:工作、学习、开源项目和长期技术积累

一个实验室到底有没有价值,不在于里面安装了多少软件,而在于它能不能反复使用。

我觉得这套环境最有价值的地方,可以归纳成四件事。

第一,它可以服务工作

工作中最麻烦的问题往往不是"这个命令怎么写",而是:

复制代码
为什么在我的环境正常?
为什么在服务器不正常?
为什么容器里不正常?
为什么到了 Kubernetes 又不正常?
为什么 Pod Running 但是业务不可用?
为什么请求超时却看不到明显报错?

这些问题通常横跨多个层次:

复制代码
Application
    ↓
Container
    ↓
Kubernetes
    ↓
Linux
    ↓
Network
    ↓
Hardware

有这样一个自己的环境,就意味着很多问题不需要直接在真实业务环境里试。

可以先缩小问题。

例如怀疑容器运行时:

复制代码
Docker?
containerd?
CRI?
kubelet?

怀疑网络:

复制代码
Pod IP?
Service?
DNS?
CNI?
NetworkPolicy?
Host Network?

怀疑性能:

复制代码
CPU?
Memory?
Disk?
Network?
Application?

然后通过 Metrics、Logs 和 Traces 一层层排除。

OpenTelemetry 的核心价值之一正是让不同遥测信号共享统一的资源属性,从而更容易把来自同一个 Kubernetes Pod 的指标、日志和链路关联起来。

所以,这个实验室可以成为:

工作问题的最小复现环境和技术方案验证环境。

它不替代生产环境,但可以显著降低"直接在生产上猜"的概率。

第二,它可以服务学习

以前学习某个技术,常常是一条线:

复制代码
看书
 ↓
看教程
 ↓
记命令
 ↓
过几个月
 ↓
忘了

有实验室以后,学习方式可以变成:

复制代码
看到概念
   ↓
自己部署
   ↓
自己观察
   ↓
主动破坏
   ↓
查看现象
   ↓
定位原因
   ↓
修复
   ↓
形成理解

这种学习方式特别适合 Kubernetes,因为 Kubernetes 自身强调 desired state 和 controller 驱动的状态协调:你声明期望状态,控制器不断推动实际状态向期望状态靠近。工作负载控制器会持续确保"正确数量、正确类型"的 Pod 运行。

所以第七篇从 Pod 创建过程出发,其实是这个系列一个很重要的转折点。

我们开始从:

复制代码
kubectl apply

向下追:

复制代码
YAML
 │
 ▼
API Server
 │
 ▼
etcd
 │
 ▼
Controller
 │
 ▼
Scheduler
 │
 ▼
kubelet
 │
 ▼
CRI
 │
 ▼
Container Runtime
 │
 ▼
Linux

这时候 Kubernetes 就不再是一个"需要背很多 YAML 的软件"。

而变成了一套可以被拆解、观察和理解的系统。

第三,它可以服务开源项目

很多个人项目最后停留在:

复制代码
GitHub Repository

代码写完了。

README 写完了。

然后结束。

但真正的软件工程能力,还包括:

复制代码
Code
 ↓
Build
 ↓
Test
 ↓
Image
 ↓
Registry
 ↓
Deploy
 ↓
Observe
 ↓
Alert
 ↓
Upgrade
 ↓
Rollback

Jenkins 可以把流水线本身代码化,GitHub Actions 可以利用自己的 Self-hosted Runner 执行工作流,而 Harbor 可以作为自己的 Artifact / Image Registry。

这意味着以后做一个开源项目时,可以直接把它丢进这个实验室:

复制代码
GitHub
  │
  ▼
GitHub Actions / Jenkins
  │
  ▼
Build & Test
  │
  ▼
Docker Image
  │
  ▼
Harbor
  │
  ▼
Kubernetes
  │
  ▼
Prometheus / Loki / Tempo

这样做出来的就不只是一份 source code。

而是一个:

真正可构建、可发布、可运行、可观察的软件系统。

第四,它可以服务长期的个人技术积累

这是我现在反而觉得最重要的一点。

技术学习很容易碎片化:

今天研究 Linux。

下周学 Docker。

过一阵子学 Kubernetes。

后来又做 Prometheus。

再之后碰 AI、GPU、DPDK。

每个东西单独看,都好像是一个新领域。

但如果始终围绕同一个实验室扩展,它们会慢慢连起来:

复制代码
Linux
  │
  ├── Namespace
  ├── cgroup
  ├── Networking
  ├── Storage
  └── Security
        │
        ▼
     Container
        │
        ▼
    Kubernetes
        │
   ┌────┼───────────┐
   │    │           │
   ▼    ▼           ▼
 CI/CD  Observability  Infrastructure
                     │
              ┌──────┴──────┐
              ▼             ▼
           AI Infra    High Performance
                         Networking

最终积累下来的就不只是知识点,而是一张越来越完整的技术地图。

从这里往外看,这个实验室至少可以长出七条技术路线

这个系列到这里结束,不意味着环境没有东西可以继续玩。

恰恰相反。

现在这个实验室更像是搭好了一个"底座"。

往哪个方向走,都可以从这里继续长。

我觉得至少有七条很清晰的路线。

方向 现在已经具备的基础 可以进一步探索
Ubuntu / Linux / VM Ubuntu 24.04、单节点环境 systemd、进程、Namespace、cgroup、KVM/QEMU、libvirt、NUMA、HugePages、性能调优
Docker / Container Docker、cri-dockerd、Kubernetes Container containerd、runc、OCI、镜像分层、OverlayFS、Rootless Container、CRI
Kubernetes 生产化 kubeadm 单节点集群 HA、etcd、Worker Node、CNI、CSI、RBAC、NetworkPolicy、Ingress/Gateway API
可观测生产化 Prometheus、Grafana、Loki、Tempo、Fluent Bit、OTel Alertmanager、Recording Rule、SLO、Long-term Storage、OTel Collector Pipeline、告警治理
CI/CD 生产化 Jenkins、GitHub Actions、Harbor Pipeline as Code、Runner/Agent 池、GitOps、Argo CD、镜像扫描、SBOM、签名、发布策略
AI Infra Kubernetes + Observability GPU、GPU Operator、Device Plugin、DRA、GPU Metrics、模型推理、分布式训练
高性能网络 Linux + Kubernetes + CNI 基础 eBPF、Cilium、Hubble、Multus、SR-IOV、DPDK、VPP、RDMA

这些方向并不是硬凑出来的。

它们本身就在共享同一套底层能力。

Ubuntu / Linux / VM 方向

容器不是独立于 Linux 存在的魔法。Docker 创建容器时依赖 Linux namespace 提供隔离,同时利用 control groups 管理资源;Linux cgroup v2 本身就是内核提供的分层资源控制机制。

所以继续往下挖,就可以从:

复制代码
Pod CPU Limit

一路追到:

复制代码
Kubernetes resources
        ↓
     kubelet
        ↓
 Container Runtime
        ↓
      cgroup
        ↓
   Linux Kernel

甚至可以做非常具体的实验:

复制代码
cat /proc/<pid>/cgroup

看看容器进程究竟属于哪个 cgroup。

研究:

复制代码
memory.max
cpu.max
cpuset.cpus

再继续研究 NUMA、CPU isolation、HugePages。

Linux 内核官方文档本身就提供了 cgroup v2、CPU isolation 等机制;这些能力同时又会在虚拟化、高性能网络和 AI Infra 里再次出现。

虚拟化也可以继续。

Ubuntu 官方文档完整支持基于 QEMU/KVM 和 libvirt 构建虚拟机环境,甚至可以进一步研究 nested virtualization、HugePages 和设备直通。

这样一来,路线会变成:

复制代码
Physical Machine
      │
      ▼
     KVM
      │
      ▼
Virtual Machines
      │
      ▼
 Kubernetes
      │
      ▼
 Containers

甚至还可以反过来玩 KubeVirt,把 VM 重新放回 Kubernetes API 体系中管理。KubeVirt 会向 Kubernetes 增加 VM 相关资源,让虚拟机也可以像其他 Kubernetes 对象一样被声明和操作。

这时候,"虚拟机"和"容器"就不再是两个互不相关的概念。

Docker / Container 方向

第四篇已经因为 cri-dockerd 带我们第一次碰到了 Kubernetes 与 Runtime 的边界。

以后完全可以单独再搭一个 containerd 节点:

复制代码
现在
Kubernetes
   │
   ▼
cri-dockerd
   │
   ▼
Docker

对比:

复制代码
Kubernetes
   │
   ▼
CRI
   │
   ▼
containerd
   │
   ▼
OCI Runtime
   │
   ▼
Linux Kernel

containerd 官方文档明确说明,它的 CRI 插件直接处理 kubelet 发来的 CRI 请求,并负责容器与镜像生命周期。

这样可以真正把 Docker、containerd、runc、OCI、CRI 这些经常混在一起的概念拆开。

Kubernetes 生产化方向

目前这个单节点实验室最大的优点恰恰也是最大的限制:

复制代码
Everything
   │
   ▼
One Node

实验很方便。

但它不是生产架构。

Kubernetes 官方生产环境指南明确指出,单机 control plane 不具备高可用性;生产环境通常需要考虑控制面复制、API Server 负载均衡、足够的 Worker Node、扩容能力和故障恢复。kubeadm 官方 HA 方案则支持 stacked etcd 和 external etcd 两种主要拓扑。

因此有一天完全可以把它升级成:

复制代码
             Load Balancer
                  │
       ┌──────────┼──────────┐
       ▼          ▼          ▼
 Control Plane Control Plane Control Plane
       │          │          │
       └──────── etcd ───────┘

       ┌──────────┼──────────┐
       ▼          ▼          ▼
    Worker      Worker      Worker

然后继续做:

复制代码
Node Failure
etcd Failure
Control Plane Failure
Rolling Upgrade
Drain / Cordon
PodDisruptionBudget
Affinity
Anti-Affinity
Topology Spread

再加上生产网络和安全能力。

Kubernetes 的 NetworkPolicy 可以在 L3/L4 层约束 Pod 与其他实体之间允许的流量,而 RBAC 则负责通过 Kubernetes API 动态配置授权策略。

存储也可以从现在的简单本地存储,逐渐过渡到:

复制代码
Application
    │
    ▼
   PVC
    │
    ▼
StorageClass
    │
    ▼
   CSI
    │
    ▼
Storage Backend

Kubernetes 的 StorageClass 本身就是用来描述不同存储类别和动态 provisioner 的抽象。

可观测生产化方向

现在我们已经有:

复制代码
Metrics → Prometheus
Logs    → Loki
Traces  → Tempo

但"装好三个 backend"只是第一步。

OpenTelemetry 对 observability signals 的定义已经覆盖 metrics、logs、traces 等遥测数据,而 Collector 可以作为统一的接收、处理、转换和导出层。

以后可以继续演进:

复制代码
Applications
     │
     ▼
OpenTelemetry SDK / Agent
     │
     ▼
OTel Collector
     │
 ┌───┼───────────┐
 ▼   ▼           ▼
Metrics Logs    Traces
 │     │           │
 ▼     ▼           ▼
Prom   Loki       Tempo
        │
        ▼
      Grafana

再进一步研究:

复制代码
Sampling
Cardinality
Retention
Recording Rules
Alert Rules
SLO / SLI
Trace → Log correlation
Metric → Trace exemplar
Long-term storage

Tempo 官方文档就支持把 trace 与 logs、metrics 建立关联,而 Prometheus 可以通过 recording rules 预计算时间序列、通过 alerting rules 生成告警。

第十二篇也可以继续延伸。

现在我们已经经历:

复制代码
Normal
  ↓
Fault Injection
  ↓
Pending
  ↓
Firing
  ↓
Troubleshooting
  ↓
Fault Recovery

以后真正生产化的目标应该是:

复制代码
Symptom
   ↓
Prometheus Rule
   ↓
Alertmanager
   ↓
Group / Deduplicate / Silence / Inhibit
   ↓
Route
   ↓
Human / Automation

Alertmanager 官方设计本身就包含去重、分组、路由、silence 和 inhibition。

这时候,"监控"才开始变成真正的 Observability + Reliability Engineering

CI/CD 生产化方向

目前我们的发布链路大致是:

复制代码
GitHub
   │
   ▼
GitHub Actions / Jenkins
   │
   ▼
Docker Build
   │
   ▼
Harbor
   │
   ▼
kubectl apply
   │
   ▼
Kubernetes

后面一个很自然的方向就是 GitOps。

例如:

复制代码
Developer
   │
   ▼
Source Repo
   │
   ▼
CI
   │
   ├── Test
   ├── Build
   └── Push Image
             │
             ▼
        Config Repo
             │
             ▼
           Argo CD
             │
             ▼
         Kubernetes

Argo CD 的核心模型就是:Git 中保存应用的目标状态,Argo CD 比较 target state 和 live state,再进行同步。

这会把:

复制代码
CI 直接操作 Kubernetes

逐渐变成:

复制代码
CI 负责生成 Artifact
CD 负责让 Cluster 收敛到 Git Desired State

然后再继续加入:

复制代码
Image Scan
SBOM
Image Signing
Policy
Progressive Delivery
Rollback

甚至 Self-hosted Runner 自身也可以 Kubernetes 化。GitHub 官方已经提供 Actions Runner Controller 来在 Kubernetes 中管理 Runner Scale Sets;Jenkins 同样支持基于 controller/agents 模型,并可以在 Kubernetes 中按需启动 agents。

于是一个很有意思的闭环出现了:

复制代码
以前:
CI 帮助部署 Kubernetes

以后:
Kubernetes 自己也可以承载 CI

这就是平台化。

加上一块 GPU 之后,实验室可以真正进入 AI Infra

这里单独拿出来说。

因为之前提到:

是不是增加 GPU,就可以学习 GPU 资源分配和 AI 部署?

答案是:

是,而且这条路线比单纯"跑一个 AI 模型"要有意思得多。

但需要补充一个前提。

如果 Ubuntu Kubernetes Node 直接运行在物理机上,那么 GPU 需要先被 Linux 正确识别。

如果 Kubernetes Node 本身运行在 VM 里,则物理 GPU 还需要先通过 PCI passthrough、vGPU 或其他虚拟化机制暴露给 Guest OS;GPU 在 Guest Linux 中不可见的话,Kubernetes 自然也无从调度。Ubuntu 的 QEMU/KVM 文档已经包含 GPU virtualization 和 passthrough 相关能力。

GPU 真正进入 Kubernetes 后,技术链路会变成:

复制代码
Physical GPU
     │
     ▼
NVIDIA Driver
     │
     ▼
NVIDIA Container Toolkit
     │
     ▼
GPU Device Plugin / DRA Driver
     │
     ▼
Kubernetes Scheduler
     │
     ▼
     Pod
     │
     ▼
CUDA / PyTorch / Model Server

传统 Kubernetes GPU 调度通过 Device Plugin Framework 暴露 GPU、NIC、FPGA 等特殊硬件资源,然后 Pod 可以声明所需的 GPU 资源。

例如经典方式:

复制代码
resources:
  limits:
    nvidia.com/gpu: 1

加上 GPU 以后,就可以实验真正的资源调度问题:

复制代码
Pod A needs GPU
Pod B needs GPU
        │
        ▼
Which GPU?
Which Node?
Can GPU be shared?
How to isolate?
How to observe?
How to schedule fairly?

而到了 2026 年,这件事已经比最初的 nvidia.com/gpu: 1 更值得研究。

Kubernetes 的 Dynamic Resource Allocation,DRA 已经在 Kubernetes v1.35 进入 stable;它允许工作负载通过 DeviceClassResourceClaimResourceClaimTemplate 等对象,更灵活地声明和分配 GPU 等附加设备。

概念开始从:

复制代码
我要 1 块 GPU

走向:

复制代码
我要一类满足特定条件的 accelerator
                 │
                 ▼
             DeviceClass
                 │
                 ▼
            ResourceClaim
                 │
                 ▼
          Kubernetes Allocation
                 │
                 ▼
                Pod

NVIDIA 目前也已经提供面向 Kubernetes DRA 的 GPU Driver,并将 GPU allocation 和更高级的 GPU 拓扑能力接入 DRA。

这就是非常标准的 AI Infra 问题了。

继续往下,还可以研究 GPU 共享。

NVIDIA GPU Operator 支持 GPU time-slicing;需要注意,time-slicing 本质上是在同一物理 GPU 上复用运行时间,并不像 MIG 那样提供内存和故障隔离。

于是可以实验:

复制代码
Dedicated GPU
      vs
Time Slicing
      vs
MIG

然后开始问真正的平台问题:

复制代码
一块 GPU 应该给谁?
GPU 利用率是多少?
显存是不是浪费?
多个 workload 怎么共享?
推理 workload 和训练 workload 怎么隔离?
不同 GPU 型号怎么调度?

更有意思的是,我们之前搭的 Prometheus + Grafana 在这里完全不需要推倒重来。

NVIDIA DCGM Exporter 可以直接将 GPU 遥测信息以 Prometheus exposition format 暴露出来,从而让已有 Prometheus 抓取,再由 Grafana 展示。

于是已有可观测链路可以直接扩展成:

复制代码
CPU Metrics ───────────┐
Memory Metrics ────────┤
Network Metrics ───────┤
Kubernetes Metrics ────┤
                       ▼
GPU Utilization ─── Prometheus ─── Grafana
GPU Memory ────────────┤
GPU Temperature ───────┤
GPU Power ─────────────┘

这其实非常漂亮。

因为你会突然发现:

前十二篇搭的东西不是 AI Infra 的"前置废课",而恰恰就是 AI Infra 的基础设施。

再往应用层走,就可以开始做模型推理:

复制代码
Client
   │
   ▼
Gateway
   │
   ▼
Model Serving
   │
   ▼
Kubernetes Pod
   │
   ▼
GPU

截至 2026 年,Kubernetes 社区已经有专门面向生成式 AI 推理的 Gateway API Inference Extension,用模型服务的 metrics、capabilities 等信息辅助请求路由和负载均衡。

再往训练方向走,则可以研究:

复制代码
Dataset
   │
   ▼
Distributed Training
   │
 ┌─┴───────────┐
 ▼             ▼
GPU Node A   GPU Node B
 │             │
 └──── Network ┘

Kubeflow Trainer 目前就是 Kubernetes-native 的分布式 AI Training 平台,支持 PyTorch、JAX、DeepSpeed、Hugging Face、Megatron 等多种训练框架,并面向多节点、多 GPU 场景。

到这里,技术地图就已经变成:

复制代码
                   AI Application
                         │
                         ▼
                  Model Serving
                         │
                         ▼
                     Kubernetes
                         │
               ┌─────────┼─────────┐
               ▼         ▼         ▼
            Scheduler   DRA      Network
               │         │         │
               └───── GPU ─────────┘
                         │
                         ▼
                   NVIDIA Driver
                         │
                         ▼
                       GPU

然后旁边还有我们已经搭好的:

复制代码
Prometheus
Grafana
Loki
Tempo
OpenTelemetry
CI/CD
Harbor

这就是一个小型 AI Infrastructure Lab 的雏形。

再加高性能 NIC,这个实验室又可以从云原生走到高性能网络

GPU 是一条路线。

另一条我觉得同样很值得保留,而且与 AI Infra 最终甚至会汇合的路线,就是:

High Performance Networking。

目前 Kubernetes 的普通网络路径大致可以抽象成:

复制代码
Application
     │
     ▼
   Socket
     │
     ▼
Linux TCP/IP Stack
     │
     ▼
CNI / veth / Routing
     │
     ▼
   Kernel
     │
     ▼
    NIC

首先可以从 eBPF 开始。

例如把 CNI 换成 Cilium。

Cilium 基于 eBPF 实现 Kubernetes 网络、负载均衡、安全策略和可观测能力;Hubble 则进一步提供 cluster-wide 的网络和安全可见性。

这样一来,我们已有的 Observability 又可以向网络层继续向下延伸:

复制代码
Application Observability
         │
 Metrics / Logs / Traces
         │
         ▼
     OpenTelemetry
         │
         │
---------│-----------------
         │
         ▼
 Network Observability
         │
       Hubble
         │
         ▼
        eBPF
         │
         ▼
   Linux Kernel

这非常适合研究:

复制代码
Pod 到底和谁通信?
DNS 请求去了哪里?
NetworkPolicy 为什么把流量挡掉了?
Service 转发发生在哪里?
TCP 重传从哪里出现?

再向下,可以研究 SR-IOV。

Kubernetes 的 Device Plugin Framework 本身不仅能用于 GPU,也能用于高性能 NIC、InfiniBand 等硬件。

SR-IOV Network Device Plugin 可以发现并向 Kubernetes 暴露 PF、VF 等网络资源,再配合 Multus 和 SR-IOV CNI 把相应设备交给 Pod。

于是网络路径会出现另一种形态:

复制代码
                 Physical NIC
                      │
               ┌──────┼──────┐
               ▼      ▼      ▼
              VF1    VF2    VF3
               │      │      │
               ▼      ▼      ▼
             Pod A  Pod B  Pod C

这就已经非常接近 NFV、Telco Cloud、高性能网络和 AI Cluster 中会遇到的真实问题了。

再继续就是 DPDK。

DPDK 的 Poll Mode Driver 可以在 userspace 直接处理 NIC RX/TX descriptors,以轮询方式进行高速收发。

于是可以比较:

复制代码
传统网络路径

Application
    │
    ▼
Linux Socket
    │
    ▼
Kernel Network Stack
    │
    ▼
Driver
    │
    ▼
NIC

和:

复制代码
DPDK Path

Application
    │
    ▼
DPDK / PMD
    │
    ▼
Userspace
    │
    ▼
NIC Queue
    │
    ▼
NIC

再进一步加入 VPP。

FD.io VPP 是运行在 Linux userspace 的高性能 L2-L4 网络栈,并可以结合 DPDK;VPP 官方也提供了 Kubernetes 集成场景。

到那时候,实验室的方向就可能变成:

复制代码
Kubernetes
    │
    ▼
Multus
    │
    ▼
SR-IOV
    │
    ▼
DPDK / VPP
    │
    ▼
High Performance NIC

有意思的是,这条路线最终还可能和前面的 AI Infra 汇合。

因为分布式 AI 训练最终也是一个:

复制代码
GPU
 │
GPU
 │
GPU

之间大量交换数据的问题。

于是后面自然会碰到:

复制代码
GPU Scheduling
      +
NUMA
      +
PCIe Topology
      +
High Performance NIC
      +
RDMA
      +
Distributed Training

Kubeflow Trainer 本身已经支持 multi-node、multi-GPU 训练,而 Linux 内核也有面向 RDMA/InfiniBand 资源的控制机制;换句话说,AI Infra 与高性能网络从来就不是两个完全分开的技术岛。

于是从今天这个小小的单节点集群向前看,甚至可以画出这样一条路线:

复制代码
                     Ubuntu / Linux
                           │
             ┌─────────────┼─────────────┐
             │             │             │
             ▼             ▼             ▼
         Container     Networking   Virtualization
             │             │             │
             ▼             ▼             ▼
         Kubernetes      eBPF         KVM/QEMU
             │             │
     ┌───────┼───────┐     │
     ▼       ▼       ▼     ▼
Observability CI/CD  GPU  SR-IOV
     │               │     │
     ▼               ▼     ▼
OpenTelemetry     AI Infra DPDK / VPP
                     │       │
                     └───┬───┘
                         ▼
                Distributed AI /
             High Performance Infra

这也是为什么我现在觉得:

"单节点 K8S 可观测实验室"只是它的起点,而不是它最终的边界。

但也要清楚:个人练兵场不等于生产环境

写到这里,很容易产生一种错觉:

我们已经 Prometheus、Grafana、Loki、Tempo、CI/CD、Harbor 都有了,是不是已经接近一个生产 Kubernetes 平台了?

还不是。

这一点反而要在系列最后明确说清楚。

这个实验室最大的设计目标是:

复制代码
低成本
+
可重复
+
可破坏
+
可观察
+
容易恢复

而生产环境首先要求的是:

复制代码
Availability
Security
Scalability
Durability
Governance
Operational Reliability

单节点最大的限制就是:

复制代码
Node Down
   │
   ▼
Everything Down

而 Kubernetes 官方生产指南明确建议,对于需要长期运行和高可用的环境,应考虑复制 control plane、分离控制面和 worker、为 API Server 做负载均衡,并拥有足够的 worker capacity;kubeadm 的 stacked HA 拓扑也建议至少三个 control plane nodes。

同样的区别也存在于 Observability。

单机 Loki 可以很好地学习 LogQL 和日志采集。

但 Loki 官方本身支持从 single binary 到 simple scalable 再到 microservices 的不同部署模式;真正生产化还需要继续考虑对象存储、查询规模、tenant、retention 和容量规划。

Tempo 也是如此,可以从简单部署扩展到更完整的分布式架构。

CI/CD 同样如此。

个人 Self-hosted Runner 非常适合实验,但 GitHub 官方特别提醒,Self-hosted Runner 使用时要注意仓库访问边界;公开仓库的 fork / pull request 可能导致不可信代码在自己的 Runner 上运行,因此安全隔离是生产化时必须重新设计的问题。

Harbor 生产化也不只是:

复制代码
docker push
docker pull

而会继续涉及漏洞扫描、复制、权限、生命周期、备份、监控等能力。Harbor 当前可以通过 Trivy 做 Artifact 漏洞扫描,并且自身也可以暴露 Prometheus 风格的运行指标。

所以这个实验室真正正确的定位不是:

"在家搭了一个生产 Kubernetes。"

而应该是:

"我拥有了一个可以用生产问题来训练自己的非生产环境。"

我觉得这两句话区别非常大。

在生产环境里:

复制代码
不要随便动。

在实验室里:

复制代码
就是要动。

生产最怕:

复制代码
挂了。

实验室反而应该主动:

复制代码
把它搞挂。

例如:

复制代码
删一个 Pod
停 kubelet
打满 CPU
吃光 Memory
制造 Pending
写错镜像
断掉网络
改错 Service
制造 Alert
让 Trace 变慢
模拟 Node NotReady

然后问自己:

复制代码
我能不能先从 Grafana 看到异常?

能不能从 Prometheus 找到 symptom?

能不能从 Logs 找到 error?

能不能从 Trace 找到具体调用?

能不能用 kubectl 找到 Kubernetes 状态变化?

能不能继续下沉到 kubelet / runtime / Linux?

最后能不能恢复?

这才是实验室真正应该训练的能力。

不是:

"我会不会安装这个软件。"

而是:

"当系统不正常时,我能不能理解它为什么不正常。"

写在最后:系列结束,但这个实验室真正留下的是一张技术地图

十三篇文章写到这里,这个系列就可以结束了。

暂时也不需要急着规划"第十四篇"。

因为我觉得现在最重要的,并不是为了继续写系列而硬找一个软件安装上去。

反而应该停下来看看:

我们到底得到了什么?

最开始,只有一台 Ubuntu。

复制代码
Ubuntu 24.04

然后我们安装了 Kubernetes。

复制代码
Ubuntu
   │
   ▼
Kubernetes

接着加入可观测系统。

复制代码
Kubernetes
   │
   ├── Prometheus
   ├── Grafana
   ├── Loki
   ├── Fluent Bit
   ├── Tempo
   └── OpenTelemetry

然后加入 CI/CD。

复制代码
GitHub
   │
   ├── Jenkins
   └── GitHub Actions
          │
          ▼
        Harbor
          │
          ▼
      Kubernetes

再做压测、告警和故障注入。

复制代码
Application
    │
    ▼
Load Testing
    │
    ▼
Metrics Change
    │
    ▼
Grafana
    │
    ▼
Alert
    │
    ▼
Troubleshooting
    │
    ▼
Fault Recovery

走到今天,它已经可以被重新画成这样:

复制代码
                         Personal Tech Lab
                                │
        ┌───────────────────────┼───────────────────────┐
        │                       │                       │
        ▼                       ▼                       ▼
     Linux / VM             Containers             Kubernetes
        │                       │                       │
   Ubuntu / KVM         Docker / containerd       kubeadm / CRI
        │                       │                       │
        └───────────────┬───────┴────────┬──────────────┘
                        │                │
                        ▼                ▼
                     CI / CD        Observability
                        │                │
                 Jenkins / GHA      Prometheus
                     Harbor            Grafana
                        │               Loki
                        │               Tempo
                        │          OpenTelemetry
                        │                │
                        └────────┬───────┘
                                 │
                                 ▼
                          Real Workloads
                                 │
                   ┌─────────────┴─────────────┐
                   ▼                           ▼
                AI Infra             High Performance Network
                   │                           │
             GPU / DRA / AI           eBPF / Cilium / SR-IOV
                   │                  DPDK / VPP / RDMA
                   └─────────────┬─────────────┘
                                 ▼
                     Future Infrastructure Lab

现在再回过头看,我觉得这个系列最大的收获,并不是我们"装了十二套东西"。

而是这些原本散落的技术第一次被放到了同一张地图上:

复制代码
Linux
Virtualization
Container
Kubernetes
Networking
Storage
Security
CI/CD
Observability
OpenTelemetry
GPU
AI Infra
High Performance Networking

以前可能觉得:

Linux 是 Linux。

Docker 是 Docker。

Kubernetes 是 Kubernetes。

Prometheus 是 Prometheus。

GPU 又是另外一个世界。

DPDK 更是完全不同的领域。

但真正把系统搭起来以后会发现,它们实际上层层相连。

一个 Pod 的 CPU Limit,最终会落到 Linux cgroup。

一个 Pod 的创建,最终需要 kubelet 通过 CRI 找到 container runtime。

一个 Service 的访问问题,会把你带到 Kubernetes Networking、CNI 和 Linux 网络栈。Kubernetes 官方自己就把 cluster networking 分为 container-to-container、Pod-to-Pod、Pod-to-Service 和 external-to-Service 等不同通信问题。

一个应用延迟问题,可能要同时看 Metrics、Logs 和 Traces。

一个 CI/CD 发布问题,会把 Git、Runner、Registry、Image 和 Kubernetes 串起来。

加一块 GPU,又会把 Linux Driver、Container Runtime、Kubernetes Scheduler、Device Plugin、DRA、Prometheus 和 AI Workload 全部重新串在一起。

再加高性能 NIC,网络、NUMA、PCIe、SR-IOV、DPDK、RDMA 和分布式 AI 又会继续连起来。Kubernetes 的设备模型本身已经面向 GPU、高性能 NIC、FPGA、InfiniBand 等专用硬件,这也是为什么这些扩展可以沿着同一套 Kubernetes 基础设施继续向前。

所以最后,我不太想用:

"我们终于学完 Kubernetes 了。"

来结束这个系列。

因为显然没有学完。

Kubernetes 也不可能通过十三篇文章"学完"。

我更愿意这样总结:

我们终于搭好了一个可以继续学习 Kubernetes,以及 Kubernetes 背后整个现代基础设施世界的地方。

它可以服务工作。

遇到问题,可以复现。

它可以服务学习。

看到概念,可以实验。

它可以服务开源项目。

写完代码,可以真正构建、发布、部署和观察。

它可以服务个人长期技术积累。

以后学 Linux,可以放进来。

学 containerd,可以放进来。

学 Cilium,可以放进来。

研究 GitOps,可以放进来。

有 GPU 了,可以做 AI Infra。

有高性能网卡了,可以做 SR-IOV、DPDK、VPP、RDMA。

甚至几年之后再回来看,也许这个实验室早就已经不是今天这个样子了。

但这正是它存在的意义。

一个好的实验室,不应该是搭完之后再也不动的"成品"。

它应该是一个可以随着自己的技术方向不断变化的环境。

今天,它是一个:

单节点 K8S 可观测实验室。

以后,它也许会变成:

Linux 实验室。
容器运行时实验室。
Kubernetes 平台实验室。
可观测性实验室。
CI/CD 与 GitOps 实验室。
AI Infra 实验室。
高性能网络实验室。

但名字其实已经不重要了。

因为到最后,它真正代表的是:

一个属于自己的个人技术练兵场。

可以拆。

可以改。

可以升级。

可以压测。

可以把它搞挂。

可以再把它救回来。

可以在这里理解那些生产环境里没有机会随便实验的东西。

也可以把工作中见到的问题、学习中遇到的概念、开源项目里的想法,一个一个搬进来验证。

从 Ubuntu 24.04 开始,我们最后搭出来的,并不是一个多么庞大的 Kubernetes 平台。

但它给了我们一样更重要的东西:

一个可以持续探索现代基础设施的起点。

所以,这个系列到这里,就正式结束吧。

不急着决定下一篇写什么。

以后真的遇到了值得研究的问题,或者想往某个方向继续走,再回来折腾它。

毕竟,真正的学习路线从来不会严格按照目录发生。

有时候是因为一个 kubectl exec 报错。

有时候是因为一个 Pod 一直 Pending。

有时候是因为 Grafana 上突然出现一条奇怪的曲线。

以后,也可能是因为加了一块 GPU。

或者插了一张支持 SR-IOV 的网卡。

然后,一个新的问题,又会把我们带到新的地方。

十三篇,系列完。

实验室,不完。

相关推荐
Romantic_love_1 小时前
理解USART真实收发过程
开发语言·stm32·单片机·学习
μθημα1 小时前
K8s Pod 管理实战:虚拟机环境下的具体命令与步骤
java·docker·kubernetes
梦梦代码精1 小时前
深度体验BuildingAI:一款集成商业闭环的开源智能体平台
人工智能·docker·开源·代码规范
省长1 小时前
不想写代码,但想要集成一个登录页面?Sa-Token-Quick-Login 帮你实现!
java·后端·开源
MartinYeung51 小时前
[论文学习]潜伏代理:训练能够经受安全训练的欺骗性大语言模型深度分析
学习·安全·语言模型
撩得Android一次心动1 小时前
Kotlin 语言【知识点整理3】
java·开发语言·笔记·学习·kotlin
zlinear数据采集卡2 小时前
FRAM铁电存储器原理深度解析:D223校准参数的“永久保险箱“
arm开发·人工智能·stm32·单片机·fpga开发·开源
leisoo80972 小时前
本地股票数据深度对比ClickHouse与Parquet存储方案 IG50免费开源股票数据API接口
clickhouse·开源
石头猫灯2 小时前
一次 CMS 被黑实录:完整事件思路梳理
android·学习