☰
CentOS上部署Minikube:从环境准备到集群启动的完整指南
2026/9/30 3:38:29 网站建设 项目流程

1. 为什么我在CentOS上折腾Minikube:选型和驱动选择

先说结论:Minikube是本地跑Kubernetes集群最省事的工具,没有之一。如果你只是想学K8s、跑个实验、验证一下Deployment和Service的玩法,在CentOS上装Minikube,比自己搭一套多节点集群、或者去啃kubeadm那套初始化流程要快得多。

我最早是在自己的CentOS 7.9虚拟机里部署Minikube的,内存给了4G,CPU分配了双核,磁盘40G。这个配置跑起来不算宽裕,但做基础实验完全够了。折腾完一通之后我最大的感受是:Minikube安装本身不难,难的是把环境和驱动调顺,尤其是CentOS这种偏保守的发行版,内核版本、cgroup驱动、容器运行时之间稍有不对付,启动集群就会给你一串看不懂的报错。

这篇文章就把我完整的安装过程、踩坑记录和排错思路写出来,从系统选型到日常维护都覆盖到。内容是按CentOS 7.9和CentOS Stream 8两条线讲的,如果你是CentOS 8或更高版本,大部分步骤通用,个别差异我会单独标注。

1.1 先选版本:CentOS 7.9还是CentOS Stream 8

我在两台机器上分别试过CentOS 7.9和CentOS Stream 8,结论是:能用Stream 8就别用7.9。原因很直接:

  • CentOS 7.9的内核版本是3.10.x,而Kubernetes对内核版本的最低要求是3.12左右,虽然Minikube在3.10上也能跑,但涉及cgroup v2、overlayfs等新特性时,老内核会各种别扭。
  • CentOS 7.9的iptables版本旧,Docker和K8s的流量转发规则偶尔会打架,你需要手动调整。
  • Stream 8的内核是4.18,配合containerd或Docker都顺滑很多,一些默认配置踩坑概率明显下降。

如果你的环境只能装7.9,也不用慌,本文后半部分会把7.9特有的问题单独列出来。但如果你有选择权,我真的建议直接上Stream 8或者更新的版本。

1.2 虚拟化驱动怎么选:Docker、containerd还是KVM

这是整个安装过程中最核心的决策点。Minikube本身不自带容器运行时,它需要调用一个底层环境来运行K8s组件,Minikube支持的驱动包括Docker、containerd、CRI-O、Podman、KVM等。

我的建议很简单:默认选Docker。

原因有三:

  1. Docker驱动是最成熟的路径,Minikube官方默认优先检测Docker,文档和社区排错案例都是按Docker写的,你遇到问题时搜到的资料大概率也围绕Docker。
  2. Docker驱动的资源开销不算大,对于本地实验环境来说可以接受。
  3. 如果你已经有正在用的Docker环境,可以直接复用,不需要额外跑一个KVM虚拟机。

KVM驱动我也试过,思路是让Minikube启动一个真正的虚拟机来跑K8s,隔离性好,适合需要测试不同内核场景的玩家。但KVM驱动对机器要求高,需要CPU支持硬件虚拟化,并且要在CentOS里装libvirt、qemu-kvm一堆东西,配置复杂,只推荐给确实有隔离需求的场景。

这里有一个细节:Minikube会自动探测已存在的Docker守护进程。你机器上如果已经装了Docker,启动Minikube时它会默认使用Docker驱动,不需要额外指定。如果没装Docker,它可能会尝试下载并启动一个新的容器运行时,这就涉及到网络访问的问题了(下面会细说),所以提前装好Docker会让你少踩很多坑。

1.3 硬件配置的最低要求

Minikube官方文档写的是:2核CPU、2G内存、20G磁盘空间。但我的实测经验是,这配置只是"能启动",你想跑个像样的工作负载,还得往上加:

资源官方最低建议配置说明
CPU2核4核编译镜像、跑多副本Pod时CPU很紧张
内存2G4G-8GK8s系统组件本身就吃1G+,再跑应用至少4G
磁盘20G40G镜像缓存、容器层数据增长很快
虚拟化可选KVM/嵌套虚拟化Docker驱动不强制,KVM驱动必须

