1. Windows 上折腾 K8s,为什么我最后选了 WSL2 + kind
如果你在 Windows 上想学 Kubernetes,大概率经历过这样的纠结:装 Docker Desktop 自带一个 K8s,但版本老、开关藏得深;用云厂商的托管集群,钱包又扛不住;直接开虚拟机跑 kubeadm,光初始化就能卡你一下午。我试过几种组合之后,稳定下来的方案是 WSL2 + kind,也就是把单节点集群跑在 Docker 容器里,Windows 只负责开个终端。
这套组合的好处很直接。WSL2 本质是一个轻量 Linux 虚拟机,内核和 Windows 共享,启动快、内存占用可控;kind 用容器模拟 K8s 节点,一条命令就能拉起一个 control-plane,删掉也干净,不会在你系统里留一堆 systemd 服务。对做实验、跑 CI、验证 YAML 来说,它比 minikube 更省资源,比 k3s 更贴近标准 K8s 行为。
但真正让我头疼的不是集群本身,而是周边那堆 AI 工具。Claude Code、Cursor、各种 CLI Agent,每个都要配 API Key、Base URL、模型名,配置文件散落在~/.config、项目根目录、环境变量里。换一次 Key 要改五六个地方,密钥还容易跟着 dotfiles 一起被提交上去。所以这篇除了把 WSL2 + kind 的完整路径走一遍,还会把 TaoToken 的统一 Key 接进这套环境,让集群实验和 AI 编码工具共用一套凭证。
适合谁看:Windows 10/11 开发者,想在本机跑一个能随时删掉重建的 K8s 实验环境,同时希望 AI 工具的密钥管理别再那么乱。全程命令可复制,遇到报错我在第 5 节列了排查表。
2. 前置准备:WSL2 发行版与 TaoToken 统一 Key
2.1 安装 WSL2 与发行版
Windows 11 自带 WSL 命令,管理员 PowerShell 里先看能装哪些发行版:
wsl --list --online输出会列出 AlmaLinux、Debian、Fedora、Ubuntu、openSUSE 等。我选 Fedora Linux 42,因为它的 dnf 源里 Docker 包更新比较及时。安装命令:
wsl --install FedoraLinux-42 wsl --list装完确认默认发行版是 FedoraLinux-42。如果你已经装过 WSL 但版本是 1,用wsl --set-version FedoraLinux-42 2升到 2。
2.2 网络模式改成 mirrored
这一步很关键。WSL2 默认 NAT 模式下,Linux 侧访问 Windows 本机服务要走网关 IP,Docker 拉镜像也容易超时。在 Windows 用户目录建.wslconfig:
[wsl2] networkingMode=mirrored改完wsl --shutdown重启。mirrored 模式下 WSL 和 Windows 共享网络栈,ip addr看到的地址和ipconfig基本一致,本机代理也能直接被 Linux 侧使用。如果 Docker 拉镜像仍然失败,把 MTU 调小试试,在.wslconfig里加[experimental]段并设hostAddressLoopback=true,或者直接在 WSL 里ip link set dev eth0 mtu 1450。
2.3 系统初始化
进入 WSL 后先设 root 密码并更新:
sudo passwd root su - dnf upgrade -y ip addrip addr的输出应该和 Windows 侧ipconfig的网段对得上,说明 mirrored 生效了。
2.4 TaoToken 统一 Key 的定位
TaoToken 在这里扮演的角色是「一个 Key 管所有 AI 工具」。你不需要在每个工具里填不同的供应商地址,而是把 Base URL 统一指向https://taotoken.net/api,Key 从控制台生成一次,之后 Claude Code、Cursor、各种 OpenAI 兼容客户端都复用同一个。
先去控制台创建 Key:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
生成后复制保存,下面配置里用sk-xxxx占位。想先确认模型能不能通,可以用模型对话页面发一条测试消息:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
3. 可复制配置:Docker、kind、kubectl 与 AI 工具骨架
3.1 安装 Docker Engine
Fedora 上用官方仓库装,别用系统自带的 podman-docker 替代:
sudo dnf -y install dnf-plugins-core sudo dnf-3 config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker sudo docker run hello-world看到Hello from Docker!就说明容器运行时正常。把当前用户加进 docker 组,省得每条命令都 sudo:
sudo usermod -aG docker $USER newgrp docker3.2 安装 kind、kubectl、helm
三个二进制都放/usr/local/bin:
# kind [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64 chmod +x ./kind sudo mv ./kind /usr/local/bin/kind # kubectl curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # helm curl -LO https://get.helm.sh/helm-v3.18.2-linux-amd64.tar.gz tar -xzf helm-v3.18.2-linux-amd64.tar.gz chmod +x linux-amd64/helm sudo mv linux-amd64/helm /usr/local/bin/验证版本:kind version、kubectl version --client、helm version。
3.3 创建 kind 集群
kind create cluster -n demo kind get clusters docker ps -adocker ps里会出现一个demo-control-plane容器,镜像kindest/node:v1.33.1,端口映射127.0.0.1:36249->6443/tcp。这个端口每次重建都会变,所以别写死在脚本里,用kubectl config current-context确认上下文即可。
3.4 TaoToken 接入 AI 工具的配置骨架
Claude Code 的配置放在~/.claude/settings.json,核心是把 Base URL 和 Key 指过去:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-xxxx" } }如果你用的是支持 OpenAI 兼容协议的 CLI 工具,配置通常长这样,放在~/.config/<tool>/config.toml:
[provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "sk-xxxx" model = "claude-sonnet-4-20250514" [options] timeout = 120 max_retries = 3注意base_url结尾不要带/v1,具体路径由客户端自己拼。Key 建议用环境变量注入,别硬编码进 dotfiles:
export TAOTOKEN_API_KEY="sk-xxxx"然后在配置里引用${TAOTOKEN_API_KEY}。这样 dotfiles 提交到 Git 也不会泄露。
3.5 部署 Traefik 并开 Dashboard
kind 集群里的 Service 默认是 ClusterIP,LoadBalancer 没有云厂商支持不会分配外部 IP。所以 Traefik 用 NodePort,再靠kubectl port-forward暴露到 Windows 浏览器。
helm repo add traefik https://traefik.github.io/charts helm repo update写一个values.yaml:
service: enabled: true type: NodePort logs: access: enabled: true安装:
helm install traefik traefik/traefik -f values.yaml再建traefik-dashboard.yaml:
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard spec: entryPoints: - web routes: - match: PathPrefix(`/dashboard`) || PathPrefix(`/api`) kind: Rule services: - name: api@internal kind: TraefikService应用:kubectl apply -f traefik-dashboard.yaml。
4. 验证请求:从 Pod 到 Dashboard 的完整链路
4.1 确认集群与 Service 状态
kubectl get nodes kubectl get svckubectl get nodes应该显示demo-control-plane状态Ready。kubectl get svc会看到traefik是 NodePort 类型,端口类似80:30151/TCP。
4.2 端口转发到 Windows
kubectl port-forward --address 0.0.0.0 svc/traefik 80:80这条命令会一直占用终端,别关。然后在 Windows 浏览器打开http://127.0.0.1/dashboard/,能看到 Traefik 的 Dashboard 页面,说明 IngressRoute 生效了。
4.3 跑一个测试 Pod 验证调度
kubectl run nginx-test --image=nginx:alpine --port=80 kubectl get pods -w等状态变成Running后,用kubectl describe pod nginx-test看事件,确认没有ImagePullBackOff。再删掉:
kubectl delete pod nginx-test4.4 验证 TaoToken Key 是否生效
在 WSL 里用 curl 直接打一次 API,确认 Key 和网络都通:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 500返回 JSON 里能看到模型列表就说明 Key 有效。如果返回 401,检查 Key 有没有多余空格;返回超时,检查.wslconfig的 mirrored 是否生效。
4.5 用 AI 工具生成一段 K8s YAML 做闭环
配置好 Claude Code 后,在项目目录里让它生成一个 Deployment:
claude "写一个 nginx Deployment,3 副本,带 resource limits"把生成的 YAML 存成nginx-deploy.yaml,kubectl apply -f nginx-deploy.yaml,再kubectl get pods看三个副本是否都 Running。这一步把「AI 工具配置」和「K8s 实验环境」串起来了,也是统一 Key 的价值所在。
5. 本篇常见错排查
| 报错/现象 | 原因 | 处理 |
|---|---|---|
wsl --install卡在下载 | 网络到微软源不稳定 | 换wsl --install -d Ubuntu-24.04试,或手动下载发行版包 |
| Docker 拉镜像超时 | NAT 模式或 MTU 问题 | 确认.wslconfig里networkingMode=mirrored,必要时ip link set dev eth0 mtu 1450 |
kind create cluster报端口占用 | 6443 被其他进程占 | docker ps看有没有旧集群,kind delete cluster -n demo后重建 |
kubectl get nodes显示 NotReady | containerd 没起来 | docker logs demo-control-plane看日志,通常是 cgroup 或镜像问题 |
| Traefik Dashboard 404 | IngressRoute 没应用或 entryPoint 不对 | kubectl get ingressroute确认存在,检查entryPoints是否为web |
port-forward后浏览器打不开 | 转发绑到了 127.0.0.1 而非 0.0.0.0 | 加--address 0.0.0.0,Windows 侧用127.0.0.1访问 |
| TaoToken 返回 401 | Key 错误或带了多余字符 | 重新从控制台复制,检查环境变量有没有引号 |
| AI 工具报 model not found | 模型名写错 | 用/v1/models接口列出可用模型,填准确名称 |
排查顺序建议从下往上:先确认 WSL 网络通,再确认 Docker 能拉镜像,再确认 kind 集群 Ready,最后才是 Traefik 和 AI 工具。这样每层都有明确的验证点,不会一上来就怀疑最上层。
6. 把 Key 和集群都收进一套工作流
走到这里,你手上应该有一个能随时kind delete cluster重建的 K8s 实验环境,以及一套不再散落各处的 AI 工具凭证。我自己的习惯是把 WSL 里的~/.claude/settings.json和~/.config下的工具配置都软链到一个私有 Git 仓库,Key 用环境变量占位,这样换机器时 clone 下来就能用。
如果你后面要长期跑编码 Agent,或者想让多个工具共享同一套模型配额,可以看下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
需要管理多个 Key 或查看用量,控制台在:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
接入细节和参数说明看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
API Key 生成入口:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
最后留一个实用技巧:kind 集群重建后,kubectl的 context 会自动更新,但port-forward的端口映射会变。写个Makefile把kind create cluster、helm install traefik、kubectl port-forward串成make up,下次实验环境崩了,一条命令就能回到可用状态。