遇到 minikube 启动失败,我通常不会急着调整参数,而是先把现象和本机条件对齐。这次的环境是 Mac M1,安装了 Docker Desktop,目标是启动 Kubernetes 1.27 的本地集群。最优先确认的是 CPU 架构和 minikube 二进制是否匹配。
先确认架构,再谈启动命令
在实际排查中,很多启动报错不是 minikube 配置问题,而是跑错了二进制。在使用 Mac M1 芯片启动 minikube 之前,先确认当前机器的 CPU 架构和 minikube 二进制是否匹配。在终端执行 uname -m 应返回 arm64,然后执行 minikube version,正常会显示类似 minikube v1.30.0 的版本号。如果 minikube 命令无法启动或在启动时报 “exec format error”,很可能是下载了 amd64 版本,需要从官方 GitHub Releases 中重新下载 darwin-arm64 的二进制。这一步能避免后续大部分架构不兼容问题。
先执行这一步的意义在于,M1 上的 Docker Desktop 可以运行 amd64 容器,但 minikube 本身是本地进程,它需要直接访问 Virtualization.framework。如果二进制架构不匹配,后续参数设置得再完整也走不到启动流程。另外,如果终端是通过 Rosetta 转译方式打开的,uname -m 会返回 x86_64,这时候不能只看机器型号下结论。
驱动选择与启动参数
确认架构正常后,下一步是选择驱动。本地 M1 芯片上推荐使用 Docker 驱动,这样 minikube 会创建一个由 Docker Desktop 管理的 Linux 虚拟机容器。启动前需要保证 Docker Desktop 已打开,并且 Docker 引擎处于运行状态,可以通过 docker info 检查。然后执行 minikube start --driver=docker --container-runtime=containerd --kubernetes-version=v1.27.0。这里显式指定容器运行时为 containerd,是为了在 ARM 架构下减少 docker-shim 的兼容性隐患。如果 Docker Desktop 版本较旧,建议先升级再执行。
执行 docker info 时,如果能看到 Server 信息,说明引擎已经就绪。若输出 error during connect,先打开 Docker Desktop 等待启动完成,不要立即重试。如果 Docker Desktop 一直无法启动,再考虑改用 minikube driver 列表中的其它驱动,但需要先确认本机已安装对应依赖。
镜像拉取失败时怎么排查
启动命令看起来没问题,但实际卡住的地方经常在镜像层。在 M1 芯片上使用 minikube 启动 Kubernetes 1.27 环境时,最常遇到的坑是系统组件镜像拉取失败。minikube 默认会从 gcr.io 拉取 kube-apiserver 等镜像,如果本地网络无法访问该地址,Pod 会一直处于 ImagePullBackOff 或 ErrImagePull。此时可以先用 docker pull 测试是否能拉取一个已知的 gcr.io 镜像,若失败,则需要在 minikube start 时通过 --image-repository 参数切换为可访问的镜像仓库,或者为 Docker daemon 配置代理。注意不要同时混用多个镜像仓库,否则容易出现部分镜像拉不到。
判断镜像拉取是不是根源,可以执行 kubectl get pods -n kube-system,重点看 coredns、kube-apiserver、kube-controller-manager 的状态。如果出现 ImagePullBackOff,下一步就检查网络,而不是反复重启 minikube。选择镜像仓库时要确认仓库包含 Kubernetes 1.27 所需标签;仓库不完整时,组件会长时间停留在 ContainerCreating。
启动后验证与日志观察
集群启动完成不是只看终端输出,而是要看 API 是否可访问、节点是否 Ready。先执行 kubectl cluster-info,能显示 control plane 地址时再执行 kubectl get nodes。节点状态刚启动时可能是 NotReady,这属于 kubelet 注册节点前的正常窗口,等一到两分钟再观察。如果长时间 NotReady,使用 kubectl describe node 查看 Conditions,再检查 kube-system 命名空间中 kube-proxy 和 coredns 的日志。
需要留意的是,coredns 即使处于 Running 也可能存在解析问题。可以用 kubectl run 一个临时 Pod 尝试解析 kubernetes.default.svc,再结合日志判断是镜像问题还是 coredns 配置问题。
资源限制与清理
M1 Mac 上运行 minikube,实际占用的资源是 Docker Desktop 管理的 Linux 虚拟机,命令本身只负责控制面通信。启动时建议加上 --cpus=2 --memory=4096 这类限制,具体数值要结合本机总内存调整。如果机器只有 8GB,分配给 minikube 的内存在 4GB 以上时,本机切换应用会明显变慢,甚至触发 Docker Desktop 无响应。
用完环境后,minikube stop 可以暂停集群,minikube delete 会移除整个集群。如果只是临时让出资源,也可以直接暂停 Docker Desktop,但下次启动时要重新等待组件拉起。需要注意的是,delete 操作默认会删除 .minikube 目录下的集群数据,重新启动意味着重新拉取镜像和初始化 kubeconfig,所以清理前先确认不再需要当前环境。