AI 摘要
使用kubeadm在Rocky 9.6上部署Kubernetes 1.36集群,涵盖环境准备、内核模块与IPVS优化、安装containerd、kubeadm/kubectl/kubelet及nerdctl,拉取镜像后初始化集群,安装flannel或calico网络插件,并完成验证与重置流程。

一、介绍

kubeadm方式可以轻松安装K8s集群。

二、环境准备

2.1 规划

主机名 IP 系统版本 配置 K8S版本 CRI版本
k8s231 192.168.10.231 rocky 9.6 2C4G 1.36.0 2.2.3
k8s232 192.168.10.232 rocky 9.6 2C4G 1.36.0 2.2.3
k8s233 192.168.10.233 rocky 9.6 2C4G 1.36.0 2.2.3

2.2 基础设置

  1. 设置主机名 (分别在各节点执行)
1
2
3
hostnamectl set-hostname k8s231
hostnamectl set-hostname k8s232
hostnamectl set-hostname k8s233
  1. 设置主机名解析
1
2
3
4
5
cat >> /etc/hosts << EOF
192.168.10.231 k8s231
192.168.10.232 k8s232
192.168.10.233 k8s233
EOF

​ 验证

1
2
3
ping -c2 k8s231
ping -c2 k8s232
ping -c2 k8s233
  1. 关闭防火墙和 SELinux
1
2
3
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

​ 验证

1
2
getenforce
systemctl status firewalld
  1. 关闭 Swap 分区

    临时关闭

1
swapoff -a && sysctl -w vm.swappiness=0

​ 基于配置文件的关闭

1
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

​ 验证

1
free -h
  1. 确保各个节点MAC地址或product_uuid唯一
1
2
ip address show ens160 |grep ether |awk '{print $2}'
cat /sys/class/dmi/id/product_uuid

2.3 内核模块与网络优化

  1. 安装 kernel-modules-extra

    ip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrackip_tablesip_set 这些内核模块(.ko 文件)一般是随内核一起编译打包的,正常情况下 modprobe 就能直接加载成功,不需要单独去”装”这些模块。

    在 RHEL/CentOS/Rocky 系列上,IPVS 相关模块被拆到了 kernel-modules-extra 这个包

1
2
3
4
5
# 看包是否已装(以 Rocky/CentOS 为例)
rpm -q kernel-modules-extra

# 没有的话装一下(走你自己的 yum 缓存也行)
yum install -y kernel-modules-extra
  1. 安装用户态工具 kubeadm

    内核模块加载成功,不代表能”管理” IPVSkube-proxy 用 IPVS 模式时,实际上是通过 ipvsadm 这个命令行工具(或者说它背后的 netlink 接口)去操作 IPVS 规则的。这个工具是用户态程序,必须单独安装

    不装的话,kube-proxy 起来后日志里会报找不到 ipvsadm,然后自动降级回 iptables 模式

1
yum install -y ipvsadm ipset
  1. 验证,最后验证也可以.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 方法一:确认模块确实加载了
lsmod | grep -e ip_vs -e nf_conntrack

# 期望看到类似:
# ip_vs_sh 16384 0
# ip_vs_wrr 16384 0
# ip_vs_rr 16384 0
# ip_vs 155648 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
# nf_conntrack 172032 1 ip_vs

# 方法二:直接对着配置文件里的每个模块查
for mod in $(cat /etc/modules-load.d/ipvs.conf); do
lsmod | grep -q "^${mod}" && echo "$mod OK" || echo "$mod MISSING"
done

# 方法三:ipvsadm 工具能正常查询,说明用户态也通了
ipvsadm -Ln
  1. 加载基础内核模块
1
2
3
4
5
6
7
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter
  1. 加载 IPVS 模块 (用于 Service 高性能转发)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipip
EOF

for kernel_module in $(cat /etc/modules-load.d/ipvs.conf); do
/sbin/modprobe $kernel_module
done
  1. 设置 Sysctl 网络参数
1
2
3
4
5
6
7
8
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
vm.swappiness = 0
EOF

sysctl --system

三、依赖软件

新版本kubenetes底层是containerd。

3.1 安装 CRI

  1. 配置仓库,安装最新版
1
2
dnf install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 显示所有的版本
1
dnf list containerd.io --showduplicates
  1. 安装指定版本(2026年3月1日最新版)
1
dnf install containerd.io-2.2.3 -y

​ 安装最新版本

1
dnf install containerd.io -y
  1. 配置 containerd
1
2
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
  1. 开启 SystemdCgroup (必须,否则 Kubelet 无法启动)
1
2
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
grep SystemdCgroup /etc/containerd/config.toml
  1. 修改沙箱镜像源 (国内加速,否则 init 会卡死)(按需替换)
1
sed -i 's|registry.k8s.io/pause:3.10.1|registry.aliyuncs.com/google_containers/pause:3.10.1|g' /etc/containerd/config.toml

​ 验证

1
grep registry.k8s.io /etc/containerd/config.toml
  1. 设置开机自启
1
systemctl enable --now containerd
  1. 验证安装 成功
1
ctr version

3.2 安装 kubeadmkubectlkubelet

  1. 配置 yum
1
2
3
4
5
6
7
8
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/repodata/repomd.xml.key
EOF
  1. 查看所有版本
