【 Docker Desktop】基于Windows + WSL2 的环境配置, 快速部署一套Kubernetes Cluster

配置准备

执行下面命令可以看到, 我们的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 调度机制的"黄金标准"。

为什么选这个数量?

  1. 体验真实的调度 (Scheduling):
    • 如果你只有 1 个节点,所有组件(ArgoCD, Gateway, 你的应用)都挤在一起,无法测试"节点亲和性"或"跨节点容灾"。
    • 有了 2 个 Worker 节点,你可以模拟真实的生产环境:比如让 ArgoCD 跑在 Worker 1,让业务应用跑在 Worker 2;或者测试当 Worker 1 挂掉时,Pod 是否会自动漂移到 Worker 2。
  2. Gateway/Ingress 的最佳实践:
    • 在使用 NodePort 暴露 Gateway (如 Nginx Ingress) 时,多节点能让你看到负载均衡的效果。流量可以从不同节点的 IP 进入,分发到不同的 Pod 上。
  3. 资源隔离:
    • 控制平面节点专门负责管理集群状态(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
相关推荐
fred_kang2 小时前
Windows 下 Nginx 启动报错 10013 / OpenEvent 完整排查指南
运维·windows·nginx
布吉岛的石头3 小时前
K8s Ingress配置踩坑实录:生产环境500+并发负载均衡最佳实践
容器·kubernetes·负载均衡
showyoui3 小时前
一次 GKE Sidecar 场景下的连通性排查实录
docker·微服务·容器·kubernetes·service_mesh
运维老郭3 小时前
K8S 容器独占 CPU(CPU 绑核)最佳实践,解锁极致性能所需的 3 个核心条件及其代价
运维·云原生·kubernetes
香菜农民4 小时前
域名证书管理
运维·docker
han_hanker4 小时前
java stream的常用方法
windows
江湖有缘4 小时前
从零开始:基于Docker Compose的Kener监控面板部署全记录
运维·docker·容器
月光技术杂谈5 小时前
国内环境下安装 docker-ce 的完整步骤
运维·docker·容器
leoZ2316 小时前
Linux 环境常用服务一键部署文档(Docker 版)
运维·docker·容器