Administrator
发布于 2025-12-18 / 4 阅读
0
0

【实战】Rocky Linux 9 使用 Kubeadm 快速部署 Kubernetes 集群(国内源+Containerd)

📖 前言

随着 CentOS 7 即将停止维护,越来越多的企业和开发者开始将基础设施迁移至 Rocky Linux 9。作为 RHEL 的下游发行版,Rocky 9 内核更新,但也带来了一些与旧版不同的配置习惯(如 cgroup v2、防火墙管理等)。

本文将详细演示如何在 国内网络环境 下,基于 Rocky Linux 9,使用 Kubeadm + Containerd 搭建一套标准的 Kubernetes (v1.34+) 集群。


🏗️1. 环境规划

节点信息

主机名

角色

操作系统

推荐配置

k8s-master

Control Plane

Rocky Linux 9.x

4核 / 8G内存 / 40G硬盘

k8s-worker1

Worker Node

Rocky Linux 9.x

4核 / 8G内存 / 40G硬盘

软件版本

  • Kubernetes: v1.34.x (可根据需求调整)

  • Container Runtime: containerd

  • CRI Driver: systemd (Rocky 9 标配 cgroup v2,必须使用 systemd)

  • 镜像源: 阿里云 (Aliyun)


🛠️2. 系统初始化 (所有节点)

注意:本章节操作需在 MasterWorker 节点上同时执行。

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/fstab

2.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.toml

3.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)

  1. 报错:/proc/sys/net/bridge/bridge-nf-call-iptables does not exist

  • 原因:未加载 br_netfilter 模块。

  • 解决:执行 modprobe br_netfilter

  1. 报错:FileContent--proc-sys-net-ipv4-ip_forward

  • 原因:未开启 IP 转发。

  • 解决:检查 sysctl 配置中 net.ipv4.ip_forward = 1 是否生效。

  1. Kubelet 启动失败,日志提示 server: no such file or directory

  • 原因:通常是 Containerd 的 Cgroup 驱动配置错误。

  • 解决:检查 /etc/containerd/config.toml 中是否设置了 SystemdCgroup = true

  1. 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 表示永不过期。


评论