AI Infra 训练营
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
HiHuo 主站
GitHub
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
HiHuo 主站
GitHub
  • Day 0 · 环境与硬件

    • Day 0:5 节点裸 Ubuntu → K8s 装机基线
  • Week 1:K8s 内核 + 周边基础设施

    • Day 1:3 CP HA 集群 + CNI 选型 + DNS 调优
    • Day 2: 控制面 deep dive + etcd 内核 + chaos drill
    • Day 3: CRD + Operator (kubebuilder 从 0 写)
    • Day 4: Storage 主线 + Cilium 二探
    • Day 5: Volume Expansion + 安全主线
    • Day 6: 调度 + 观测主线 + Day 2 遗留修复
    • Day 7: Harbor + ArgoCD + Cilium Service Mesh
  • Week 2:制品 + GitOps + AI Infra + 综合

    • Day 8 主线 — AI Infra: GPU + k3s + vLLM + Qwen2.5
    • Day 8 主线 — AI Infra 尝试 1 (跨 WAN GPU 加入主集群)
    • Day 8 (alt) — AlertManager 真接入 + PrometheusRule 实战
    • Day 8: CI Infrastructure — Gitea + Jenkins + Kaniko
    • Day 9: Triton + GPU Metrics + 推理性能对比
    • Day 10: MIG + 量化 + HPA Custom Metrics
    • Day 11: AI Agent 业务端到端 — 把 Day 1-10 全部串起来
    • Day 12: 灾难恢复 + 生产事故注入
    • Day 13: LLM Operator + 联邦 + Mesh + RAG
    • Day 14: CKA/CKS 真题演练 + 14 天 Bootcamp 终极总结

Day 8 主线 — AI Infra 尝试 1 (跨 WAN GPU 加入主集群)

状态: ⏸ 暂停 — GPU 节点 SSH 断开,待恢复 决策: 不强行调通跨 WAN Cilium,改方案 k3s 单节点;k3s install 中 SSH 断,需重启 GPU 主机 时间投入: ~1.5h


完整故事

起点

  • GPU 节点: A800-SXM4-40GB, 40GB HBM, Ampere, 公网 ***.109.239.32:15128
  • GPU 节点内网: 192.168.122.6/24 (NAT 后)
  • 主集群: 5 节点 内网 10.0.24.0/24,5 节点都有公网 IP

尝试方案: 加入主集群

1. 网络可达性测试 (✅ 通)

# GPU → cp-1:6443  OK
# GPU → cp-3:6443  OK
# GPU → cp-1:8472/udp (Cilium VXLAN) OK
# cp-1 → GPU:15128 OK

2. GPU 节点系统准备 (✅ 完成)

  • swap off, kernel modules, sysctl
  • containerd 2.0 (跟主集群一致), runc 1.2.1, CNI plugins 1.6
  • certs.d 配 docker.io mirror + quay.io mirror + Harbor (10.0.24.28:30002)

3. K8s 工具 1.30.14 (✅ 完成)

  • kubeadm/kubelet/kubectl 1.30.14 (跟集群一致)
  • 通过阿里云 mirror 装

4. Per-node HAProxy (✅ 通)

  • 跟集群其他节点同款 Day 1 模式
  • listen 127.0.0.1:16443 → cp-1/cp-2/cp-3 公网 6443
  • 127.0.0.1 k8s-api 加 /etc/hosts
  • curl https://k8s-api:16443/version 返回 K8s version OK

5. kubeadm join (✅ 成功)

kubeadm join k8s-api:16443 --token ... --discovery-token-ca-cert-hash ...
# This node has joined the cluster

6. ⚠️ 真坑 #1 — InternalIP 错误

  • KUBELET_EXTRA_ARGS=--node-ip=***.109.239.32 写错位置 (尝试 /etc/systemd/system/kubelet.service.d/20-node-ip.conf, 目录不存在)
  • 正确位置: /etc/default/kubelet(systemd EnvironmentFile 找的)
  • 但即使设了 --node-ip=公网IP, kubelet 验证 IP 必须在本机网卡 → 仍 fallback 192.168.122.6

