Alice.tech

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