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 错误。推测原因:
- 跨 WAN VXLAN/WireGuard 握手失败 (4244/51871 端口可能被 NAT 阻挡)
- cilium-agent 检测到 nodeIP 跟实际 NAT 地址不一致,init 失败
- Cilium WireGuard mesh (5 节点已建) 加入新节点时, peer handshake 跨 WAN 超时
决策点 — Cilium 跨 WAN 难度评估
调通跨 WAN Cilium 可能需要:
- WireGuard tunnel 单独建 (绕过 Cilium VXLAN)
- Cilium ClusterMesh 联邦 (但单节点不值得搭独立集群)
- 改 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 单节点
- 主集群 drain + delete GPU 节点 ✅
- GPU 节点 kubeadm reset ✅
- 装 k3s
INSTALL_K3S_MIRROR=cn... - ⏸ 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 是否恢复,这些都已学到)
- kubelet
--node-ip跨 WAN 节点: 必须配 secondary IP 在本机网卡上,kubelet 才接受 - kubeadm join 跨 WAN: 本地 HAProxy 转发 → cluster 公网 IP, 通过
/etc/hostsk8s-api 别名 - Cilium 跨 WAN 是真问题: 不是简单 helm 配置能解决,需要专门设计 (WireGuard tunnel pre-setup 或 ClusterMesh)
- 单 GPU 节点 mismatch K8s 设计哲学: K8s 假设节点同网段 + 低延迟 + 高带宽,跨 WAN 单节点更适合独立 cluster
简历可写:
在跨地域多 WAN 环境集成 GPU 节点至主 K8s 集群: 通过 per-node HAProxy + 公网 IP 注册 + 双向 NAT 端口转发,实现 kubeadm join 跨 WAN;识别 Cilium VXLAN over WAN 的局限,改用独立 k3s + 联邦模式 trade-off