Docker Desktop 内置 K8s 从入门到实战:部署你的第一个 Nginx 集群
本文首发于 栏轩·阁欢迎访问阅读原文获取更好的阅读体验。一、什么是 K8sKubernetes简称 K8s是一个开源的容器编排平台最初由 Google 设计并捐赠给 Cloud Native Computing FoundationCNCF管理。它用于自动化容器化应用的部署、扩缩容和管理。K8s 的核心能力服务发现与负载均衡自动为容器分配 IP 和 DNS 名并分发流量自动修复容器挂了自动重启节点挂了自动迁移 Pod自动扩缩容根据 CPU/内存使用率自动调整容器数量存储编排自动挂载本地或云存储滚动更新与回滚逐个替换容器实例更新失败自动回退二、有了 Docker为什么还要用 K8sDocker 和 K8s 解决的是不同层面问题两者互补需求DockerK8s单个容器的构建和运行✅ 原生支持❌ 不负责构建多个容器的编排调度❌ 需手动管理✅ 声明式自动管理容器崩溃后自动恢复❌ 不复原✅ 自动重启 Pod流量波动时自动扩容❌ 手动操作✅ 支持 Horizontal Pod Autoscaler发布新版本无停机❌ 需手动编排✅ 支持 Rolling Update跨机器的集群管理❌ 单机为主✅ 天然支持集群在实际项目中通常用Docker 构建镜像用K8s 运行和管理容器两者配合使用。Docker Desktop 内置了 K8s开发者可以在本地一键启动一个单节点 K8s 集群进行开发和测试。三、环境说明本文的环境如下宿主机Windows 11 WSL 2Ubuntu 22.04 Docker Desktop已安装启用 WSL 2 后端⚠️ 如果你用的是真实的 Linux 系统或传统虚拟机如 VMware、VirtualBox操作步骤会有所不同。本文基于WSL Docker Desktop的组合。四、在 Docker Desktop 中启用 K8s4.1 确认 Docker Desktop 正常运行在 PowerShell 中执行docker version确认 Docker Engine 和 Client 都有版本信息输出。4.2 启用 Kubernetes打开Docker Desktop点击左侧导航栏的Kubernetes图标☸️点击“Create cluster”按钮配置集群参数Provisioning method选择kubeadm或kind详见下方对比Kubernetes version选择当前最新稳定版如 v1.35Nodes1单节点已涵盖运行应用所需的所有组件点击Create等待 1~2 分钟创建完成两种模式的对比如下特性kubeadm 模式kind 模式节点名docker-desktopdesktop-control-planeAPI Server 地址kubernetes.docker.internal:6443固定127.0.0.1:XXXXX随机端口重启会变Docker Desktop 普通重启Restart后数据保留 ✅保留 ✅K8s 界面点 Stop 后数据保留 ✅丢失 ❌有明确提示最大节点数单节点支持多节点适用场景日常开发、数据持久化多节点调度、学习 Pod 调度原理⚠️重要提醒两种模式各有优劣根据需求选择kubeadm模式重启或 Stop 后数据均保留API 地址固定。WSL 中可通过kubernetes.docker.internal:6443固定地址访问推荐日常开发使用kind模式区分两种操作——点击 Docker Desktop 的 Restart 按钮不会释放资源但在 K8s 界面点击Stop会清除所有运行中的资源Docker Desktop 会提示 “Stopping the Kubernetes cluster removes all running resources.”。此外API Server 端口每次创建都是随机的导致WSL 子系统中的 kubectl 无法自动感知新地址。支持多节点1 control-plane N worker适合学习 Pod 调度原理创建完成后Docker Desktop 的 Kubernetes 视图中可以看到集群的运行状态五、Node节点的概念Node节点是 K8s 集群中的工作机器可以是物理机或虚拟机负责运行容器化应用。K8s 集群由两种类型的节点组成节点类型职责组件Control Plane控制面管理整个集群做出全局决策API Server、Scheduler、Controller Manager、etcdWorker Node工作节点实际运行应用容器kubelet、kube-proxy、容器运行时在 Docker Desktop 的单节点模式下control-plane 同时也具备 worker 的功能可以直接调度 Pod。通过以下命令查看集群中的节点kubectl get nodes输出示例kubeadm 模式NAME STATUS ROLES AGE VERSION docker-desktop Ready control-plane 10m v1.34.1STATUS为Ready表示节点正常运行ROLES为control-plane表示它是管理节点VERSION显示 K8s 版本号六、配置 kubectl关键步骤6.1 什么是 kubectlkubectl是 K8s 的命令行客户端工具通过调用 K8s API Server 来管理集群资源节点、Pod、Service 等。所有对集群的操作几乎都可以通过kubectl完成。6.2 问题本质kubeconfig 与环境隔离kubectl 通过读取kubeconfig 配置文件默认位置~/.kube/config来连接集群。Docker Desktop 启用 K8s 后会在 Windows 侧自动生成这个配置Windows 路径C:\Users\用户名\.kube\config ✅ 自动生成开箱即用 WSL 路径/root/.kube/config ❌ 不存在需手动处理所以关键点就一个kubectl 在哪运行就得让对应的 .kube/config 里有正确的集群信息。6.3 推荐方案在 Windows 中使用 kubectl零配置 ⭐Docker Desktop 启动 K8s 后Windows 上的 kubectl 已经可以直接使用完全不需要任何配置。第一步打开 PowerShell 或 CMDWindows 自带的 PowerShell 或命令提示符即可无需管理员权限。第二步运行 kubectl 命令验证kubectl get nodes如果提示kubectl不是系统命令说明还没安装 kubectl。有两种安装方式方式 A通过 Docker Desktop 自带版本# Docker Desktop 自带 kubectl在 Docker 资源目录下C:\Program Files\Docker\Docker\resources\kubectl.exeget nodes方式 B单独安装 kubectl推荐从 Kubernetes 官方下载# 下载最新稳定版 kubectlcurl.exe-LOhttps://dl.k8s.io/release/v1.35.0/bin/windows/amd64/kubectl.exe将kubectl.exe所在目录添加到系统 PATH或直接放到C:\Windows\System32\目录下。验证安装kubectl version--client为什么 Windows 上能直接用Docker Desktop 在启动 K8s 集群后会自动将连接的 kubeconfig 写入C:\Users\用户名\.kube\config并且 API Server 地址kubernetes.docker.internal:6443在 Windows 网络中是可达的。整个过程完全自动化用户无需干预。6.4 备选方案在 WSL 中使用 kubectl如果你习惯在 WSL Ubuntu 终端中操作可以在 WSL 中配置 kubectl。相比 Windows 方案需要额外两步打通网络 同步配置。步骤一打通网络永久方案WSL 2 默认使用 NAT 网络模式无法直接访问 Windows 上的 localhost 服务。编辑 Windows 上的.wslconfig文件路径C:\Users\你的用户名\.wslconfig写入[wsl2] networkingModemirrorednetworkingModemirrored镜像网络模式让 WSL 2 与 Windows 共享网络命名空间WSL 中的127.0.0.1将直接指向 Windows 宿主机。使配置生效# PowerShell 中执行wsl--shutdown重新打开 WSL Ubuntu 即可。步骤二同步 kubeconfig在 WSL Ubuntu 中执行# 1. 确认 kubectl 是否已安装kubectl version--client# 如果没有安装则下载curl-LOhttps://dl.k8s.io/release/v1.35.0/bin/linux/amd64/kubectlchmodx kubectlsudomvkubectl /usr/local/bin/# 2. 创建 .kube 目录如果不存在mkdir-p~/.kube# 3. 复制 Windows 的 K8s 配置到 WSLcp/mnt/c/Users/你的Windows用户名/.kube/config ~/.kube/config如果 WSL 使用 root 用户登录则路径为/root/.kube/config如果使用普通用户则为/home/用户名/.kube/config。为什么需要同步配置Windows 和 WSL 是两套独立的文件系统各自的~/.kube/config互不相干。Docker Desktop 只自动维护 Windows 侧的配置WSL 侧需要手动复制。如果是 kind 模式由于 API Server 端口每次随机WSL 中的旧配置还需要重新同步才能继续使用。6.5 验证连接kubectl get nodes成功输出NAME STATUS ROLES AGE VERSION docker-desktop Ready control-plane 10m v1.34.1七、部署第一个应用环境配置完成接下来部署一个NginxWeb 服务器验证集群能正常工作。7.1 创建 DeploymentDeployment 是 K8s 中最常用的资源类型用于声明式地管理 Podkubectl create deployment k8s-test--imagenginxk8s-testDeployment 的名称--imagenginx使用的容器镜像从 Docker Hub 拉取K8s 会自动拉取 Nginx 镜像创建一个 Pod 并在节点上启动容器。7.2 查看 Pod 状态kubectl get pods输出示例NAME READY STATUS RESTARTS AGE k8s-test-66588d67cf-stvgs 1/1 Running 0 66sREADY 1/1Pod 中 1 个容器1 个就绪STATUS Running正常运行RESTARTS 0未发生重启如果状态为ContainerCreating或Pending等待几秒再次检查即可。7.3 查看完整资源状态kubectl get pods,svcsvc是 Service 的缩写Service 为 Pod 提供一个稳定的入口地址。刚创建时只有默认的kubernetes服务。7.4 访问 Nginx方式一端口转发因为 Pod 运行在 K8s 集群内部网络不能直接从宿主机访问。使用port-forward将本地端口映射到 Pod 端口kubectl port-forward deployment/k8s-test8080:80这条命令将本地8080端口的流量转发到k8s-test的80端口。保持终端窗口打开在浏览器访问http://localhost:8080出现 Nginx 欢迎页面即部署成功port-forward适合快速调试终端关闭后转发即停止。7.5 访问 Nginx方式二LoadBalancer 服务上一节的port-forward是临时调试手段终端关闭就失效。更接近生产环境的方式是为 Deployment 创建一个Service类型设为LoadBalancer。为什么需要 LoadBalancer——理解 Docker Desktop 的网络隔离K8s 集群运行在 Docker Desktop 的容器环境中与 Windows 宿主机之间存在网络隔离Pod 的Cluster IP是 Docker 内部网络的私有地址宿主机无法直接访问NodePort类型的 Service 在真实的 Linux 集群中可以通过节点IP:NodePort直接访问。但 Docker Desktop 中的节点本身是 Docker 容器Windows 宿主机无法直接到达容器内部所以 NodePort 在这里行不通简单说Cluster IP 和 NodePort 都是 Docker 容器网络的内部地址Windows 根本看不见它们Docker Desktop 也考虑到了这个问题所以它内置了 LoadBalancer 支持——当你创建 LoadBalancer 类型的 Service 时Docker Desktop 会自动在宿主机上创建代理容器如docker-desktop-lb或kindccm-xxx实质上是Envoy代理直接在 Windows 宿主机上监听端口并将收到的流量转发到 K8s 集群内部。相当于在 Windows 和 K8s 集群之间搭了一座桥。这也是为什么在 Docker Desktop 上开发时推荐用 LoadBalancer 而非 NodePort。kubectl expose deployment k8s-test--typeLoadBalancer--port8888--target-port80--typeLoadBalancer创建一个负载均衡器类型的 Service--port8888Service 对外暴露的端口号--target-port80转发到 Pod 内部的 80 端口Nginx 默认端口查看 Service 状态kubectl get svc k8s-test输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE k8s-test LoadBalancer 10.108.248.16 localhost 8888:31812/TCP 30s当EXTERNAL-IP显示为localhost时直接在浏览器访问http://localhost:8888即可看到 Nginx 欢迎页。工作原理Docker Desktop 检测到 LoadBalancer 类型的 Service 后会自动在宿主机上创建 Envoy 代理容器kubeadm 模式下为docker-desktop-lbkind 模式下为kindccm-xxx将宿主机的 8888 端口流量转发到集群内部的 Service。相比port-forward这种方式是持久化的终端关闭后服务依然可访问。可以在 Docker Desktop 的 Containers 视图中看到这些envoyproxy类型的代理容器。排查技巧端口冲突与代理容器清理如果端口已被其他程序占用代理容器会创建失败表现为EXTERNAL-IP一直处于pending状态。正确的操作顺序如下顺序很重要# 1. 查找旧的代理容器dockerps-a--filternamekindccm# 2. 删除旧容器Docker Desktop 会自动重建dockerrm-fkindccm-LXUFEC6ZYEIUPGUBRWB556226BYGOZKZSQBDOQZS# 3. 修改 Service 端口避开被占用的端口kubectl patch svc k8s-test--typejson\-p[{op:replace,path:/spec/ports/0/port,value:8888}]⚠️关键顺序先删除旧容器 → 再修改端口这样 Docker Desktop 会自动创建新的代理容器。如果先改端口再删旧容器新容器不会自动创建需要重启 Docker Desktop。7.6 查看 Pod 日志kubectl logs k8s-test-66588d67cf-stvgs可以看到 Nginx 的访问日志便于调试。7.7 清理测试资源依次删除 Service 和 Deployment# 删除 Service停止端口映射kubectl delete svc k8s-test# 删除 Deployment终止并清除 Podkubectl delete deployment k8s-test先删 Service 再删 Deployment确保流量先断开再终止 Pod避免资源竞争。八、常用命令速查命令作用kubectl get nodes查看所有节点kubectl get pods查看当前命名空间的所有 Podkubectl get pods -n kube-system查看 K8s 系统组件CoreDNS、API Server 等kubectl get svc查看所有 Servicekubectl get all查看当前命名空间的所有资源kubectl create deployment 名称 --image镜像创建 Deploymentkubectl expose deployment 名称 --typeLoadBalancer --port对外端口 --target-port容器端口将 Deployment 暴露为 Servicekubectl port-forward deployment/名称 本地端口:容器端口将本地端口转发到 Podkubectl delete deployment 名称删除 Deploymentkubectl delete svc 名称删除 Servicekubectl logs Pod名称查看 Pod 日志kubectl describe pod Pod名称查看 Pod 详细信息事件、状态等kubectl get events查看集群事件排错常用九、总结本文从零开始在 Docker Desktop 上完成了 K8s 的启用、配置和部署验证步骤操作验证方式启用 K8sDocker Desktop → Kubernetes → Create cluster界面显示集群运行中配置 kubectl推荐直接在 Windows PowerShell 中使用零配置kubectl get nodes返回节点信息配置 kubectl备选WSL 配置镜像网络 同步 kubeconfigkubectl get nodes返回节点信息部署应用kubectl create deploymentkubectl get pods显示 Running访问验证调试kubectl port-forward浏览器访问 localhost:8080访问验证持久化kubectl expose创建 LoadBalancer Service浏览器访问 localhost:8888以上步骤验证了 Docker Desktop 内置的 K8s 集群可以正常使用。基于这个环境可以进一步学习编写 YAML 配置文件实现声明式管理使用多节点 kind 集群部署完整的 Web 数据库应用学习 ConfigMap、Secret、Ingress 等高级资源

