ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows 本地搭建 K8s 集群全指南:minikube 与 kind 双方案实践

Windows 本地搭建 K8s 集群全指南:minikube 与 kind 双方案实践 说真的以前我一直觉得在 Windows 上搞 Kubernetes 是件挺折腾人的事直到有一次需要紧急验证一套服务的部署配置又不想为了这点事去云上开三台机器就顺手在本地搭了一个 mini 版本的 K8s 集群。做完之后我才发现这套东西其实没有想象中复杂只要把工具选对、把环境理顺半小时之内就能跑起来一个能用的本地集群。这篇文章就把我完整的搭建过程、踩过的坑、以及一些这两年积累下来的心得一次性写清楚希望能帮到同样想在 Windows 上学习 K8s 或做本地开发调试的朋友。再说一下这篇文章适合谁。如果你刚学 K8s想找一个不用花钱、电脑上就能跟着敲命令的环境这篇文章可以直接当操作手册用。如果你是有经验的开发想快速起一个本地集群做联调或者跑 CI那文中的 minikube 和 kind 两套方案也可以直接抄作业。文章会先把方案选型讲明白再给一套完整的实操步骤最后把常见问题整理成速查表尽量让你照着做就能跑通。1. Windows 上搭 K8s先把思路理清楚1.1 为什么要在 Windows 本地搭一个 Mini 版 K8s很多人一开始学 K8s 都容易陷入一个误区觉得必须搞三台 Linux 服务器才能开始。实际上对于学习、日常开发、跑通部署流程这些场景本地一个 mini 集群完全够用而且灵活得多。你不需要申请云资源、不需要等机器初始化、不用考虑生产环境的安全策略改完配置随时可以删除重建这对学习过程中的试错来说太重要了。我自己最常遇到的使用场景是这三类第一类学 K8s 核心概念。Pod、Deployment、Service、Ingress 这些 API 对象光看文档容易看得云里雾里但本地起一个集群之后随手敲几条 yaml 就能看到调度、重建、扩容的真实过程理解速度完全不一样。像集群调度、故障转移这些听起来很抽象的东西在本地集群里是可以直接观察到的。第二类本地联调和开发测试。项目里用到 Redis、MySQL、Nacos 这类中间件的时候与其在 Windows 上一个一个装不如直接在 K8s 里用 yaml 把环境拉起来用完一键清理不污染宿主机。这个做法在开发机上的体验非常舒服。第三类验证部署脚本和 CI 流程。不管是公司内部平台的部署模板、Helm Chart还是 GitLab Runner 里的流水线脚本先在本地 mini 集群里跑一遍能拦截掉大量低级问题。以前我改一个部署 yaml 就得等远程测试环境的队列现在本地十几秒就能看到结果。1.2 主流的四条技术路线怎么选在 Windows 平台上目前能跑起来 mini 版 K8s 的方案其实有好几种我做过一轮对比整理成下面这张表方案底层依赖支持的多节点资源占用适合场景复杂度Docker Desktop 内置 KubernetesWSL2 / Hyper-V仅单节点中等快速体验Docker 用户低minikubeDocker / Hyper-V / VirtualBox支持需配置中等学习 K8s开发调试低kindDocker支持较低CI 环境、多节点快速测试低k3sWSL2 / 虚拟机支持很低边缘计算、性能较弱的机器中先说 Docker Desktop 内置的 Kubernetes。这个方案最省事安装好 Docker Desktop 之后在设置里把 Kubernetes 开关打开等几分钟就能用。但它的主要问题是只能提供单节点而且版本跟随 Docker Desktop 的发布节奏想升级集群版本得等 Docker Desktop 更新。对于只体验 Pod、Service 这些基础概念来说够用了但如果你想试试多节点调度、节点亲和性这类功能它就力不从心了。minikube 是我最推荐给初学者的方案它由 K8s 官方社区维护本质上是一个能帮你自动创建并管理本地集群的工具。minikube 支持多种驱动在 Windows 上最常见的用法是以 Docker 作为驱动这样就不需要额外装虚拟机软件。它的优势是功能完整Dashboard 面板、插件管理、多节点配置都有而且文档非常丰富遇到问题去搜解决方案基本都能找到。kind 的优势则体现在启动速度和资源占用上。kind 的全称是 Kubernetes in Docker它把集群的每个节点都跑成一个 Docker 容器创建集群就是启动几个容器所以整套流程非常快两三分钟就能得到一个集群。这个方案在 CI 环境里特别受欢迎因为流水线里直接跑kind create cluster就可以创建一套隔离的测试环境。我自己在本地也会用 kind 来做多节点测试配置非常灵活。k3s 则是走轻量路线的发行版由 Rancher 团队维护专门面向边缘计算和资源受限的场景。它把 K8s 的很多组件做成了单二进制文件内存占用比标准版小很多。不过 k3s 本身是面向 Linux 的在 Windows 上跑通常需要包一层 WSL2 或者虚拟机对新手来说反而多了一道门槛。如果你的笔记本配置比较老内存只有 8G 左右可以试试这条路但我不建议作为入门首选。1.3 我最终选择的方案与理由我的主力电脑是 Windows 11平时已经装了 Docker Desktop 并且在使用 WSL2 后端所以我最终选择的是minikube Docker 驱动这套组合同时也安装了 kind 作为备用工具。选择 minikube 的主要原因有三个第一minikube 对 Kubernetes 版本的支持非常灵活。我可以通过—kubernetes-version参数指定集群版本比如测试新特性时起一个最新版集群跑兼容性验证时再起一个旧版集群切换成本很低这一点对学习和排查问题特别有优势。第二minikube 的多节点配置虽然比 kind 麻烦一点但依然是开箱即用的。在启动时指定—nodes3就能得到一个一主两从的集群可以在上面验证节点调度、Pod 漂移等场景足以满足大多数学习需求。第三minikube 自带的插件体系非常实用。比如ingress插件可以让你在本地直接体验 Ingress 流量转发registry插件可以跑一个本地 Docker 镜像仓库这些都是本地开发中会实际用到的能力。至于 kind我更多是用它来跑一些需要快速验证的多节点场景。比如之前验证一个 StatefulSet 在节点故障时的行为用 kind 起三个节点做了半天实验跑完直接删掉集群宿主机干干净净。两个工具各有分工建议你按自己的实际需求来选不用贪多。2. 动手前必须搞懂的几个关键点2.1 WSL2 与 DockerK8s 在 Windows 上的两个基石不管选哪条路线Windows 上跑 K8s 基本都绕不开 WSL2 和 Docker 这两个底层组件先把它们的关系理清楚后面操作起来会顺很多否则到时候出了问题都不知道该查哪层。WSL2 是 Windows Subsystem for Linux 的第二个大版本它本质上是一个运行在 Hyper-V 虚拟机基础上的轻量 Linux 内核。有了 WSL2你可以在 Windows 上直接运行 Linux 发行版而且性能比第一代纯翻译层好很多。K8s 的组件和容器运行时本身是为 Linux 设计的虽然 Windows 上有 Windows 容器但 K8s 生态的主流镜像、工具链、网络插件几乎都优先支持 Linux所以在 Windows 上搭 K8s 的实际做法基本都是借助 WSL2 跑一个 Linux 环境再在这个环境里部署 K8s。Docker Desktop 的 Windows 版本也充分利用了 WSL2。你可以把它的 Docker Engine 跑在 WSL2 的发行版里Windows 上的 Docker 命令通过集成方式直接操作这个 Linux Docker。这样一来Windows、WSL2、Docker 三者就形成了一个完整的链路。需要注意的一个点是 WSL2 和 Hyper-V 的关系。如果你用的是 Win10 2004 以上的版本打开 WSL2 功能后系统默认使用 Hyper-V 底层虚拟化这意味着你在机器上不能同时用旧版 VirtualBox5.x 之前不支持 Hyper-V 共存。新一代 VirtualBox 7 已经做了兼容适配如果你必须要用 VirtualBox记得升级到新版本。我自己的建议是能不用虚拟机就直接用 Docker 驱动省心省事。检查 WSL2 是否安装可以在 PowerShell 里执行wsl --status wsl -l -v如果VERSION列显示为 2说明已经开启了 WSL2。如果显示的是 1或者执行命令报错需要先更新 WSL2 内核。方法是在管理员 PowerShell 里执行wsl --update或者参考微软官方的安装说明这里不再展开。2.2 K8s 与 Docker 到底什么关系这个热搜词出现的频率太高了我几乎每次给同事讲 K8s 都会被问到一次。简单说K8s 和 Docker 不是同级产品也不是竞争关系而是两个不同层次的东西。Docker 本质上是容器运行时和管理工具它解决的是“怎么把应用打包成镜像、怎么运行容器”的问题。你写一个 Dockerfile构建出镜像然后用docker run把容器跑起来这一套流程解决的是单机层面的容器化问题。K8s 解决的是“怎么在多个机器上统一管理这些容器”的问题。它负责容器的编排调度、服务发现、负载均衡、自动扩缩容、故障恢复等能力。一台机器上能跑几十个容器已经不容易了但容器宿主机宕机了怎么办流量大了怎么扩容服务之间怎么互相发现这些才是 K8s 要解决的核心问题。打个比方Docker 是单个施工队负责把房子按图纸盖好K8s 是一个物业公司负责整个小区里所有房子的管理、维修、扩容、人员调度。你可以在没有 Docker 的情况下用 containerd、CRI-O 等其他容器运行时跑 K8s因为 K8s 通过 CRI容器运行时接口抽象了这一层。同样你可以用 Docker Compose 在单机上编排多个容器但那和 K8s 的多节点集群能力不在一个量级。2.3 资源规划Mini 不是随便跑跑就行Mini 版本的意思是“功能齐全但规模小”不是说随便一台老爷机就能跑。K8s 集群本身需要占用一定的资源尤其是控制面组件API Server、etcd、Controller Manager、Scheduler都有常驻内存开销。根据我自己的经验单节点 mini 集群最少需要 4G 内存其中 WSL2 至少要分到 3GDocker 运行时和 K8s 系统组件加起来大概要占 2G 左右。如果你想跑多节点或者同时在集群里部署中间件做开发16G 内存是起步32G 会更从容。这里必须重点提一下 WSL2 的内存限制。WSL2 默认行为是占用宿主机最多 50% 的内存如果你的电脑是 16G 内存WSL2 可能吃掉 8GWindows 本身再加上各种软件会感觉很卡。解决办法是在用户目录下创建.wslconfig文件手动限制 WSL2 的资源[wsl2] memory8GB processors4 swap2GB设置完成后在 PowerShell 里执行wsl --shutdown重启 WSL2 即可生效。这个配置文件对于用 Docker Desktop 跑 K8s 的环境非常关键我见过太多同事因为没做这个限制Windows 直接被 WSL2 拖垮还以为是 K8s 的问题。CPU 方面双核起步四核比较稳。K8s 的控制面组件对 CPU 的消耗不算特别夸张但如果同时跑编译任务或者多个应用核心数太少会明显变慢。磁盘方面机械硬盘就别折腾了SSD 是必需的。K8s 启动过程要拉取大量镜像、解压文件机械硬盘光等启动就能让人崩溃。3. 从零开始完整搭建过程实录下面进入正题我会按我实际操作时的顺序一步步带你搭建一个单节点 mini 版本的 K8s 集群。这套流程我在两台 Windows 11 和一台 Win10 的机器上都验证过照着做基本不会出大问题。如果你之前已经装好 Docker Desktop 并且开启了 WSL2可以直接跳到 3.2 节。3.1 第一步把 WSL2 和 Docker Desktop 准备好首先是 WSL2 的安装。在管理员权限的 PowerShell 中执行wsl --install这个命令会安装 WSL2 所需的全部组件并且默认安装 Ubuntu 发行版安装完成后根据提示重启系统。重启后再用wsl -l -v确认版本为 2如果版本是 1执行wsl --set-version Ubuntu-22.04 2升级到 WSL2。接下来安装 Docker Desktop。去官网下载 Docker Desktop for Windows 安装包安装过程中会询问你使用 Windows 容器还是 Linux 容器这里直接选 Linux 容器。安装完成后打开 Docker Desktop在 Settings 的 General 页面确认 Use the WSL 2 based engine 是勾选状态。Docker Desktop 启动之后会自动把 Docker CLI 集成到 Windows 终端里。你可以在 WSL2 的 Ubuntu 终端里直接运行docker version验证 Docker 是否可用。这里有个小技巧Docker Desktop 默认会把 WSL2 的发行版绑定为 Docker 的后端你在 WSL2 终端里跑 Docker 命令和 Windows 终端里跑是一样的底层是同一个 Docker Engine。如果你打算在本地网络环境里拉取镜像遇到速度问题可以在 Docker Desktop 的 Settings - Docker Engine 里配置镜像加速地址配置后需要 Apply Restart 才能生效。这一步不是必须的但在某些场景下能节省大量等待时间。另外我建议在 WSL2 的 Ubuntu 里装一下curl、vim这些基础工具后面编辑 yaml 文件和调试会用得到。执行sudo apt update sudo apt install -y curl vim3.2 第二步安装 kubectl 与 minikubekubectl 是操作 K8s 集群的命令行工具minikube 是负责创建和管理本地集群的工具。这两个工具是独立的二进制文件哪个平台下载哪个版本自己定。先装 kubectl。在 Windows 上我建议用直接下载二进制的方式因为最直观不用额外装包管理器。去 Kubernetes 官方发布页面下载与集群版本匹配或略高一点的 kubectl把 exe 文件放到你习惯的目录然后把该目录加到系统 PATH 中。下载完验证执行kubectl version --client顺利的话会输出版本号。严格来说 kubectl 的客户端版本和集群版本不需要完全一致但大版本之间最好保持在差异一个版本以内避免出现 API 兼容问题。比如集群是 v1.28kubectl 用 v1.29 通常没什么问题但跨两个大版本就可能出现不识别对象字段的情况。再装 minikube。同样是在官方发布页面下载最新版Windows 下是一个 exe 文件下载后改名为minikube.exe放到 PATH 目录下。安装完成后在终端执行minikube version能正常输出版本信息就说明装好了。这里多说一句 choco 方案。如果你装了 Chocolatey 包管理器也可以用choco install kubernetes-cli minikube一条命令装完但对于刚接触 Windows 命令行环境的朋友我反而推荐手动下载因为安装过程更透明出了问题更好排查。3.3 第三步创建单节点集群并验证驱动选 Docker 的情况下启动集群只需要一条命令minikube start --driverdocker --cpus2 --memory4096拆开看这几个参数--driverdocker让 minikube 把集群节点跑在 Docker 容器里不需要额外创建虚拟机。--cpus2指定节点容器可用的 CPU 核数按你的机器配置调整。--memory4096指定节点容器的内存单位是 MB4G 是单节点集群比较稳的配置。执行过程中会拉取一些底层镜像比如kicbase和其他 K8s 组件镜像根据网络状况可能需要几分钟。看到类似Done! kubectl is now configured to use minikube的输出说明集群启动成功了。然后验证集群状态kubectl get nodes正常会输出一个control-plane节点的信息状态为Ready。再看一下集群里有哪些系统组件在运行kubectl get pods -A你会看到 kube-system 命名空间下有一堆 Pod比如 coredns、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、storage-provisioner 等。看到这些 Pod 处于 Running 状态集群基本就稳了。minikube 还自带一个 Web 仪表盘执行minikube dashboard会自动打开浏览器可以在界面上查看节点、Pod、Service 等资源的状态。仪表盘对于不熟悉命令行操作的同学非常友好可以作为辅助观察工具用。3.4 第四步部署一个 Nginx 测试集群可用性集群建好了空跑没有意义部署一个实际应用来验证一下端到端流程。创建一个 Deployment指定镜像为nginx:alpinekubectl create deployment nginx-test --imagenginx:alpine然后创建一个 NodePort 类型的 Service 把端口暴露出来kubectl expose deployment nginx-test --typeNodePort --port80查看 Service 信息kubectl get svc nginx-test会看到类似如下的输出NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-test NodePort 10.109.xx.xx none 80:32468/TCP 30s其中32468就是映射到宿主机的随机端口。执行minikube service nginx-testminikube 会把 Service 的地址拼出来并自动打开浏览器访问后能看到 nginx 的欢迎页说明集群的 Pod 调度、Service 负载均衡、端口转发这条链路已经完全打通了。如果是在 WSL2 里操作注意不要直接用localhost:32468访问需要取 WSL2 的 IP 地址。可以在 Ubuntu 终端里执行hostname -I拿到 IP 后用http://WSL2-IP:32468访问。Docker Desktop 做过端口转发的场景下localhost 通常也能用但如果你发现访问不通优先检查这一层。4. 玩转 Mini 集群常用操作与进阶思路4.1 日常管理集群的 8 个高频命令本地集群跑起来之后下面这些命令是我平时用得非常频繁的建议收藏一下命令作用使用频率kubectl get nodes查看节点状态极高kubectl get pods -A查看所有命名空间下的 Pod极高kubectl get svc -A查看所有 Service 和暴露端口高kubectl describe pod name查看 Pod 详细信息排查问题极高kubectl logs -f pod查看 Pod 日志高kubectl apply -f xx.yaml用配置文件创建/更新资源高kubectl delete -f xx.yaml用配置文件删除资源中minikube stop / start停止/启动本地集群中特别想说一下kubectl describe这个命令。很多新手在遇到 Pod 启动失败时第一反应是看日志但实际上很多问题看日志是看不出来的比如镜像拉取失败、PVC 挂载失败、存活探针失败这些信息都在describe输出末尾的 Events 部分。我每次排查问题的第一步都是kubectl describe pod只有看到 Events 里的报错信息才能对症下药。如果你经常敲这几个命令建议再加一个 kubectl 自动补全。在 bash 环境里执行source (kubectl completion bash)这样可以减少很多输入量。4.2 用 kind 搭建多节点 mini 集群单节点集群能体验的基础功能很多但比如节点亲和性、污点容忍、Pod 漂移这类调度相关的特性单节点是完全没有办法验证的。这时候可以考虑用 kind 起一个多节点集群而且 kind 的创建速度比 minikube 快得多每次起集群大约只需要两到三分钟。创建一个三节点集群一个控制平面节点、两个工作节点准备一个配置文件multi-node.yamlkind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane ports: - containerPort: 30080 hostPort: 30080 protocol: TCP - role: worker - role: worker执行kind create cluster --config multi-node.yaml --name test-cluster创建完成后验证kubectl get nodes输出会看到test-cluster-control-plane、test-cluster-worker、test-cluster-worker2三个节点状态都为 Ready。在这个多节点集群里你就能真正体验调度是怎么回事了。比如创建一个 Deployment 并设置副本数为 5观察 Pod 是怎么被调度到不同节点的kubectl create deployment nginx-multi --imagenginx:alpine --replicas5 kubectl get pods -o wide输出结果里会有一个NODE列显示每个 Pod 运行在哪个节点上。在这个基础上你还可以手动把某个工作节点标记为不可调度观察 Pod 如何被重新调度kubectl cordon test-cluster-worker kubectl drain test-cluster-worker --ignore-daemonsets --delete-emptydir-data这就是 K8s 里面节点维护的标准流程平时生产环境升级节点前也是这么操作的。跑完这些命令之后自己动手体验一遍比我在这里写一千字理论都管用。4.3 小集群里也能体验的调度玩法即便是 mini 集群K8s 的调度机制也并不会缩小。虽然集群里可能只有两三个节点但在学习时完全可以把每个节点想象成一个大的可用区或物理机房很多生产级别的调度概念都能在这里模拟一遍。比如你可以给节点打上标签把某些 Pod 指定到特定节点上运行。给 worker 节点打一个disktypessd的标签kubectl label nodes test-cluster-worker disktypessd然后创建一个只调度到 SSD 节点的 PodapiVersion: v1 kind: Pod metadata: name: ssd-pod spec: nodeSelector: disktype: ssd containers: - name: nginx image: nginx:alpine执行kubectl apply -f ssd-pod.yaml后用kubectl get pods -o wide查看这个 Pod 的 NODE 列它一定会运行在打了disktypessd标签的节点上。这就是 nodeSelector 标签选择器的作用生产环境里经常用它来把计算密集型任务调度到 GPU 节点或者把存储有要求的服务调度到高性能磁盘节点。再看一个更有意思的场景模拟节点故障。在 kind 多节点集群里直接把某个节点的 Docker 容器停下来模拟一台服务器宕机docker stop test-cluster-worker2等上几秒钟然后执行kubectl get nodes你会看到test-cluster-worker2的状态变成了NotReady。重要的是观察运行在这个节点上的 Pod 会发生什么。由于 K8s 控制面检测到节点不可用后会在默认的pod-eviction-timeout默认 5 分钟后把该节点上的 Pod 标记为 Terminating然后在其他可用节点上重新创建。这个过程就是集群故障转移的经典逻辑。在本地 mini 集群里亲手制造一次“宕机”观察 K8s 如何自动恢复业务这种体验是看多少配置文档和原理图都替代不了的。4.4 给新手的 K8s 学习路线建议作为过来人我给刚接触 K8s 的朋友一个清晰的学习路径这条路径是踩过很多坑之后总结出来的第一阶段掌握核心命令和资源对象。kubectl get、describe、logs这些高频命令要熟练Pod、Deployment、Service 这几个最基础的资源对象必须理解透彻。这个阶段就用本地 mini 集群反复创建、修改、删除把 yaml 文件的常见写法刻在脑子里。第二阶段理解 Pod 的高级机制。探针就绪探针、存活探针、生命周期钩子、资源请求与限制、配置挂载ConfigMap、Secret这些内容建议一个一个做实验验证。比如配置一个错误的存活探针观察 K8s 如何重启容器这种实验在生产环境可不敢做但在本地集群想怎么折腾就怎么折腾。第三阶段学习 Controller 和存储相关概念。Deployment、StatefulSet、DaemonSet、Job、CronJob以及 PV、PVC 持久化存储对工作了之后实际使用帮助很大。第四阶段学习网络和治理能力。Service 的几种类型、Ingress 的配置、部署一套 Ingress Controllerminikube 里直接minikube addons enable ingress就能开再跑一跑 Prometheus 监控整套集群。这套路径走下来基本可以应付工作中大部分场景了。最重要的是别贪多一个概念验证透了再进入下一个。5. 遇到的坑与排查技巧实录5.1 最常见报错与解决办法我把自己在 Windows 上搭建过程中遇到的和身边同事问得最多的问题整理成一张速查表报错/问题常见原因解决方法Exiting due to PROVIDER_DOCKER_NOT_RUNNINGDocker Desktop 未启动先手动打开 Docker Desktop等右下角图标变稳定后再执行 startkubectl get nodes卡住或连接被拒绝集群未正常启动、kubeconfig 未配置执行minikube status检查必要时minikube start重新初始化拉取镜像超时或速度极慢网络问题、未配置镜像加速为 Docker 配置镜像加速地址后重启minikube 可使用--image-mirror-countrycn参数The connection to the server ... was refused集群已经停止执行minikube start恢复集群WSL2 内存占用过高导致 Windows 卡顿WSL2 默认使用 50% 内存配置.wslconfig限制 memory端口冲突导致 Service 无法访问本地端口被占用换一个 NodePort或者在 minikube 配置里指定固定端口范围Error: No objects passed to applyyaml 文件语法错误或路径不对用kubectl apply --dry-runclient -f xx.yaml预检查部署的 Pod 显示ImagePullBackOff镜像不存在或仓库认证问题检查镜像名称拼写登录docker login后再拉取印象最深的一个坑是 WSL2 的 DNS 解析问题。有一次集群能启动但 Pod 内部的apt-get update一直失败排查了半天发现是 WSL2 的 DNS 配置问题。解决办法是在 WSL2 的/etc/resolv.conf里检查 DNS 设置或者修改/etc/wsl.conf来固定 DNS。这个问题比较隐蔽而且每台机器的网络环境不同表现也不一样。遇到报错时我的排查思路一般是这样先看是不是环境层面的问题比如 Docker 是否运行、wsl状态是否正常、磁盘空间是否足够再看是不是网络问题比如镜像拉取超时、DNS 解析异常最后才看 K8s 本身的配置问题。大多数 Windows 下搭集群的报错根源都出在前两层。5.2 镜像拉取慢的解决思路这个问题太普遍了尤其是第一次启动 minikube 的时候需要拉取kicbase镜像这个镜像体积很大网络不行的时候能卡十分钟以上。解决方案有几个思路按优先级排序第一个思路是配置镜像加速地址。在 Docker Desktop 的 Settings - Docker Engine 配置 json 文件里加入registry-mirrors配置填入适合你网络环境的加速地址保存后重启 Docker。这种方式对 Docker Hub 官方仓库的镜像加速效果比较明显。第二个思路是在 minikube 启动时指定镜像仓库镜像参数。比如minikube start --driverdocker --image-mirror-countrycn这条参数会自动切换为更适合国内网络环境的镜像源启动过程中的下载速度会快不少。第三个思路是提前手动拉取关键镜像。如果启动过程中反复失败可以先手动执行docker pull把比较大的几个基础镜像拉到本地比如registry.cn-hangzhou.aliyuncs.com/...这类镜像源然后再启动 minikube它会优先复用本地已存在的镜像层。第四个思路是最终手段换个网络环境或者时间段。这个听起来有点玄学但确实有效。早上网络高峰和深夜的拉取速度差距可能很大如果条件允许尽量挑网络空闲时段操作。5.3 排查问题的通用套路最后分享一套排查 K8s 问题的通用套路不管是在本地 mini 集群还是生产环境都适用提出问题 - 缩小范围 - 深入细节 -验证修复四步闭环。举个例子如果 Service 访问不通先别急着改一波配置。第一确认 Pod 本身是否 Readykubectl get pods -o wide如果 Pod 不是 Running 状态用kubectl describe pod name看 Events。第二确认 Service 的 Endpoints 是否有数据kubectl get endpoints svc-name如果 Endpoints 为空说明 Service 的 selector 没有匹配到任何 Pod这个是特别常见的问题。第三确认网络策略或者端口是否正常kubectl port-forward svc/svc-name 8080:80临时把 Service 转发到本机试一下。这套思路的精髓在于每次都只修改一个变量观察结果避免一次性改了一堆配置却不知道是哪个起效的。我在生产环境排查问题时也基本沿用这个思路只不过多加了日志和监控数据的辅助。在 Windows 上调试还有一个特别实用的技巧在 WSL2 内跑tcpdump抓包比在 Windows 上用 Wireshark 更轻量而且直接看 K8s 容器网络的数据包会更直观。配合kubectl exec进入 Pod 内部可以定位很多网络层面的问题。5.4 磁盘空间清理与集群重置本地集群用久了之后磁盘占用是个很现实的问题。Docker 的镜像、容器层、日志文件会越积越多尤其是频繁实验的情况下几十 G 的空间很容易就被吃光了。这里提供几个清理思路查看 Docker 磁盘占用docker system df一键清理无用的镜像、容器和构建缓存docker system prune -a --volumes清理完 Docker 之后如果觉得集群本身的环境也乱了直接删掉重建比反复修复快得多。minikube 删除集群minikube deletekind 删除集群kind delete cluster --name test-cluster删掉之后WSL2 的 vhdx 虚拟磁盘文件可能不会自动缩容。Windows 下可以用diskpart或者直接执行wsl --shutdown Optimize-VHD -Path $env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu...\LocalState\ext4.vhdx -Mode Full如果你用的是 Docker Desktop 方案直接使用 Docker Desktop 的 Troubleshoot - Clean / Purge data 功能也能起到清理效果。这套“删除重建、按需清理”的思路在本地环境特别推荐。K8s 的一大卖点就是基础设施即代码所有集群状态都能通过 yaml 文件声明出来那环境乱了就删掉重建几行命令的事情不要有心理负担。最后再分享一点个人使用心得在 Windows 上坚持用本地 mini 集群做开发和测试一段时间之后我最深的体会是环境越贴近真实越能逼着你按生产标准来写配置。以前我在开发环境随便把配置写死在镜像里所有服务全部用默认的 ClusterIP遇到问题全靠进去敲命令。后来自从把整个本地开发环境都搬进 K8s 集群之后我开始认真对待命名空间隔离、资源配额、健康检查这些平时不太注意的细节因为这些配置在本地集群里是能直接观察到效果的。还有一个小技巧是平时用来切换集群上下文的。当你在本机同时用 minikube、kind、以及公司的远程集群时kubectl 的上下文切换很容易乱。我的做法是始终用kubectl config get-contexts确认当前操作的是哪个集群操作前先改成显式的写法kubectl config use-context minikube kubectl --contextminikube get pods第一次搭好环境之后建议你刻意在上面“折腾”几天把 Deployment 的副本数随便调一调、删掉正在运行的 Pod 看它怎么复活、故意写错镜像名看报错信息长什么样。这些操作看起来没什么实际意义但会让你在最短时间内积累起对 K8s 的直觉。这种直觉等到了生产环境遇到系统故障的时候是真的能救命的。
返回列表