用三台 CentOS 9 服务器搭建 Kubernetes 集群的核心是统一环境、分步部署、验证连通:所有节点须依次完成关闭 SELinux、停用防火墙、禁用 Swap、设置主机名与 hosts 解析、加载 br_netfilter 模块、安装 containerd 与 kubeadm/kubelet/kubectl,再由 master 初始化集群、worker 加入,最后部署 Flannel 并用 nginx 测试全链路连通性。
用三台 CentOS 9 服务器搭 Kubernetes 集群,核心是“先统一环境、再分步部署、最后验证连通”。不建议跳过任何前置检查,尤其时间同步、主机名和网络解析——这些看似简单,却是后续 kubeadm init 失败最常见的原因。
这一步在 master 和两个 worker 节点上都要执行,顺序不能乱:
setenforce 0 临时生效,再改配置文件 /etc/selinux/config,把 SELINUX=enforcing 改成 SELINUX=permissive
systemctl stop firewalld && systemctl disable firewalld。Kubernetes 网络插件(如 Flannel)依赖底层 iptables 规则,firewalld 会干扰swapoff -a,再编辑 /etc/fstab,把含 swap 的行前面加 # 注释掉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-iptables
echo '1' > /proc/sys/net/bridge/bridge-nf-call-ip6tables
Kubernetes 已弃用 Docker 作为默认运行时,直接用 containerd 更稳定、更轻量:
yum install -y containerd.io
containerd config default | sudo tee /etc/containerd/config.toml
sed -i 's|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml
systemctl enable --now containerd
使用阿里云 Kubernetes yum 源,避免因网络问题卡住:
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
systemctl enable --now kubelet(此时它会报错等待初始化,属正常)master 节点执行初始化命令,指定 Pod 和 Service 网段,避免与内网冲突:
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 可用kubeadm join … 命令执行加入kubectl get nodes,状态变为 Ready 即表示节点已接入kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.24.2/kube-flannel.yml
别只看 get nodes,要真正跑一个 Pod:
kubectl create deployment nginx-test --image=nginx
kubectl expose deployment nginx-test --port=80 --type=ClusterIP
curl 访问该服务的 ClusterIP(通过 kubectl get svc 查)