4 节点 k3s(--docker)集群 测试方案
机器:Intel Xeon E5 2650 / 192GB RAM / 340GB 磁盘 目标:最小资源跑通集群,后续逐步加配置 预计耗时:40 60 分钟 目录 阶段一:创建 4 台 VM 阶段二:安装 k3s 集群 …
机器:Intel Xeon E5-2650 / 192GB RAM / 340GB 磁盘 目标:最小资源跑通集群,后续逐步加配置 预计耗时:40-60 分钟
目录
阶段一:创建 4 台 VM
1.1 下载 Ubuntu ISO
在 Proxmox 宿主机上执行:
cd /var/lib/vz/template/iso
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso
1.2 Web GUI 创建 control-plane 节点
打开 Proxmox Web GUI(https://<宿主机IP>:8006),点击 Create VM,填以下参数:
| 页面 | 设置值 |
|---|---|
| VM ID | 201 |
| Name | k3s-cp |
| ISO | ubuntu-24.04-live-server-amd64.iso |
| System | BIOS: Default, SCSI Controller: VirtIO SCSI single |
| Disks | Bus: VirtIO Block, 大小: 20 GB, Cache: Write back |
| CPU | 2 cores, Type: host |
| Memory | 2048 MB |
| Network | Bridge: vmbr0, Model: VirtIO (paravirtualized) |
| Confirm | 勾选 Start after created |
安装 Ubuntu 时选择 Ubuntu Server minimal,只装系统不装额外包。
1.3 转为模板
# 关机
qm shutdown 201 && qm wait 201
# 转为模板
qm template 201
1.4 克隆 3 个 worker 节点
# 克隆 worker 1
qm clone 202 201 --name k3s-w1 --full 1
qm set 202 --memory 1536 --cores 1
qm resize 202 virtio0 15G
# 克隆 worker 2
qm clone 203 201 --name k3s-w2 --full 1
qm set 203 --memory 1536 --cores 1
qm resize 203 virtio0 15G
# 克隆 worker 3
qm clone 204 201 --name k3s-w3 --full 1
qm set 204 --memory 1536 --cores 1
qm resize 204 virtio0 15G
1.5 启动所有 VM
for vmid in 201 202 203 204; do qm start $vmid; done
qm list
1.6 配置静态 IP(推荐)
每台 VM 的 /etc/netplan/ 下找到配置文件(如 00-installer-config.yaml),改为:
# /etc/netplan/00-installer-config.yaml
network:
ethernets:
ens18:
addresses:
- 192.168.1.5X/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
version: 2
IP 分配:
| 节点 | IP 地址 |
|---|---|
| k3s-cp | 192.168.1.51 |
| k3s-w1 | 192.168.1.52 |
| k3s-w2 | 192.168.1.53 |
| k3s-w3 | 192.168.1.54 |
生效配置:sudo netplan apply
阶段二:安装 k3s 集群
2.1 安装 Docker(所有 4 台 VM 都要执行)
# SSH 进每台 VM,重复执行
ssh alice@192.168.1.51 # 以及 .52 .53 .54
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# 退出重新 SSH 让组生效,或执行: newgrp docker
# 验证
docker --version
docker run hello-world
2.2 安装 k3s server(只跑在 control-plane)
# SSH 到 192.168.1.51(k3s-cp)
curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC="--docker \
--disable=traefik \
--node-name=k3s-cp \
--kube-apiserver-arg=service-node-port-range=20000-50000" \
sh -
如果你在国内网络,用镜像加速:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--docker --node-name=k3s-cp" \
sh -
2.3 获取加入 token
sudo cat /var/lib/rancher/k3s/server/node-token
输出类似:K1070c8a0b...::server:node-token-xxxx
2.4 worker 加入集群(w1/w2/w3 各执行一次)
# SSH 到 192.168.1.52(k3s-w1),然后:
curl -sfL https://get.k3s.io | \
K3S_URL=https://192.168.1.51:6443 \
K3S_TOKEN=<上面拿到的token> \
INSTALL_K3S_EXEC="--docker --node-name=k3s-w1" \
sh -
对 w2(.53)和 w3(.54)重复,把 --node-name 改为 k3s-w2 和 k3s-w3。
2.5 ✅ 检查点:4 节点 Ready
回到 control-plane 节点:
sudo k3s kubectl get nodes
预期输出:
NAME STATUS ROLES AGE VERSION
k3s-cp Ready control-plane,master 2m v1.31.x+k3s1
k3s-w1 Ready <none> 1m v1.31.x+k3s1
k3s-w2 Ready <none> 1m v1.31.x+k3s1
k3s-w3 Ready <none> 1m v1.31.x+k3s1
如果某个节点 STATUS 为
NotReady,等 30 秒再查,首次拉取镜像需要时间。
阶段三:验证集群功能
✔️ 验证 1:系统 Pod 运行正常
sudo k3s kubectl get pods -n kube-system
应看到 coredns 和 metrics-server 状态为 Running。
✔️ 验证 2:调度 nginx Pod
# 创建一个 deployment
sudo k3s kubectl create deployment nginx-test --image=nginx:alpine
# 观察状态变化(耐心等拉取镜像)
sudo k3s kubectl get pods -w
# 预期: Pending → ContainerCreating → Running
# 暴露为 NodePort 服务
sudo k3s kubectl expose deployment nginx-test --port=80 --type=NodePort
# 查看分配到的端口
sudo k3s kubectl get svc nginx-test
# 输出示例: nginx-test NodePort 10.43.xx.xx <none> 80:30234/TCP
✔️ 验证 3:从外部访问 Pod
从 Proxmox 宿主机或同网络的其他机器:
curl http://192.168.1.51:30234
# 应返回 nginx welcome page 的 HTML
✔️ 验证 4:Pod 分布在不同的 worker
# 强制调度到指定节点
sudo k3s kubectl run nginx-w1 --image=nginx:alpine \
--overrides='{"spec":{"nodeName":"k3s-w1"}}'
sudo k3s kubectl run nginx-w2 --image=nginx:alpine \
--overrides='{"spec":{"nodeName":"k3s-w2"}}'
# 查看分布
sudo k3s kubectl get pods -o wide
✔️ 验证 5:删除测试负载
sudo k3s kubectl delete deployment nginx-test
sudo k3s kubectl delete pod nginx-w1 nginx-w2
全部通过 → k3s 集群正常工作,可以继续部署 GZCTF。
✔️ 验证 6(可选):GZCTF 的 k8s 连接
在 control-plane 上导出 kube-config:
# 获取 kubeconfig
sudo cat /etc/rancher/k3s/k3s.yaml
更改 server: 字段中的 127.0.0.1 为 192.168.1.51(control-plane 的对外 IP),保存到 GZCTF 能访问的位置即可。
阶段四:扩容指南
测试通过后,按需逐步加资源。
扩容命令速查
| 操作 | 命令(在 Proxmox 宿主机执行) |
|---|---|
| 加 CPU | qm set <VMID> --cores <N> |
| 加内存 | qm set <VMID> --memory <MB> |
| 加磁盘 | qm resize <VMID> virtio0 +<增量>G |
| 改 CPU 类型 | qm set <VMID> --cpu host |
vCPU 和内存操作需要停机。磁盘可以在线扩展。
磁盘扩展后(VM 内操作)
# 确认新磁盘已识别
lsblk
# 扩展分区(假设 /dev/vda1 是根分区)
sudo growpart /dev/vda 1
# 扩展文件系统(ext4)
sudo resize2fs /dev/vda1
分阶段扩容路线图
| 阶段 | 操作 | 目的 |
|---|---|---|
| 现阶段的测试 | 保持最小配置(5核/6.5G/65G) | 验证功能 |
| 跑 GZCTF 测试 | cp: 2G→8G 内存, 20G→40G 盘 | GZCTF + DB 需要更多内存 |
| 出题阶段 | worker: 1.5G→8G→16G→32G 逐步加 | 拉取题目镜像+容器 |
| 正式比赛 | worker: 32G→48G, 盘 15G→80G | 全量容器负载 |
| 终极形态 | cp: 6核/24G/80G, worker: 各6核/48G/80G | 参考 4节点资源配置分配方案.md |
扩容参考值
# 以 worker-1(VM 202)为例,从最小扩到推荐配置:
# 停机
qm shutdown 202 && qm wait 202
# 改配置
qm set 202 --memory 49152 # 1.5G → 48GB
qm set 202 --cores 6 # 1核 → 6核
qm resize 202 virtio0 +65G # 15G → 80G
# 开机
qm start 202
附录:故障排查
节点 NotReady
# 查看节点状态详情
sudo k3s kubectl describe node k3s-w1
# 在对应 worker 上查看 k3s agent 日志
sudo journalctl -u k3s-agent --no-pager -n 50
Docker 未安装
如果 k3s 安装报错说找不到 Docker:
# 确认 Docker 已安装
which dockerd
docker info
# 如果容器运行时错误,检查 Docker 服务状态
sudo systemctl status docker
加入集群失败
# 在 worker 上重新安装 k3s agent 前,先清理
sudo /usr/local/bin/k3s-agent-uninstall.sh
# 检查 token 和 IP 是否正确
# token 在 control-plane 上:sudo cat /var/lib/rancher/k3s/server/node-token
# URL 格式:https://<control-plane-IP>:6443
Pod 一直 Pending
sudo k3s kubectl describe pod <pod-name>
# 常见原因:
# - 节点资源不足(节点 NotReady / 内存不足)
# - 镜像拉取失败(网络问题 / 镜像名错误)
# - 调度策略限制(taint 未容忍)
网络不通
# 检查 VM 之间是否可以互相 ping
ping 192.168.1.52 # 从 control-plane ping worker-1
# 检查 k3s 服务端口
sudo ss -tlnp | grep -E "6443|10250"
# 检查防火墙(Ubuntu 默认无防火墙)
# sudo ufw status
卸载 k3s
# control-plane
sudo /usr/local/bin/k3s-uninstall.sh
# worker
sudo /usr/local/bin/k3s-agent-uninstall.sh
环境速查
| 项目 | 值 |
|---|---|
| 宿主机 CPU | Intel Xeon E5-2650(32 线程) |
| 宿主机内存 | 192 GB |
| 宿主机磁盘剩余 | 340 GB |
| 虚拟机管理程序 | Proxmox VE |
| VM 操作系统 | Ubuntu Server 24.04 LTS |
| 容器运行时 | Docker(k3s –docker 模式) |
| k3s 网络 | Flannel(VXLAN, 默认) |
| 4 VM 最小总内存 | 6.5 GB |
| 4 VM 最小总磁盘 | 65 GB / 340 GB(可用 275 GB 扩容) |
| 集群 Pod CIDR | 10.42.0.0/16 |
| 集群 Service CIDR | 10.43.0.0/16 |
| NodePort 端口范围 | 20000-50000 |
配合脚本:
create-k3s-vms.sh(在 Proxmox 宿主机上以 root 执行) 完整方案:4节点k3s最小可测试方案.md(详细分析、内存细账、磁盘分解)
原始笔记:cloud/gz-ctf/测试方案.md