相关新闻

彻底解决Conda清华源SSL证书验证失败与网络连接问题

彻底解决Conda清华源SSL证书验证失败与网络连接问题

1. 项目概述:当清华源“罢工”时,我们到底在解决什么? 如果你在用 Conda 管理 Python 环境时,突然在 conda install 或创建环境时,屏幕上弹出一串令人头疼的 CondaHTTPError 或是 SSLError ,并且错误…

2026/10/15 17:03:45 阅读更多 →
Java浮点数比较:从精度丢失到五大解决方案实战

Java浮点数比较:从精度丢失到五大解决方案实战

1. 项目概述:为什么double比较是个“坑”?刚入行的Java开发者,十有八九都在double类型的数值比较上栽过跟头。你可能写过这样的代码:if (0.1 0.2 0.3),然后信心满满地运行,结果却得到了一个令人困惑的fal…

2026/10/15 17:04:38 阅读更多 →
UiPath定时任务全攻略:从Windows计划任务到Orchestrator专业调度

UiPath定时任务全攻略:从Windows计划任务到Orchestrator专业调度

1. 从“手动触发”到“无人值守”:为什么我们需要定时任务在自动化流程开发的日常里,我们常常会陷入一个循环:开发、测试、本地运行、验证结果。一个流程跑通了,成就感满满,但很快就会发现,很多业务流程本身…

2026/10/15 17:50:59 阅读更多 →

最新新闻

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

配过的人都有体会——Anaconda装了,VSCode也装了,结果新建一个Python文件,import numpy直接给你飘红,运行的时候又说找不到模块。这时候大多数人第一个想法是“Anaconda没装好”“VSCode坏了”,但真正的原因往往是VSCo…

2026/10/16 17:55:24 阅读更多 →
分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

简介:一份关于主流分布式存储技术的综述文档,适合大数据处理、云计算及后端存储方向的开发者与架构师阅读。内容以架构与演化两条主线展开,系统梳理了谷歌文件系统、Hadoop分布式文件系统、Minio对象存储等经典方案的设计思想与适用场景。压缩…

2026/10/16 17:55:24 阅读更多 →
Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

简介:本资源是一套基于Matlab实现的SIFT特征匹配与RANSAC鲁棒估计相结合的图像拼接与融合完整方案,面向计算机视觉初学者、图像处理课程学习者及科研入门人员,解决多视角图像自动对齐、宽视场全景图生成等典型问题。压缩包共20个文件&#xf…

2026/10/16 17:55:24 阅读更多 →
用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

简介:面向网站优化人员与Python学习者的SEO数据采集与分析工具,以“SEO网络蜘蛛侠”命名,通过自动化爬虫帮助用户完成关键词挖掘、元信息检查、链接结构分析、内容质量与加载速度检测、死链排查等高频SEO任务。程序内置可执行版本&#xff0c…

2026/10/16 17:55:24 阅读更多 →
Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

简介:这份资源面向地质勘探、地震预测与环境监测领域的技术人员及Qt开发者,提供一套基于Qt3.3框架的地震数据快速可视化实现方案,重点解决大规模地震记录的读取、处理与图形化展示问题。压缩包共77个文件,约2.07MB,以h…

2026/10/16 17:55:23 阅读更多 →
Android应用目录结构全解析:从Gradle配置到资源文件管理

Android应用目录结构全解析:从Gradle配置到资源文件管理

很多刚接触Android开发的朋友,第一次用Android Studio新建项目时,看到左侧那一大坨目录树往往会有点懵。我当年也是从一个个文件夹点开、再关掉,折腾了好几天才搞清楚哪个目录是存代码的、哪个目录是放图片的、哪个文件是注册Activity的。这篇…

2026/10/16 17:54:23 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →