【Kubernetes从入门到精通】第03篇:手把手搭建K8s学习环境——minikube/kind/k3s三选一

发布时间:2026/7/29 17:45:20
【Kubernetes从入门到精通】第03篇:手把手搭建K8s学习环境——minikube/kind/k3s三选一 上一篇【第02篇】容器到底是个啥——Docker快速入门下一篇【第04篇】云原生是什么鬼——CNCF技术版图漫游指南摘要想学K8s第一步不是看文档、买书、收藏教程——是先把环境搭起来。很多人在这一步就放弃了看了三天文档还没摸到kubectl装个minikube报了一屏错误各种virtualization not enabled“VT-x/AMD-v is disabled”……心态直接崩了。别慌。本文针对macOS/Windows/Linux三大平台带你横向对比minikube、kind、k3s三种本地K8s方案帮你选一个最适合你的然后以kind为例从零到一跑通全流程——安装、启动集群、配kubectl、装dashboard最后把常见坑全部填上。跟着走一遍最多20分钟你的第一个K8s集群就跑起来了。一、三种本地K8s方案大比拼——选谁陪你上路在本地学K8s你不需要一个生产级集群只需要一个能跑起来、能用kubectl操作的迷你K8s。主流的本地方案有三个minikube、kind、k3s。它们分别是三种不同思路的代表作。【本地 K8s 方案的三种流派】 minikube 流派 kind 流派 给你一台完整的虚拟机/容器 在 Docker 容器里跑 K8s 组件 ┌────────────────────┐ ┌─────────────────────┐ │ ┌──────────────┐ │ │ Docker │ │ │ kubelet │ │ │ ┌───────────────┐ │ │ │ container │ │ │ │ control-plane │ │ │ │ runtime │ │ │ │ 容器 │ │ │ │ (完整K8s) │ │ │ │ (api-server │ │ │ └──────────────┘ │ │ │ etcd │ │ │ VM: ~2GB 内存 │ │ │ scheduler │ │ └────────────────────┘ │ │ controller) │ │ │ └───────────────┘ │ k3s 流派 │ ┌───────────────┐ │ K8s 的精简版专为边缘/ │ │ worker 容器 │ │ IoT/本地开发砍掉了臃肿部分 │ │ (kubelet │ │ ┌────────────────────┐ │ │ containerd) │ │ │ 单二进制文件 │ │ └───────────────┘ │ │ ~80MB │ └─────────────────────┘ │ SQLite代替etcd │ 纯容器不依赖虚拟机 │ 内置containerd │ 单节点: ~500MB 内存 └────────────────────┘三者横向对比一览对比维度minikubekindk3s运行方式虚拟机(默认)或Docker容器Docker容器中的K8s节点直接在宿主机或Docker中运行资源消耗较高推荐2GB内存低单节点~500MB极低~512MB内存即可多节点支持✅ 支持–nodesN✅ 天然支持配置文件✅ 支持需要手动配置启动速度较慢拉镜像、启动VM快纯容器极快轻量二进制功能完整度最高接近标准K8s标准K8s去掉非核心组件精简版部分功能裁减持久化存储✅ 内置hostPath✅ 支持但容器重启可能丢✅ 内置local-pathIngress✅ 内置addon⚠️ 需额外安装⚠️ 需额外安装Dashboard✅ 一键addon启用⚠️ 需手动安装⚠️ 需手动安装LoadBalancer✅ minikube tunnel⚠️ 需MetalLB等⚠️ 需手动配置Windows支持✅ 良好✅ 良好WSL2/Docker Desktop⚠️ 推荐Linux学习用途⭐⭐⭐⭐⭐ 最佳选择⭐⭐⭐⭐ 非常适合⭐⭐⭐ 够用但裁剪多适合场景K8s入门学习完整功能体验CI/CD流水线本地开发测试边缘计算资源受限环境我的推荐要点如果你是第一次学K8s以下选型建议请对号入座Windows/macOS用户学K8s→ 选minikube功能最完整出问题搜到的解决方案最多已有Docker环境、想要快速体验→ 选kind轻量快速一个docker就够了Linux用户、机器配置不高→ 选k3s占用资源最少速度快到飞起要做CI/CD测试K8s部署→ 选kindGitHub Actions官方标配本系列后续文章以kind作为默认环境——因为它不依赖虚拟机只要你有Docker就能跑对所有平台体验一致。二、以kind为例——从安装到第一个kubectl命令前置条件检查在开始之前确保你已经安装了以下工具# 1. 检查 Dockerkind 的底层依赖docker--version# Docker version 24.0.0, build ...# 2. 确保 Docker 正在运行dockerps# 有输出就行不需要有容器在跑# 3. Windows用户确保WSL2或Docker Desktop正在运行# macOS用户确保Docker Desktop正在运行# Linux用户确保docker daemon在运行Step 1安装 kind# macOS / Linuxcurl-Lo./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-$(uname)-amd64chmodx ./kindsudomv./kind /usr/local/bin/kind# Windows (PowerShell)curl.exe-Lokind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.24.0/kind-windows-amd64 Move-Item .\kind-windows-amd64.exe C:\some-dir-in-your-PATH\kind.exe# 验证安装kind version# kind v0.24.0 go1.22.0 linux/amd64要点kind 的版本号更新很快建议去 https://github.com/kubernetes-sigs/kind/releases 查最新版本号替换上面的v0.24.0。Step 2安装 kubectlkubectl 是 K8s 的命令行客户端是用来跟 K8s 集群交互的唯一入口——你的一切操作都通过它完成。# macOSbrewinstallkubectl# Linuxcurl-LOhttps://dl.k8s.io/release/$(curl-L-shttps://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectlchmodx kubectlsudomvkubectl /usr/local/bin/# Windows (PowerShell)curl.exe-LOhttps://dl.k8s.io/release/v1.30.0/bin/windows/amd64/kubectl.exe# 把 kubectl.exe 放到 PATH 目录下# 验证安装kubectl version--client# Client Version: v1.30.0Step 3创建 kind 集群# 先创建一个配置文件 kind-config.yaml# 这个配置文件定义了一个控制面节点 两个工作节点kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:-role:control-planeextraPortMappings:-containerPort:30080# 把容器30080端口映射到宿主机hostPort:30080protocol:TCP-role:worker-role:worker# 使用配置文件创建集群kind create cluster--namek8s-learn--configkind-config.yaml# 等待输出类似以下信息# Creating cluster k8s-learn ...# ✓ Ensuring node image (kindest/node:v1.30.0) # ✓ Preparing nodes # ✓ Writing configuration # ✓ Starting control-plane ️# ✓ Installing CNI # ✓ Installing StorageClass # ✓ Joining worker nodes # Set kubectl context to kind-k8s-learn创建过程大概需要 2-5 分钟取决于网速kind 会自动拉取 K8s 节点镜像。看到Set kubectl context to kind-k8s-learn就说明成功了。要点kind 创建集群后会自动把 kubeconfig 写到你本机的~/.kube/config如果该目录不存在会自动创建并自动设置好 context。这意味着你接下来直接kubectl就能操作这个集群不需要手动配任何东西——这个细节设计真的贴心。Step 4验证集群状态# 查看集群信息kubectl cluster-info# Kubernetes control plane is running at https://127.0.0.1:xxxxx# 查看节点kubectl get nodes# NAME STATUS ROLES AGE VERSION# k8s-learn-control-plane Ready control-plane 2m v1.30.0# k8s-learn-worker Ready none 1m v1.30.0# k8s-learn-worker2 Ready none 1m v1.30.0# 查看所有命名空间的 Podkubectl get pods-A# NAMESPACE NAME READY STATUS RESTARTS AGE# kube-system coredns-xxx-xxx 1/1 Running 0 2m# kube-system etcd-k8s-learn-control-plane 1/1 Running 0 2m# kube-system kindnet-xxx 1/1 Running 0 2m# kube-system kube-apiserver-k8s-learn-control-plane 1/1 Running 0 2m# kube-system kube-controller-manager-k8s-learn-control-plane 1/1 Running 0 2m# kube-system kube-proxy-xxx 1/1 Running 0 2m# kube-system kube-scheduler-k8s-learn-control-plane 1/1 Running 0 2m看到所有 kube-system 下的 Pod 都是Running状态集群就完全就绪了。【kind 集群架构一览】 宿主机 (你的笔记本电脑) ┌──────────────────────────────────────────────────────┐ │ │ │ ┌───────────────── Docker Network ─────────────┐ │ │ │ │ │ │ │ ┌───────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │control- │ │ worker │ │ worker2 │ │ │ │ │ │ plane容器 │ │ 容器 │ │ 容器 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │api-server │ │kubelet │ │kubelet │ │ │ │ │ │etcd │ │kube-proxy│ │kube-proxy│ │ │ │ │ │controller │ │containerd│ │containerd│ │ │ │ │ │scheduler │ │ │ │ │ │ │ │ │ │kubelet │ │ │ │ │ │ │ │ │ │containerd │ │ │ │ │ │ │ │ │ └───────────┘ └──────────┘ └──────────┘ │ │ │ │ ▲ ▲ ▲ │ │ │ └─────────┼───────────────┼────────────┼────────┘ │ │ │ │ │ │ │ kubectl ◄────────────┘ │ │ │ │ │ │ 你的用户 Pod 会调度到 worker 节点上 ←─┘ │ └──────────────────────────────────────────────────────┘要点kind 里每个 K8s 节点实际上是一个 Docker 容器。你可以在宿主机上docker ps看到它们。这意味着 kind 集群的持久化依赖于容器不删除——如果你kind delete cluster节点容器就没了所有数据也会丢失。三、安装 Kubernetes Dashboard——可视化你的集群CLI 方便是方便但有个 Web UI 看着更直观。来装个 Dashboard# 1. 部署 Dashboard使用官方推荐版本kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml# 2. 验证 Dashboard 是否部署成功kubectl get pods-nkubernetes-dashboard# NAME READY STATUS RESTARTS AGE# dashboard-metrics-scraper-xxx 1/1 Running 0 30s# kubernetes-dashboard-xxx 1/1 Running 0 30s# 3. 创建管理员账号方便本地开发生产环境别这么干kubectl apply-f-EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF# 4. 获取登录 Tokenkubectl-nkubernetes-dashboard create token admin-user# 5. 启动 kubectl proxyDashboard 通过 API Server 代理访问kubectl proxy# 6. 浏览器打开# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/【访问 Dashboard 的数据流】 浏览器 ──► kubectl proxy ──► K8s API Server ──► Dashboard Pod (localhost:8001) (代理转发) (鉴权) (Web UI)要点kubectl proxy是一个非常有用的命令——它会创建一个本地代理把请求转发到 K8s API Server并自动处理认证附带你本机的 kubeconfig 凭据。在很多需要本地访问 K8s 内部服务的场景都非常好用不只是 Dashboard。登录后你会看到一个漂亮的 Web 界面能看到所有命名空间、Pod、Deployment、Service 等信息。Dashboard 在学习的早期阶段非常有用——你可以直观地看到我创建了一个 Deployment之后发生了什么。四、跑通第一个 Hello K8s环境搭好了必须跑个东西验证一下。下一篇我们会详细讲 Deployment 和 Service这里先来一个Hello World级别的小测试# 1. 创建一个 Deployment运行 nginxkubectl create deployment hello-k8s--imagenginx:alpine# 2. 查看 Deployment 状态kubectl get deployment hello-k8s# NAME READY UP-TO-DATE AVAILABLE AGE# hello-k8s 1/1 1 1 10s# 3. 查看 Podkubectl get pods# NAME READY STATUS RESTARTS AGE# hello-k8s-5d8c6f7b9-xyz 1/1 Running 0 20s# 4. 暴露服务通过 NodePort 在 30080 端口上访问kubectl expose deployment hello-k8s--typeNodePort--port80--target-port80# 注意kind 的 NodePort 需要我们在配置文件中映射了端口才生效# 5. 查看 Servicekubectl get svc hello-k8s# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE# hello-k8s NodePort 10.96.xxx.xxx none 80:xxxxx/TCP 5s# 6. 如果想立即访问用 port-forward 最方便kubectl port-forward svc/hello-k8s8080:80# 然后在浏览器打开 http://localhost:8080# 用 curl 测试curlhttp://localhost:8080# 如果看到 h1Welcome to nginx!/h1 恭喜你的第一个 K8s 服务跑起来了# 清理测试资源kubectl delete deployment hello-k8s kubectl delete svc hello-k8s要点这里你可能注意到了——我们并没有手动启动 Docker 容器、没有配 nginx 配置、没有做任何网络配置只是告诉 K8s我要一个 nginx它就自动完成了拉镜像、启动容器、分配网络、健康检查——这就是声明式管理的魅力。等你学会写 YAML 之后会更爽。五、kind 日常操作手册集群搭好了日常使用中需要的操作都在这里# 集群本身的管理 # 查看所有 kind 集群kind get clusters# k8s-learn# 查看集群节点容器dockerps--filternamek8s-learn# 导出集群的 kubeconfigkindexportkubeconfig--namek8s-learn# 暂停/恢复集群暂停后资源不释放# kind 不支持直接 pause但可以这样dockerpause k8s-learn-control-plane k8s-learn-worker k8s-learn-worker2dockerunpause k8s-learn-control-plane k8s-learn-worker k8s-learn-worker2# 删除集群kind delete cluster--namek8s-learn# 重新创建集群快速重建kind delete cluster--namek8s-learnkind create cluster--namek8s-learn--configkind-config.yaml# 切换 kubeconfig Context # 查看所有 contextkubectl config get-contexts# 切换到指定 contextkubectl config use-context kind-k8s-learn# 查看当前 contextkubectl config current-context# kubectl 常用快捷操作 # 设置别名强烈推荐省去大量打字时间aliaskkubectl# 开启自动补全source(kubectl completionbash)# bashsource(kubectl completionzsh)# zsh# 添加到 ~/.bashrc 或 ~/.zshrc 永久生效# 快速查看资源缩写kubectl api-resources# 你会发现 deployment 可以简写成 deploy# service 可以简写成 svc# configmap 可以简写成 cm# persistentvolumeclaim 可以简写成 pvc六、常见踩坑大全——我替你摔过的跤坑一Docker 没启动# 错误信息# ERROR: failed to create cluster: command docker ps ... failed# 解决启动 Docker Desktop确认 docker ps 能正常运行dockerps坑二镜像拉取太慢或失败kind 创建集群时需要拉取kindest/node镜像这个镜像在 Docker Hub 上国内可能很慢# 方案一预拉取镜像用国内镜像加速dockerpull docker.1ms.run/kindest/node:v1.30.0dockertag docker.1ms.run/kindest/node:v1.30.0 kindest/node:v1.30.0# 方案二使用 kind 的 --image 参数指定自定义镜像kind create cluster--imagekindest/node:v1.30.0# 方案三配置 Docker 镜像加速器# 编辑 Docker Desktop Settings → Docker Engine添加{registry-mirrors:[https://your-mirror-url.mirror.aliyuncs.com]}坑三端口冲突# 错误信息# ERROR: failed to create cluster: port is already in use# 解决修改 kind-config.yaml 中的 hostPortextraPortMappings: - containerPort:30080hostPort:30081# 换一个端口坑四WSL2 内存不足Windows 用户如果集群启动后过几分钟 Pod 变成CrashLoopBackOff或节点变NotReady# 检查 WSL2 内存限制wsl-l-v# 创建/编辑 %USERPROFILE%\.wslconfig增加内存[wsl2]memory4GB processors2 swap2GB# 重启 WSLwsl--shutdown坑五kubectl 连不上集群# 错误信息# The connection to the server localhost:8080 was refused# 检查 kubeconfig 是否配置正确kubectl config view# 查看当前 contextkubectl config current-context# 如果 context 不对切换过来kubectl config use-context kind-k8s-learn# 确认集群在运行kind get clusters要点踩坑不可怕可怕的是踩了坑不知道去哪找信息。三个黄金排查命令kubectl describe pod name看 Pod 的详细状态和事件kubectl logs pod-name看容器日志kubectl get events -A --sort-by.lastTimestamp看整个集群最近的事件。80% 的问题靠这三板斧都能定位。本篇小结这篇我们完成了学 K8s 最重要的一步——把环境跑起来方案选型minikube功能最全适合入门、kind轻量容器化适合 CI/CD 和快速测试、k3s资源最少适合低配机器。三者都能满足学习需求选你觉得最顺手的。kind 搭建安装 kubectl → 安装 kind → 编写配置 →kind create cluster→kubectl get nodes验证。几个命令就搞定了。Dashboard 安装kubectl apply一条命令部署创建管理员账号用kubectl proxy代理访问。常见坑点Docker 没启动检查 docker ps、镜像拉取慢配置镜像加速、端口冲突改 hostPort、WSL2 内存不足调大 .wslconfig 内存。现在你的 K8s 集群已经在本地跑起来了。下一篇文章我们跳出技术细节聊聊云原生这个大概念——CNCF 那 200 多个项目到底是干嘛的K8s 在整个版图里处在什么位置读完下一篇你就有了全局视野。上一篇【第02篇】容器到底是个啥——Docker快速入门下一篇【第04篇】云原生是什么鬼——CNCF技术版图漫游指南