搭建 Kubernetes 集群,尤其是基于三台 CentOS 9 节点的部署方案,整体思路其实非常明确:先统一系统环境,再按步骤完成安装配置,最后验证集群网络与服务连通性。实际操作中,所有节点都需要先完成基础清理与初始化——依次关闭 SELinux、停用防火墙、禁用 Swap,同时配置好主机名与 hosts 解析,并加载 br_netfilter 内核模块。随后安装 containerd,以及 kubeadm、kubelet、kubectl 等 Kubernetes 核心组件。环境准备完成后,由 master 节点执行集群初始化,worker 节点依次加入集群,最后部署 Flannel 网络插件,并通过 nginx 进行完整链路测试,这样一套 Kubernetes 服务器搭建与配置流程就算完成了。

使用三台 CentOS 9 服务器部署 Kubernetes 集群,关键步骤就是“统一环境、分步安装、最终验证连通性”。不建议省略任何前置检查,尤其是时间同步、主机名设置以及网络解析配置——这些看起来基础,但往往正是导致 kubeadm init 初始化失败的高频原因,也是 Kubernetes 集群搭建过程中最容易被忽视的细节。
所有节点必须完成的基础配置
这一步需要在 master 节点和两个 worker 节点上全部执行,而且推荐严格按照顺序操作:
- 关闭 SELinux:先运行
setenforce 0让配置临时生效,再修改配置文件/etc/selinux/config,将SELINUX=enforcing调整为SELINUX=permissive - 停用防火墙:执行
systemctl stop firewalld && systemctl disable firewalld。这是因为 Kubernetes 网络插件(例如 Flannel)依赖底层 iptables 规则,firewalld 往往会造成网络通信干扰 - 禁用 Swap:先执行
swapoff -a,然后编辑/etc/fstab,把包含swap的行前面加上#注释掉,避免系统重启后再次启用 - 设置主机名 + hosts 解析:例如 master 节点执行
hostnamectl set-hostname k8s-master --static;接着在所有节点的/etc/hosts中统一添加:
192.168.1.10 k8s-master
192.168.1.11 k8s-node1
192.168.1.12 k8s-node2 - 加载内核模块并启用桥接流量:创建
/etc/modules-load.d/k8s.conf,写入br_netfilter;然后执行:echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptablesecho '1' > /proc/sys/net/bridge/bridge-nf-call-ip6tables
安装容器运行时(推荐 containerd)
当前 Kubernetes 已不再推荐 Docker 作为默认运行时,直接安装 containerd 往往更稳定,资源占用也更低,更适合生产环境和学习环境中的 Kubernetes 安装部署:
- 执行
yum install -y containerd.io - 生成默认配置:
containerd config default | sudo tee /etc/containerd/config.toml - 替换 pause 镜像源为阿里云地址(降低镜像拉取失败概率):
sed -i 's|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml - 启动并设为开机自启:
systemctl enable --now containerd
安装 kubeadm、kubelet、kubectl
建议使用阿里云 Kubernetes yum 源进行安装,能够有效减少因网络访问问题导致的软件包下载失败或安装卡顿:
- 备份原 repo:
mkdir /etc/yum.repos.d/backup && mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/ - 下载新源:
curl -o /etc/yum.repos.d/kubernetes.repo https://mirrors.aliyun.com/kubernetes/clouds/kubernetes-el8.repo - 安装组件:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes - 启用 kubelet:
systemctl enable --now kubelet(此时出现报错是正常现象,因为它正在等待集群初始化完成)
初始化集群并加入节点
在 master 节点执行初始化命令时,需要提前规划 Pod 网段和 Service 网段,以免与现有内网地址发生冲突,这也是 Kubernetes 集群配置中的关键步骤:
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.30.0(版本号建议以当前可用的稳定版本为准)- 初始化成功后,根据终端提示配置
~/.kube/config,这样才能正常使用kubectl管理集群 - 在两个 worker 节点上,复制并执行 master 输出的
kubeadm join …命令,将节点加入 Kubernetes 集群 - 等待几分钟后,在 master 节点运行
kubectl get nodes,当节点状态显示为Ready,说明节点已经成功接入 - 部署 Flannel 网络插件:
kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.24.2/kube-flannel.yml
验证集群是否可用
不要只停留在 kubectl get nodes 的结果上,最好实际创建并访问一个 Pod,这样才能确认 Kubernetes 集群网络、调度和服务发现功能是否真正可用:
- 部署一个测试 nginx:
kubectl create deployment nginx-test --image=nginx - 暴露为 ClusterIP 服务:
kubectl expose deployment nginx-test --port=80 --type=ClusterIP - 进入任一节点,使用
curl访问该服务的 ClusterIP(可通过kubectl get svc查询) - 如果能够返回 nginx 欢迎页,就说明控制面、容器网络和调度能力都已经正常工作,Kubernetes 集群搭建成功