如果你是虚拟机里再跑Minikube(也就是嵌套虚拟化),建议给VM分配CPU时勾选"向客户机暴露虚拟化指令集"之类的选项,否则部分驱动会直接报错。

2. 环境准备阶段最容易翻车的三个细节

在下载Minikube二进制文件之前,先把系统环境调好。这一步很多人跳过去,然后启动集群时面对一屏报错,这才是真正的噩梦。我按自己的操作顺序,把关键步骤和容易出问题的点完整梳理一遍。

2.1 Docker安装:yum源选择与版本锁定

CentOS装Docker最稳妥的方式是用官方yum源,但官方源在国内速度堪忧。我这里的做法是直接用阿里云镜像的Docker源,速度快且稳定:

sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

如果是Stream 8,上面的repo路径会自动对应到8的目录;如果是7.9,它会用7的目录。添加完之后,强烈建议先查询可用版本再安装,不要直接yum install docker-ce装最新版:

yum list docker-ce --showduplicates | sort -r

为什么建议锁定版本?因为Docker更新太快,而K8s版本对Docker版本有兼容性矩阵。在我测试的时间点,Docker 24.x配合Kubernetes 1.28、1.29都很稳,但Docker 25.x在某些场景下与K8s的CRI适配会出现问题。选择安装命令如下:

sudo yum install -y docker-ce-24.0.7 docker-ce-cli-24.0.7 containerd.io

安装完成之后,先把服务启动并设置开机自启:

sudo systemctl enable docker --now sudo systemctl status docker

2.2 把当前用户加入docker组:一个被忽略的环节

Minikube内部会调用Docker命令和守护进程通信。如果直接用root运行Minikube,后面会遇到文件权限、目录归属的麻烦;如果用普通用户但没把用户加入docker组,又会频繁遇到"permission denied while trying to connect to the Docker daemon socket"这类报错。

标准操作:

sudo usermod -aG docker $USER newgrp docker

注意,newgrp docker是为了让当前终端会话立即生效,不用重新登录。如果你开了新的SSH终端,其实可以直接生效。这里我踩过坑:加完组之后没重新登录,直接运行Minikube,报错提示连不上Docker,我还以为是服务没起来,白折腾了十分钟。

2.3 cgroup驱动保持一致:Docker和K8s的隐藏矛盾

这个细节是90%启动失败的根源,网上大量报错帖都跟它有关。

Kubernetes的kubelet组件依赖cgroup来管理容器资源。从Docker 20.10开始,Docker默认使用的是cgroup v2(前提是宿主机内核开启了cgroup v2),但CentOS 7.9的内核只支持cgroup v1,CentOS Stream 8有些内核版本默认开启v2。问题是,Minikube在启动时会检测docker的cgroup驱动,如果/etc/docker/daemon.json里没有明确配置,就可能出现kubelet期望的cgroup驱动和Docker实际使用的不一致,然后报错。

保险的做法是手动指定Docker使用systemd cgroup驱动,在/etc/docker/daemon.json里写入:

