上周有个朋友在群里问了一句:“CentOS 7 上到底能不能顺利把 k8s 装起来?我按网上的教程折腾了两天,不是这里报错就是那里起不来。”这个问题其实特别典型,我这些年帮别人排查 Kubernetes 安装问题,遇到最多的就是 CentOS 7 环境。你说它老吧,生产环境里还有一大堆跑着;你说它新吧,很多新版本的 kubeadm 和容器运行时在 7 上确实会遇到各种兼容性坑。
所以今天这篇实操记录,就是专门针对 CentOS 7 安装 Kubernetes 集群的完整过程。我会把每一步的关键原理讲清楚,为什么这么做、不这么做会踩什么坑,全部摊开来说。无论你是刚开始学 k8s 编排的新手,还是要给公司搭内部测试环境的老手,这篇文章都能让你少走很多弯路。毕竟 k8s 集群搭建不是照抄命令就行,底层很多概念搞清楚了,后面上了生产才不慌。
1. 装之前必须想清楚的事
1.1 为什么 CentOS 7 仍然值得用
我知道很多人会说 CentOS 7 已经停止维护了,为什么还要写它。但现实是,目前大量服务器、虚拟机模板、物理机还是 CentOS 7.9 的系统,尤其是企业内部的老资产,短期内根本换不掉。另外 CentOS 7 的 glibc 版本是 2.17,很多软件在这上面编译和运行都没问题,社区里大量教程也都是基于 7 的。
关键点在于:Kubernetes 官方在 v1.27 版本之前,依然为 CentOS 7 / RHEL 7 提供完善的 RPM 包支持。这意味你完全可以用 yum 安装 kubeadm、kubelet、kubectl,不需要从源码编译。哪怕是已经发布的 v1.28、v1.29,也仍然可以使用,只要容器运行时和内核参数满足要求。
不过要提前说清楚,CentOS 7 默认的内核是 3.10.0,这个版本跑高版本 Kubernetes 确实有些老。如果你的场景对网络性能、存储性能要求比较高,装好集群后最好考虑升级内核到 5.4 或 5.15 LTS 版本,或者干脆用 Rocky Linux 9 / Ubuntu 22.04。但如果只是学习、测试、跑些轻量应用,默认内核完全够用。
1.2 k8s 和 Docker 到底是什么关系
很多刚接触的人会把 Kubernetes 和 Docker 搞混,觉得装了 Docker 就等于有了容器平台。这里先说清楚:Docker 只是容器运行时的一种实现,负责把容器跑起来;Kubernetes 是容器编排平台,负责管理一大堆容器——它们之间是管理和被管理的关系。
具体到部署架构上:kubelet 需要调用容器运行时来创建、停止容器,早期的 kubelet 直接通过 Docker 的 API 来工作。后来 Kubernetes 推出了 CRI(Container Runtime Interface),kubelet 只认 CRI 接口。Docker 自己实现了 CRI 的适配层 dockershim,但在 v1.24 版本之后,dockershim 被正式移除了。所以你如果现在装新版本的 k8s,继续用 Docker 做运行时就需要额外装一个 cri-dockerd 来兼容,或者干脆用 containerd。
这里我建议直接用 containerd,理由后面会详细讲。简单说就是:更少的中间层、更稳定的兼容性、更少的资源占用。
1.3 三种部署方式怎么选
Kubernetes 的部署方式主要就三种:Minikube、kubeadm、二进制部署。
- Minikube 适合单机学习,它会在你的电脑上启动一个虚拟机或者容器来模拟集群。优点是快、简单,但生产环境用不上。
- kubeadm 是官方推荐的集群部署工具,也是本文采用的方式。它在每个节点上通过 RPM 包安装必要的组件,然后用一条命令初始化控制平面。优点是标准化、可重复性强、证书和配置文件都是自动生成的。
- 二进制部署 是完全手动下载各个组件二进制文件,自己用 systemd 管理进程。这种方式最透明,最可控,但步骤繁琐,配置文件要自己写,适合对 Kubernetes 架构有深度理解的人。
如果你是第一次装 k8s,我建议直接学 kubeadm 方式。因为这套流程是官方维护的,出错概率比二进制手动部署低很多,而且装完的集群结构清晰,后面想升级、扩容都有现成的指令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置检查
2.1 最小化安装后的主机规划
这里假设你有至少两台 CentOS 7.9 的机器(虚拟机也行),一台作为控制平面节点,一台作为工作节点。如果你只有一台机器,也可以把控制平面和工作节点合在一起,但至少需要 2 核 CPU 和 2GB 内存,否则后面启动系统组件会非常吃力。
我先说下这次安装时用的主机规划,方便你对照操作。
| 主机名 | IP 地址 | 角色 | 配置 |
|---|---|---|---|
| k8s-master | 192.168.56.101 | 控制平面节点 | 4 核 / 4GB |
| k8s-node01 | 192.168.56.102 | 工作节点 | 4 核 / 4GB |
注意一点:规划时尽量不要让控制平面和工作节点使用同一个 IP,否则后面安装网络插件、查看节点状态的时候会出现很多无关干扰。所有节点的时区、时间要同步,这个千万别忽略。k8s 集群对时间偏移很敏感,如果节点间时间差超过 5 秒,证书校验就会失败,kubelet 会一直报错。
2.2 节点初始化必做项
拿到一台新装的 CentOS 7,不要急着一上来就装 k8s 组件,先完成下面这些环境初始化,每一步都写好理由,免得你踩坑以后才知道为什么。
第一,关闭防火墙。CentOS 7 默认开的是 firewalld,如果你不关,kube-proxy 的 NodePort 模式、Calico 的 BGP 通信都会受到干扰。虽然可以在防火墙里放行端口,但我实际操作下来的经验是:测试环境直接关掉最省心。生产环境另说,需要按最小化原则放行端口。
bash复制systemctl stop firewalld
systemctl disable firewalld
第二,关闭 SELinux。这个不关,系统会连挂载目录都搞不定,容器创建时总会出现权限相关的诡异报错。
bash复制setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
第三,关闭 sw
