CentOS 7 上装 Kubernetes,这活儿我这些年至少干了二十遍。都说 k8s 不好装,其实真正折腾人的不是 k8s 本身,而是版本兼容、网络插件和镜像来源这三件事。这篇内容就是一套我在 CentOS 7 上反复验证过的部署流程,从系统初始化开始,到 kubeadm init、Flannel 网络、工作节点加入,再到用 Nginx 把集群跑通。适合只有一两台机器练手的人,也适合给生产版本选型做预演。整篇按 1.23.17 + Docker 20.10 这套组合来写,因为它在 CentOS 7 上最稳,如果你打算用更新的版本,我会在文里专门讲差异。
1. 动手之前,先把手上的版本调性搞清楚
1.1 CentOS 7 到底适不适合跑 K8s
很多人一听到 CentOS 7 就觉得老,但现实是大量服务器现在还在跑 CentOS 7,而且内核版本虽然只有 3.10,K8s 官方和容器运行时都一直在兼容它。给 CentOS 7 装 K8s,真正要盯住的不是系统本身,而是几个配套组件有没有选择到合适的版本:容器运行时、kubeadm、kubelet、kubectl、CNI 插件,这五样只要有一个版本不匹配,集群就会出现各种“玄学问题”。
我的建议是,只要不是必须上新功能,CentOS 7 上就不要追 K8s 最新版。生产环境里 K8s 1.23 到 1.28 这几个版本都很常见,但 CentOS 7 上最省事的组合往往不是最新版,而是稳定迭代了很久的版本。我这几年在 CentOS 7 上跑 1.23 系列的体验最好,坑基本都被社区踩平了,教程也多,随便搜都能找到对应的解决方案。
1.2 版本组合怎么选:老派 Docker 还是新派 containerd
K8s 和容器运行时之间的关系,我简单类比一下:K8s 是管“集装箱”的调度中心,Docker 或者 containerd 是真正干活的那个“起重机”。K8s 1.24 之前,Docker 是默认的容器运行时,kubelet 会通过 dockershim 直接调用 Docker;从 1.24 开始,dockershim 被移除,K8s 不再直接支持 Docker,底层必须用 containerd、CRI-O 这类符合 CRI 标准的运行时。
所以这里会分出两条路线。路线一:K8s 1.23.17 + Docker 20.10,安装最简单,网上大部分旧教程都能直接用;路线二:K8s 1.28+ + containerd,适合要新特性的人,但配置 containerd 时要注意 systemd cgroup 和 sandbox 镜像地址,细节比第一种更多。这篇完整流程按路线一来讲,末尾我会单独说明 containerd 方案的差异点。千万别拿着 1.23 的文档去装 1.29 的集群,很多参数已经变了。
1.3 节点和网络规划,两台机器怎么分
最少两台机器就能搭一个标准集群:一台作为控制节点,跑控制面组件;一台作为工作节点,跑业务负载。当然,单台也可以,后面我会讲怎么把控制节点的工作负载调度限制去掉。资源方面,控制节点我建议至少 2 核 4G,工作节点至少 2 核 4G,磁盘空余 20G 以上。如果只有 2G 内存,kubeadm init 时经常因为 etcd 或 API Server 内存不足而失败,即使勉强起来,集群也会很脆弱。
网络规划上,要提前定好两个 CIDR:一个是集群内 Pod 的网段,一个是 Service 的网段。这篇文章用 Flannel 做 CNI,所以 Pod 网段用 Flannel 默认的 10.244.0.0/16;Service 网段用 kubeadm 默认的 10.96.0.0/12。这两个网段必须保证和你的物理机、虚拟机局域网网段不冲突,否则路由会出现奇怪的问题。我见过有人把 Pod 网段设成 192.168.0.0/16,结果和家里路由器网段撞车,节点状态反复 Ready 又 NotReady,折腾了一整天才发现是网段打架。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统层面先收拾干净
2.1 关防火墙、swap 和 SELinux
装 K8s 之前,系统初始化这一步我从来不会跳过。首先是防火墙,CentOS 7 默认的 firewalld 在装 K8s 时会挡住很多内部通信,测试环境直接停掉最省事。执行以下命令:
bash复制systemctl stop firewalld
systemctl disable firewalld
然后是 swap,kubelet 默认不允许节点使用 swap,因为 K8s 的内存模型里,内存配额是硬约束,如果 pod 被 swap 悄悄拿去换页,内存 limit 就会失真。因此要把 swap 永久关闭:
bash复制swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
注意 swapoff -a 只是临时生效,重启后会重新挂载 swap,所以必须修改 /etc/fstab,把 swap 那行注释掉。我遇到过不少同学只执行 swapoff,重启后 kubeadm init 直接报错,查半天才发现 swap 又回来了。
最后是 SELinux,这个机制本身是好事,但在 K8s 环境里会让容器挂载目录、访问设备时出现 permission denied,排查起来特别费劲。测试和学习环境我会直接把 SELinux 关掉:
bash复制setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 临时关闭,改配置文件是为了重启后依然关闭。这三步做完,系统的兼容性坑就少了大半。
2.2 内核参数与模块
K8s 的 Pod 网络通信依赖 iptables 处理桥接流量,而 CentOS 7 默认可能没有开启 bridge-nf 相关参数。如果你不提前配置,Flannel 装上后节点之间互相 ping 不通,Pod 通信会时断时续。我习惯准备一个专门的 sysctl 配置:
bash复制cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables
