1. 为什么要在Windows上搭建迷你K8s集群?
最近在帮几个初创团队做技术架构咨询时,经常被问到同一个问题:"我们主力开发环境都是Windows笔记本,能不能在本地先搭个轻量级K8s做功能验证?" 这确实是个痛点——传统minikube方案对Windows支持有限,而直接上云成本又太高。经过多次实践验证,我总结出一套在Windows 10/11上5分钟快速部署的生产级迷你K8s方案,单机即可模拟多节点集群的核心功能。
这个方案特别适合:
- 需要快速验证K8s编排功能的Windows开发者
- 想学习K8s但不想折腾虚拟机的入门者
- 本地开发环境需要对接生产K8s配置的团队
实测环境:Windows 11 22H2 + WSL2 Ubuntu 20.04,8核CPU/16GB内存配置下可稳定运行3节点集群
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件选型与原理
2.1 容器运行时:containerd为何胜出
相比Docker的臃肿架构,我们选择containerd作为底层运行时:
- 内存占用减少40%(实测单节点仅需300MB)
- 直接支持CRI(Container Runtime Interface)标准
- 无GUI组件,纯命令行操作更符合K8s设计哲学
配置关键点在于正确挂载Windows到Linux的路径转换:
bash复制# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "windows-lcow" # 启用Windows/Linux混合模式
2.2 轻量化K8s发行版对比
| 方案 | 资源消耗 | Windows支持 | 网络性能 | 适用场景 |
|---|---|---|---|---|
| minikube | 高 | 一般 | 差 | 快速体验 |
| kind | 中 | 不完善 | 中 | CI/CD测试 |
| k3s | 低 | 优秀 | 优 | 生产级开发环境 |
| microk8s | 中 | 不支持 | 中 | Ubuntu环境 |
最终选择k3s的三大理由:
- 单二进制部署,无需复杂依赖
- 内置轻量级网络方案flannel
- 默认禁用非必要组件(如cloud-controller)
3. 手把手部署实战
3.1 环境准备清单
- 启用WSL2并安装Ubuntu 20.04 LTS
powershell复制wsl --install -d Ubuntu-20.04 - 配置内核参数(解决常见的内存分配错误)
bash复制sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf - 安装Docker for Windows并开启WSL集成
3.2 三步安装k3s集群
- 主节点初始化(禁用traefik以节省资源)
bash复制curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-backend=host-gw --disable=traefik" sh - - 获取join token
bash复制sudo cat /var/lib/rancher/k3s/server/node-token - 工作节点加入(假设主节点IP为192.168.1.100)
bash复制
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=xxx sh -
3.3 网络调优关键配置
在/etc/rancher/k3s/config.yaml中添加:
yaml复制flannel-backend: host-gw
node-ip: 192.168.1.101 # 当前节点实际IP
cluster-cidr: 10.42.0.0/16
service-cidr: 10.43.0.0/16
4. 常见问题排坑指南
4.1 节点状态NotReady排查流程
- 检查containerd日志
bash复制
journalctl -u containerd -n 50 --no-pager - 验证网络插件是否正常
bash复制
kubectl get pods -n kube-system -l k8s-app=flannel - 常见错误解决方案:
- 错误代码125:增加WSL内存限制
powershell复制# %UserProfile%\.wslconfig [wsl2] memory=4GB - 错误代码137:禁用Windows Defender实时防护
- 错误代码125:增加WSL内存限制
4.2 服务无法跨节点访问
典型症状:NodePort服务只能在部署节点访问
解决方案:
bash复制# 在主节点执行
sudo iptables -t filter -P FORWARD ACCEPT
5. 性能优化实战技巧
5.1 资源限制配置
给k3s服务添加内存限制(示例配置):
bash复制sudo sed -i 's/ExecStart=.*/& --kubelet-arg=eviction-hard=memory.available<500Mi/' /etc/systemd/system/k3s.service
5.2 Windows特有优化
- 禁用WSL2的自动内存回收:
powershell复制# .wslconfig [wsl2] kernelCommandLine = "sysctl.vm.drop_caches=0" - 定期清理磁盘空间:
powershell复制wsl --shutdown diskpart select vdisk file="%UserProfile%\AppData\Local\Packages\...\ext4.vhdx" compact vdisk
这套方案在我团队内部已经稳定运行半年,支撑了多个项目的本地开发需求。最大的收获是发现k3s的--resolv-conf参数可以完美解决Windows下的DNS解析问题,具体用法是在启动时添加:
bash复制--resolv-conf /run/systemd/resolve/resolv.conf
对于需要更复杂功能的场景,建议配合Lens IDE进行可视化管理,它能自动识别WSL2内的k3s集群,比原生的kubectl更方便进行资源监控和日志查看。
