📖 前言
随着 CentOS 7 即将停止维护,越来越多的企业和开发者开始将基础设施迁移至 Rocky Linux 9。作为 RHEL 的下游发行版,Rocky 9 内核更新,但也带来了一些与旧版不同的配置习惯(如 cgroup v2、防火墙管理等)。
本文将详细演示如何在 国内网络环境 下,基于 Rocky Linux 9,使用 Kubeadm + Containerd 搭建一套标准的 Kubernetes (v1.34+) 集群。
🏗️1. 环境规划
节点信息
软件版本
Kubernetes: v1.34.x (可根据需求调整)
Container Runtime: containerd
CRI Driver: systemd (Rocky 9 标配 cgroup v2,必须使用 systemd)
镜像源: 阿里云 (Aliyun)
🛠️2. 系统初始化 (所有节点)
注意:本章节操作需在 Master 和 Worker 节点上同时执行。
2.1 基础设置与防坑包安装
Rocky 9 最小化安装时可能缺失流量控制工具,会导致 Kubeadm 预检查失败,务必先行安装。
# 1. 设置主机名 (根据节点角色修改,例如 master 或 worker)
# hostnamectl set-hostname k8s-master
# 2. 安装流量控制工具 (Rocky 9 关键避坑点)
dnf install -y iproute-tc
# 3. 关闭防火墙 (测试环境建议关闭)
systemctl stop firewalld && systemctl disable firewalld
# 4. 设置 SELinux 为宽容模式
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 5. 关闭 Swap (K8s 强制要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab2.2 配置内核模块与网络参数
开启桥接流量监控,确保 Pod 网络互通。
# 加载必要的内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 设置 sysctl 参数
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用配置
sysctl --system🐳3. 安装容器运行时 Containerd (所有节点)
Kubernetes 1.24+ 移除了 DockerShim,我们将直接使用 Containerd。
3.1 安装 Containerd
我们利用 Docker CE 的官方源来获取最新的 Containerd。
# 安装 yum-utils
dnf install -y yum-utils
# 添加 Docker 阿里云源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd
dnf install -y containerd.io
# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml3.2 配置 Systemd Cgroup (关键步骤)
Rocky 9 默认使用 cgroup v2,如果 Containerd 使用 cgroupfs 驱动会导致 kubelet 启动失败。必须修改为 SystemdCgroup = true。
# 使用 sed 命令一键修改
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启并开机自启
systemctl restart containerd
systemctl enable containerd📦4. 安装 Kubeadm 工具 (所有节点)
配置 Kubernetes 的阿里云 Yum 源。虽然源路径中包含 el7,但在 Rocky 9 (el9) 上依然兼容可用。
# 1. 添加 K8s 阿里云源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 2. 安装 kubeadm, kubelet, kubectl
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 3. 设置开机自启 (此时 kubelet 会因未初始化而循环重启,属正常现象)
systemctl enable --now kubelet🚀5. 初始化 Master 节点 (仅 Master)
在 k8s-master 节点执行初始化。
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.233.64.0/18 \
--service-cidr=10.233.128.0/18 \
--kubernetes-version=v1.34.4 \
--v=5--image-repository: 指定阿里云镜像,解决registry.k8s.io无法访问的问题。--pod-network-cidr: 设置 Pod 网段,这里Calico需要配合修改为10.233.64.0/18。
初始化成功后,终端会输出后续操作指南,请执行以下命令配置 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config⚠️ 重要:请复制终端末尾输出的 kubeadm join ... 命令,稍后用于 Worker 节点加入。
🌐6. 安装网络插件 (仅 Master)
我们选择经典的 Calico 网络插件。
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# vim calico.yaml 修改pod网段为10.233.64.0/18
kubectl apply -f calico.yaml等待几分钟,查看节点状态:
kubectl get nodes当 STATUS 变为 Ready 时,表示 Master 节点部署成功。
🤝7. 加入 Worker 节点 (仅 Worker)
登录到 k8s-worker 节点,执行第 5 步保存的加入命令:
kubeadm join <Master-IP>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>回到 Master 节点确认:
kubectl get nodes看到所有节点均为 Ready 状态,集群即搭建完毕!🎉
🔍常见问题排查 (Troubleshooting)
报错:
/proc/sys/net/bridge/bridge-nf-call-iptables does not exist
原因:未加载
br_netfilter模块。解决:执行
modprobe br_netfilter。
报错:
FileContent--proc-sys-net-ipv4-ip_forward
原因:未开启 IP 转发。
解决:检查 sysctl 配置中
net.ipv4.ip_forward = 1是否生效。
Kubelet 启动失败,日志提示
server: no such file or directory
原因:通常是 Containerd 的 Cgroup 驱动配置错误。
解决:检查
/etc/containerd/config.toml中是否设置了SystemdCgroup = true。
Rocky 9 特有:找不到
tc命令
解决:执行
dnf install -y iproute-tc。
💡附录:如何重新获取 kubeadm join 命令(Token 与 Hash)
如果你不小心关闭了终端,或者 Token 已经过期(默认有效期 24 小时),可以通过以下两种方式重新获取加入节点的命令。
1. ⚡️ 方法一:一键生成(推荐)
这是最简单、最快捷的方法。直接在 Master 节点 上执行以下命令,它会创建一个新的 Token 并自动计算 CA 证书的 Hash,最后输出完整的加入命令:
kubeadm token create --print-join-command输出示例:
kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:5c4b1...直接复制输出的这行命令,在 Worker 节点执行即可。
2. 🛠 方法二:分步获取(手动拼接)
如果你只想查看现有的 Token 或手动计算 Hash,可以使用以下步骤。
步骤 A:获取有效 Token
在 Master 节点 查看当前有效的 Token 列表:
kubeadm token list如果列表为空或 Token 已过期,创建一个新的:
kubeadm token create(记下输出的 Token,例如 abcdef.0123456789abcdef)
步骤 B:获取 CA 证书 Hash
在 Master 节点 执行以下命令来计算 Hash 值:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'输出示例:
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78步骤 C:拼接命令
将上面获取的信息填入模板:
kubeadm join <Master-IP>:6443 \
--token <步骤A获取的Token> \
--discovery-token-ca-cert-hash sha256:<步骤B获取的Hash>📝 小知识:Token 有效期
默认机制:出于安全考虑,
kubeadm生成的 Token 默认有效期为 24 小时。
创建永久 Token(仅建议在测试环境使用):
kubeadm token create --ttl 0 --print-join-command--ttl 0 表示永不过期。