1
dnf list kubelet kubeadm kubectl --showduplicates
  1. 安装指定版本(2026年5月5日最新版)
1
2
KUBE_VERSION=1.36.0
dnf -y install kubeadm-${KUBE_VERSION} kubelet-${KUBE_VERSION} kubectl-${KUBE_VERSION}

​ 安装最新版

1
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  1. 验证
1
kubelet --version
  1. 开机自启
1
systemctl enable --now kubelet

3.3 安装 nerdctl

官方仓库

  1. 下载
1
wget https://github.com/containerd/nerdctl/releases/download/v2.2.2/nerdctl-2.2.2-linux-amd64.tar.gz

​ 加速下载

1
wget https://g.bravexist.cn/https://github.com/containerd/nerdctl/releases/download/v2.2.2/nerdctl-2.2.2-linux-amd64.tar.gz
  1. 解压
1
tar xf nerdctl-2.2.2-linux-amd64.tar.gz -C /usr/local/bin
  1. 命令补全
1
source <(nerdctl completion bash)
  1. 设置别名
1
2
3
vim ~/.bashrc
alias docker='nerdctl -n k8s.io'
source ~/.bashrc

3.4 获取镜像

  1. 获取镜像列表
1
kubeadm config images list --kubernetes-version 1.36.0

​ 国内地址的镜像

1
kubeadm config images list --kubernetes-version 1.36.0 --image-repository registry.aliyuncs.com/google_containers
  1. 获取镜像,要注意命名空间 k8s.io,而不是默认的 default

    master需要全部镜像,

1
2
3
4
5
6
7
registry.k8s.io/kube-apiserver:v1.36.0
registry.k8s.io/kube-controller-manager:v1.36.0
registry.k8s.io/kube-scheduler:v1.36.0
registry.k8s.io/kube-proxy:v1.36.0
registry.k8s.io/coredns/coredns:v1.14.2
registry.k8s.io/pause:3.10.2
registry.k8s.io/etcd:3.6.8-0

​ 国内地址镜像

1
2
3
4
5
6
7
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.36.0
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.36.0
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.36.0
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.36.0
docker pull registry.aliyuncs.com/google_containers/coredns/coredns:v1.14.2
docker pull registry.aliyuncs.com/google_containers/pause:3.10.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.6.8-0
  1. 获取 flannel 镜像,获取指定版本的 yaml 文件。(2026年5月5日最新版)

    官网

1
wget https://github.com/flannel-io/flannel/releases/download/v0.28.4/kube-flannel.yml

​ 加速下载

1
wget https://g.bravexist.cn/https://github.com/flannel-io/flannel/releases/download/v0.28.4/kube-flannel.yml

​ 筛选镜像

1
grep image kube-flannel.yml

​ 拉取镜像

1
2
docker pull ghcr.io/flannel-io/flannel:v0.28.4
docker pull ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel1
  1. 获取 calico 镜像,获取指定版本的 yaml 文件。(2026年3月1日最新版)

    官网

1
2
wget https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/custom-resources.yaml

​ 加速下载

1
2
wget https://g.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/tigera-operator.yaml
wget https://g.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/custom-resources.yaml

​ 修改 custom-resources.yamlcidr,确保它与执行 kubeadm init 时定义的 --pod-network-cidr 完全一致。

1
cidr: 10.244.0.0/16

​ 筛选镜像

1
grep image tigera-operator.yaml

四、正式安装

4.1 初始化配置文件

  1. 生成配置文件
1
kubeadm config print init-defaults > kubeadm.yml
  1. 修改关键配置项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vim kubeadm.yml
advertiseAddress: 192.168.10.231 # 修改ip地址
bindPort: 6443

name: k8s231 # 设置主机名

imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: 1.36.0 # 修改版本
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 # 添加pod的网段

---
# 其实可以不写,新版本默认
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

---
# 启用ipvs模块
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
strictARP: true # ← 顺手把这个也开了,装 MetalLB 的 L2 模式必须要它
  • advertiseAddress
  • name 主节点的名称
  • imageRepository,改为阿里云镜像仓库
  • podSubnet ,追加在 serviceSubnet 的下一行
  • apiVersion,追加这一部分内容,包括 ---

4.2 启动

  1. 启动
1
kubeadm init --config=kubeadm.yml
  1. 添加kubectl的自动补全功能
1
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
  1. 让当前用户可以直接使用 kubectl 管理整个 Kubernetes 集群
1
2
3
4
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
  1. 加入集群
1
2
kubeadm join 192.168.10.231:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2f55dde305d9df5c21b8d560adffd34dc69810d64788460d4fadb40517d4f561

​ 重新获取加入集群的命令

1
2
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

​ 或

1
kubeadm token create --print-join-command

4.3 安装 flannel 插件(二选一)

1
kubectl apply -f kube-flannel.yml

4.4 安装 calico 插件(二选一)

1
2
kubectl apply -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml

4.5 配置错误,重新初始化,重置

  1. 全部 reset
1
2
3
4
5
# worker 先执行
kubeadm reset -f

# master 再执行
kubeadm reset -f
  1. 清理残留(三台都要做,否则重新 init/join 容易冲突)
1
2
3
4
5
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube
rm -rf /etc/kubernetes
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm -C # 如果用了 IPVS 模式
  1. 重新初始化

五、验证

1
kubectl get node

六、文档资料