{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" }

写入后重启Docker:

sudo systemctl restart docker

这里有个判断技巧:执行docker info | grep cgroup,看到Cgroup Driver: systemd就说明配置正确。如果你看到的是cgroupfs,那就等着启动Minikube时报kubelet的cgroup错误吧。

2.4 防火墙与SELinux的处理策略

CentOS的防火墙和SELinux对本地开发环境来说,更多是添乱。Minikube启动的K8s API Server端口是随机高位端口,NodePort服务的端口范围是30000-32767,防火墙策略如果没放行,服务访问会莫名其妙地失败。

我的做法是直接关闭防火墙(仅限实验环境):

sudo systemctl stop firewalld sudo systemctl disable firewalld

SELinux则设置为permissive模式,先不改配置文件,临时生效即可:

sudo setenforce 0

如果要永久关闭SELinux,需要编辑/etc/selinux/config,把SELINUX=enforcing改成SELINUX=permissive。注意我刻意不建议改成disabled,因为RHEL系后期升级可能会出问题,permissive模式够用了。

提示:如果你是在公司网络环境,防火墙是有安全策略要求的,别图省事直接关,去问管理员要放行端口清单。

3. 安装Minikube本体:下载、镜像源与版本校准

环境准备完毕,这时候再来装Minikube,你会发现顺利很多。但这一步也有讲究,尤其是国内网络环境下,Minikube默认下载Kubernetes组件的路径是谷歌的存储地址,不配置镜像源的话,启动集群几乎必失败,而且卡住的报错信息很像网络不通,容易误导排查方向。

3.1 下载Minikube二进制文件

Minikube的安装方式有几种:直接下载二进制文件、通过包管理器安装、用Homebrew(仅macOS)。CentOS下最省事的是直接下载官方编译好的二进制:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube

这里install命令自动完成复制和设置可执行权限,比手动chmod +x再mv更规范。装完验证:

minikube version

输出minikube version: v1.32.x之类的信息就对了。

关于下载超时的心得:如果你在下载minikube二进制时都卡住,说明到谷歌存储的链路不稳定。此时一个直接的办法是换镜像源,国内有多个镜像站同步了Minikube的二进制包,具体地址我不一一列了,搜索"minikube 国内镜像下载"就能找到,下载后同样install到/usr/local/bin即可。

3.2 配置镜像源:启动成功的关键一步

Minikube启动时会做三件跟网络强相关的事:

  1. 从谷歌容器镜像仓库拉取kube-apiserver、kube-controller-manager等系统组件的镜像。
  2. 拉取pause容器镜像。
  3. 拉取coredns、dashboard等附加组件镜像。

如果不配置镜像源,启动会直接卡在Pulling base image或者Downloading ...环节。解决办法是给Minikube指定阿里云的镜像仓库:

minikube start --driver=docker \ --image-mirror-registry=registry.cn-hangzhou.aliyuncs.com/google_containers

启动参数里指定--image-mirror-registry,Minikube拉取K8s组件镜像时就会自动拼接阿里云的镜像地址。我在多个环境实测,这个配置基本能解决拉镜像的卡顿问题。

如果你连minikube的iso镜像也拉不下来,还可以设置环境变量:

export MINIKUBE_IMAGE_REPO=registry.cn-hangzhou.aliyuncs.com/google_containers

3.3 首次启动时指定资源配额和驱动

我第一次启动时没指定资源大小,Minikube默认只分配2G内存。这个配置跑起来很憋屈,后面再调又要重建整个集群,所以第一次启动就把参数设够:

minikube start --driver=docker \ --cpus=4 \ --memory=6144 \ --disk-size=40g \ --image-mirror-registry=registry.cn-hangzhou.aliyuncs.com/google_containers

加上--kubernetes-version可以指定K8s版本,比如想用1.28.x:

minikube start --kubernetes-version=v1.28.2

我建议明确指定版本,不要用默认latest。K8s小版本升级节奏快,有些版本和Docker驱动的组合刚好有bug,你锁定一个已知稳定的版本,后面使用中就不会被自动升级带来的变化干扰。

3.4 启动过程的正常日志是什么样的

首次启动会经历几个阶段,熟悉它可以帮助你快速判断问题出在哪一步:

  • 检查Docker连接和版本
  • 下载K8s组件镜像
  • 启动容器节点
  • 配置kubelet和容器运行时
  • 初始化控制平面组件
  • 配置kubectl和集群访问

其中耗时最长的是下载镜像,视网速可能3-10分钟不等。顺利启动后,终端会显示Done! kubectl is now configured to use "minikube" cluster。

此时再执行:

kubectl get nodes

看到STATUS = Ready,说明集群已经立起来了。

4. 启动集群时的常见报错与完整排查链路

Minikube整体设计得不错,但CentOS上翻车的点非常集中。这一节我把遇到过的报错、根因和排查过程完整写出来,希望能帮你省下大量搜索时间。

4.1 报错一:kubelet failed to get cpu cgroup之类的问题

现象:启动进行到一半,提示类似kubelet is not healthy,查看日志发现和cgroup相关的报错。

排查链路:

  1. 先确认Docker的cgroup驱动:
docker info | grep cgroup

如果输出Cgroup Driver: cgroupfs,基本就是驱动不一致了。

  1. 修改/etc/docker/daemon.json,把cgroupdriver设为systemd,重启Docker。我前面章节已经写过具体配置,这里不再重复。

  2. 如果还是不行,检查内核启动参数里是否启用了cgroup:

cat /proc/cmdline

正常应该包含cgroup_enable=memory之类的参数。CentOS 7.9的grub默认配置有时会漏掉,需要在/etc/default/grub的GRUB_CMDLINE_LINUX里追加cgroup_enable=memory swapaccount=1,然后执行:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo reboot

这个操作做完之后,cgroup相关的诡异报错大部分都会消失。

4.2 报错二:Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges

现象:你图省事用root用户运行minikube start,结果直接退出。

这是Minikube的保护机制。它明确拒绝root运行Docker驱动,防止对宿主系统产生意外影响。

解法很简单:创建普通用户,加入docker组,用普通用户运行Minikube:

sudo useradd -m k8suser sudo usermod -aG docker k8suser su - k8suser minikube start

如果你已经在root下初始化过Minikube配置,切换用户后需要清理一下旧配置:

rm -rf ~/.minikube

注意是删除新用户家目录下的.minikube目录,不是root下的,别搞混。

4.3 报错三:Unable to start cluster: docker: Error response from daemon: ... iptables failed

现象:Docker容器虽然起来了,但网络配置阶段报iptables相关错误。

根因通常是两个:一是Docker服务没有启用IP转发;二是CentOS 7.9自带的iptables版本偏旧,与Docker期望的行为不匹配。

排查链路:

  1. 检查IP转发是否开启:
sysctl net.ipv4.ip_forward

输出为0就说明没开,写入配置:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
  1. 清理iptables残留规则:
sudo iptables -F sudo iptables -t nat -F

注意这个操作会清空所有自定义规则,生产环境慎用。在干净的实验环境里,清空后重启Docker,问题一般就解决了。

  1. 如果仍然报错,执行sudo systemctl restart docker,有时是Docker启动时加载的NAT链和旧规则冲突。

4.4 报错四:Exiting due to K8S_INSTALL_FAILED: downloading ... timed out

现象:下载K8s组件超时。

这个是最常见的网络问题,通常发生在没配置镜像源时。我已经在上一节给出了--image-mirror-registry的配法,这里补充一个判断思路。

Minikube提供了非常详细的日志输出,启动失败后可以执行:

minikube logs

或者:

minikube start -v=8

-v=8会输出极其详细的调试日志,包括每个HTTP请求的URL、状态码、耗时。如果看到请求的域名是gcr.io或者storage.googleapis.com,那就说明流量没走镜像源,回头检查启动命令里的镜像参数拼写是否正确。

4.5 报错五:docker driver error: dial unix /var/run/docker.sock: connect: permission denied

现象:Minikube连不上Docker守护进程。

排查链路很简单:

  1. 确认Docker服务在运行:systemctl status docker。
  2. 确认当前用户属于docker组:groups。
  3. 如果上两步都没问题,执行sudo chmod 666 /var/run/docker.sock。但注意,这是治标不治本的方法,重启后权限会恢复原样,因为Docker会重置socket权限。真正有效的做法是重新登录会话,或者用newgrp docker让组权限在当前终端生效。

5. 集群日常使用:Dashboard、插件管理与扩容注意事项

集群起来了,怎么用得顺手是下一件事。Minikube提供了一系列配套功能,但有些功能入口比较隐蔽,不写下来很容易遗忘。

5.1 启用Kubernetes Dashboard

可视化面板对新手特别友好,部署应用、看日志、查资源状态都直观很多。启用方式:

minikube dashboard

这个命令会自动打开浏览器(如果你有图形界面),然后通过代理把Dashboard的端口映射到宿主机。

如果你是纯SSH环境,没有浏览器,可以先启动dashboard后台服务:

minikube dashboard --url

它会输出一个类似http://127.0.0.1:43257/api/v1/namespaces/kubernetes-dashboard/proxy/...的地址。注意这个地址监听在127.0.0.1上,外部访问不到。如果你需要在远程访问,还得额外加一层SSH端口转发,这就不展开说了。

5.2 插件管理:Metrics、Ingress、Registry等

Minikube自带插件管理命令,我日常用到最多的三个插件:

minikube addons enable metrics-server minikube addons enable ingress minikube addons enable registry

metrics-server提供Pod和节点的资源监控数据,kubectl top依赖它,建议必开。ingress插件让你能用Ingress资源做域名路由,省得每次都用NodePort。registry插件是往Minikube里嵌一个本地镜像仓库,有镜像构建需求的场景会用到。

查看全部插件列表:

minikube addons list

每个插件后面有enabled/disabled状态,一目了然。

5.3 磁盘扩容:给Minikube VM加空间

CentOS虚拟机里跑的Minikube,如果Docker的数据目录在根分区,时间久了会碰到磁盘满的告警。我自己的做法是提前给Docker换个数据目录,避免根分区被撑爆。

在/etc/docker/daemon.json里加一行:

{ "data-root": "/data/docker" }

然后重启Docker。注意,这会清空原有的镜像和容器数据,所以最好在安装Minikube之前就配好。如果你已经装了Minikube,迁移数据目录需要先导出再导入,过程比较折腾。

另外,宿主机层面的磁盘扩容也会用到。如果你用的是虚拟机,在虚拟化平台给磁盘加容量后,进系统执行:

sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1

分区设备名和编号要看lsblk的实际输出,别直接照抄。

5.4 停止、重启与删除集群

实验环境用的最频繁的几个命令:

# 暂停集群,保留数据 minikube stop # 重启集群 minikube start # 彻底删除集群 minikube delete

这里有个容易混淆的点:minikube stop只是暂停VM里的容器和进程,数据还在,再次start会比首次启动快很多;minikube delete则会把整个K8s环境和数据全部销毁,相当于重置。

我日常的开发流程是:白天跑实验,晚上minikube stop,第二天minikube start继续。这样既节省系统资源,又不用反复重建环境。

5.5 设置默认镜像源的持久化

前面提过--image-mirror-registry参数,但每次启动都要手输很麻烦。Minikube支持把参数写入配置文件:

minikube config set image-mirror-registry registry.cn-hangzhou.aliyuncs.com/google_containers minikube config set cpus 4 minikube config set memory 6144 minikube config set driver docker

配置之后,以后直接执行minikube start就能沿用这些设置。用minikube config view可以查看当前配置。

6. 个人踩坑总结与生产环境的迁移建议

最后聊一点我在实际使用中的体会。

Minikube作为本地开发和学习工具,它的定位非常精准——让你用最少的时间成本拥有一个功能完整的K8s集群。但它也仅仅是本地工具。如果你在生产环境有类似需求,我建议不要直接用Minikube,而是参考它的一些设计思路。

第一个体会是,环境预判比安装本身更重要。我在CentOS 7.9上遇到的问题,90%都发生在Docker驱动和内核cgroup的配合上。只要把Docker的cgroup驱动统一成systemd、把内核转发打开、把SELinux调成permissive,剩下的事情基本是水到渠成。很多教程都在讲怎么敲命令,却没人告诉你为什么要这么敲,结果就是你照着做能跑,一旦报错还是不会解决。希望这篇文章把"为什么"的部分补全了。

第二个体会是,镜像源配置应该前置。不要在启动卡住之后再想镜像源的问题,而是在第一次minikube start之前就把minikube config set image-mirror-registry配好。这一步能帮你规避掉一半以上的网络类报错。如果你在的公司网络环境本身就访问不了谷歌的存储服务,那镜像源配置就是你的必需品,不是可选项。

第三个体会是,不要贪新版本。Docker和Minikube的版本迭代都很快,但Kubernetes的稳定性需要时间验证。我在多个版本组合里测试过,比较稳的组合是Docker 24.x + Minikube 1.32.x + Kubernetes 1.28.x。没有必要追最新,一个经过验证的稳定组合,半年内都够你用了。

如果你后续要把环境从虚拟机迁到真实服务器,或者从单机K8s迁到多节点集群,安装Minikube时期积累的K8s概念和基础命令都是通用的。掌握好这套工具链,后面玩kubeadm或者托管的K8s服务都会轻松很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询