配置准备
执行下面命令可以看到, 我们的docker destop启动正常~
bash
C:\Users\Administrator>wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 2
docker-desktop Running 2

- Enable integration with my default WSL distro
- 建议:必须开启。否则你在 Ubuntu 里敲 docker 会提示找不到命令,Kind 也无法工作。
- Enable integration with additional distros
内网地址配置

bash
docker login 192.168.1.100:5000 -u admin -p Harbor12345
接下来准备配置k8s

对比如下,
| 特性 | Kind | Kubeadm |
|---|---|---|
| 定位 | 开发、测试、CI/CD | 学习、生产部署 |
| 部署方式 | 在 Docker 容器中模拟节点 | 在真实主机上安装组件 |
| 部署速度 | 极快(分钟级) | 较慢(需手动配置) |
| 复杂度 | 简单,一键式操作 | 复杂,多步骤手动操作 |
| 资源隔离 | 较低(共享宿主机) | 较高(独立主机) |
这里我们本地简单测试,选择Kind, 1个Node, 点击 Create。

bash
C:\Users\Administrator>kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7d764666f9-l9lpm 1/1 Running 0 11m
kube-system coredns-7d764666f9-xnv9s 1/1 Running 0 11m
kube-system etcd-desktop-control-plane 1/1 Running 0 11m
kube-system kindnet-zgn2h 1/1 Running 0 11m
kube-system kube-apiserver-desktop-control-plane 1/1 Running 0 11m
kube-system kube-controller-manager-desktop-control-plane 1/1 Running 0 11m
kube-system kube-proxy-vj7zp 1/1 Running 0 11m
kube-system kube-scheduler-desktop-control-plane 1/1 Running 0 11m
local-path-storage local-path-provisioner-84669cbbb8-5xrzx 1/1 Running 0 11m
快速部署
指令式命令 (Imperative Commands)
bash
# 创建 deployment
kubectl create deployment my-nginx --image=nginx
# 暴露端口 (Service)
kubectl expose deployment my-nginx --type=NodePort --port=80
# 获取访问地址
kubectl get svc my-nginx
声明式配置 (Declarative Configuration)
创建一个 .yaml 文件,里面完整描述你的应用,包括镜像、副本数、端口、标签等所有信息。
一个完整的 Deployment 文件示例 (nginx-deployment.yaml)
yaml
apiVersion: apps/v1 # API 版本
kind: Deployment # 资源类型
metadata:
name: my-nginx # 部署的名称
spec:
replicas: 3 # 期望的副本数量
selector:
matchLabels: # 选择器,用于管理带有对应标签的 Pod
app: nginx
template: # Pod 模板
metadata:
labels:
app: nginx # Pod 的标签,必须与上面的 selector 匹配
spec:
containers:
- name: nginx
image: nginx:1.25 # 容器镜像及版本
ports:
- containerPort: 80 # 容器暴露的端口
创建好文件后,只需一条命令即可完成部署:
bash
kubectl apply -f nginx-deployment.yaml
从命令生成配置
bash
# 这条命令不会真正创建资源,而是将对应的 YAML 配置打印出来
kubectl create deployment my-nginx --image=nginx --dry-run=client -o yaml
生产级配置示例:
yaml
apiVersion: apps/v1 # 1. 基础信息:API版本
kind: Deployment # 1. 基础信息:资源类型
metadata:
name: my-web-app # 1. 基础信息:名字叫 my-web-app
labels:
app: web # 1. 基础信息:给自己贴个标签
spec:
replicas: 3 # 2. 规格:我要 3 个副本
selector: # 2. 规格:选择器
matchLabels: # 必须匹配下面的标签
app: web # 意思是:去管那些标签为 app=web 的 Pod
template: # 3. 模板:下面是 Pod 的定义
metadata:
labels:
app: web # 3. 模板:Pod 的标签,必须被上面的 selector 选中
spec: # 3. 模板:Pod 的具体配置
containers: # 4. 容器细节:容器列表
- name: nginx # 4. 容器名
image: nginx:1.25 # 4. 镜像
ports:
- containerPort: 80 # 4. 暴露 80 端口
# --- 进阶配置 ---
resources: # 资源限制
requests: # 至少需要
memory: "64Mi"
cpu: "250m"
limits: # 最多只能用
memory: "128Mi"
cpu: "500m"
readinessProbe: # 就绪探针
httpGet:
path: /
port: 80
initialDelaySeconds: 5 # 启动后等 5 秒开始检查
FAQ
1. 启动失败

bash
running wsl distro proxy in Ubuntu distro: running proxy: running wslexec: An error occurred while running the command. DockerDesktop/Wsl/ExecError: c:\windows\system32\wsl.exe -d ubuntu -u root -e /mnt/wsl/docker-desktop/docker-desktop-user-distro proxy --distro-name ubuntu --docker-desktop-root /mnt/wsl/docker-desktop c:\program files\docker\docker\resources --show-kube-system-containers=true: exit status 1 (stderr: , stdout: , wslErrorCode: DockerDesktop/Wsl/ExecError) (output: <3>WSL (556 - Relay) ERROR: CreateProcessCommon:800: execvpe(/mnt/wsl/docker-desktop/docker-desktop-user-distro) failed: Permission denied) (wslConf: [boot]
systemd=true
2. 为什么建议选择3个Node:1 Control Plane + 2 Workers
这种配置通常被称为"一主两从",是学习 Kubernetes 调度机制的"黄金标准"。
为什么选这个数量?
- 体验真实的调度 (Scheduling):
- 如果你只有 1 个节点,所有组件(ArgoCD, Gateway, 你的应用)都挤在一起,无法测试"节点亲和性"或"跨节点容灾"。
- 有了 2 个 Worker 节点,你可以模拟真实的生产环境:比如让 ArgoCD 跑在 Worker 1,让业务应用跑在 Worker 2;或者测试当 Worker 1 挂掉时,Pod 是否会自动漂移到 Worker 2。
- Gateway/Ingress 的最佳实践:
- 在使用 NodePort 暴露 Gateway (如 Nginx Ingress) 时,多节点能让你看到负载均衡的效果。流量可以从不同节点的 IP 进入,分发到不同的 Pod 上。
- 资源隔离:
- 控制平面节点专门负责管理集群状态(etcd, api-server)。将工作负载(你的应用)放在 Worker 节点上,可以防止你的测试应用把集群管理界面卡死。
3.Kind 的端口转发机制
由于基于 Windows + WSL2 的环境,Kind 的端口转发机制有一点特殊:
- 控制平面端口:你在创建集群时(或者默认配置中),Kind 会自动把控制平面的 6443 端口映射出来,所以 kubectl 能正常工作。
- NodePort 端口:
- 情况 A(幸运情况):Docker Desktop 现在的版本对 WSL2 的网络支持很好,你可能直接就能通过 localhost:端口 访问上面的 Nginx。
- 情况 B(常见情况):如果浏览器打不开,这是因为 NodePort 只是映射到了 WSL2 的虚拟网卡上,没自动映射到 Windows 的 localhost。
- 解决方案(万能大法):
使用 kubectl port-forward 强制转发端口,这在开发调试中非常常用:
bash
# 将本地的 8080 端口转发到 my-nginx 服务的 80 端口
kubectl port-forward svc/my-nginx 8080:80