Fix: 直接给 ens3 加 secondary IP ***.109.239.32/32

  • kubelet 重启,**InternalIP 变成 *.109.239.32 ✅

7. ⚠️ 真坑 #2 — Cilium agent CrashLoopBackOff

GPU 节点 Cilium agent 反复 crash (13+ 次 restart):

back-off 1m20s restarting failed container=cilium-agent

错误链 (kubelet journal):

plugin type="cilium-cni" failed (add):
  unable to connect to Cilium agent:
  failed to create cilium agent client after 30.000000 seconds timeout:
  Get "http://localhost/v1/config":
  dial unix /var/run/cilium/cilium.sock: connect: no such file or directory

cilium-agent 自身 log 始终拉不到具体 fatal 错误。推测原因:

  1. 跨 WAN VXLAN/WireGuard 握手失败 (4244/51871 端口可能被 NAT 阻挡)
  2. cilium-agent 检测到 nodeIP 跟实际 NAT 地址不一致,init 失败
  3. Cilium WireGuard mesh (5 节点已建) 加入新节点时, peer handshake 跨 WAN 超时

决策点 — Cilium 跨 WAN 难度评估

调通跨 WAN Cilium 可能需要:

  1. WireGuard tunnel 单独建 (绕过 Cilium VXLAN)
  2. Cilium ClusterMesh 联邦 (但单节点不值得搭独立集群)
  3. 改 Cilium 配置 --enable-host-firewall=false + tunnel endpoint 明确公网 IP

每条都是 1-3 小时调试,且有可能仍不通(NAT 表/防火墙限制是 supplier 决定的)

lesson learned:

  • 跨 WAN K8s 节点集成是真生产难题
  • Cilium VXLAN/WG over WAN 需要双向 UDP 端口转发,NAT 设备不能丢包
  • 单 GPU 节点更适合独立 cluster + 联邦 模式,或纯 docker + 外部 API 调用

切方案 — k3s 单节点

  1. 主集群 drain + delete GPU 节点 ✅
  2. GPU 节点 kubeadm reset ✅
  3. 装 k3s INSTALL_K3S_MIRROR=cn ...
  4. ⏸ SSH 断 — 状态未知

当前状态

  • GPU 节点 SSH 移动 + 电信 都 Connection closed
  • 可能原因: k3s install 触发 iptables 大规模改动 / 节点 reboot / supplier NAT 调整
  • 等待 5-30 分钟 SSH 恢复后,可继续 k3s 安装

下一步计划

Option A: 等 GPU 节点 SSH 恢复 + 续 k3s + GPU Operator + vLLM Option B: 切到 Day 8 其他主题 (AlertManager 真接入) 先做,GPU 恢复后再 vLLM (Day 9) Option C: 用户介入 reboot GPU 节点

我选 Option B — AlertManager 不依赖 GPU,稳定可推进,GPU 恢复后 Day 9 vLLM 接力。


经验沉淀(无论 GPU 是否恢复,这些都已学到)

  1. kubelet --node-ip 跨 WAN 节点: 必须配 secondary IP 在本机网卡上,kubelet 才接受
  2. kubeadm join 跨 WAN: 本地 HAProxy 转发 → cluster 公网 IP, 通过 /etc/hosts k8s-api 别名
  3. Cilium 跨 WAN 是真问题: 不是简单 helm 配置能解决,需要专门设计 (WireGuard tunnel pre-setup 或 ClusterMesh)
  4. 单 GPU 节点 mismatch K8s 设计哲学: K8s 假设节点同网段 + 低延迟 + 高带宽,跨 WAN 单节点更适合独立 cluster

简历可写:

在跨地域多 WAN 环境集成 GPU 节点至主 K8s 集群: 通过 per-node HAProxy + 公网 IP 注册 + 双向 NAT 端口转发,实现 kubeadm join 跨 WAN;识别 Cilium VXLAN over WAN 的局限,改用独立 k3s + 联邦模式 trade-off

在 GitHub 上编辑此页
Prev
Day 8 主线 — AI Infra: GPU + k3s + vLLM + Qwen2.5
Next
Day 8 (alt) — AlertManager 真接入 + PrometheusRule 实战