主题
Rocky Linux 9.8 RKE2 节点内核优化一键脚本(init_kernel.sh)
适用于 Rocky Linux 9.8 的 RKE2 + Calico 节点初始化:依赖安装、防火墙清理、内核模块、NetworkManager 适配、sysctl 调优、资源限制,一键完成后重启即可安装 RKE2。
功能清单
| 步骤 | 内容 |
|---|---|
| 0 | 安装 ipvsadm/ipset/iptables-services 依赖;禁用 iptables.service 并清除默认兜底 REJECT 规则 |
| 1 | 永久关闭 Swap(swapoff + 注释 fstab) |
| 2 | 加载并开机自启内核模块:overlay、br_netfilter、ip_vs 系列、tcp_bbr 等 |
| 3 | NetworkManager 忽略 kube-ipvs0/cali*/tunl*/vxlan.calico 虚拟网卡 |
| 4 | SELinux 设为 permissive |
| 5 | sysctl 调优:转发、conntrack、TCP 队列、BBR、文件句柄、panic 自动重启 |
| 6 | 系统 nofile 限制提升至 1048576 |
| 7 | SSD 调度器 mq-deadline、关闭透明大页 |
| 8 | 关键参数校验输出 |
使用方法
bash
# 物理路径:/u02/repo/rocky/9.8/init_kernel.sh
bash /u02/repo/rocky/9.8/init_kernel.sh
reboot # 执行后重启节点生效变更记录(2026-07-30,依据真实故障案例修正)
- 禁用
iptables.service:旧版脚本会enable + start iptables,其默认规则(/etc/sysconfig/iptables)在INPUT/FORWARD链末尾追加REJECT --reject-with icmp-host-prohibited,阻断 etcd 2379/2380、API 6443、supervisor 9345、CNI 等集群端口,曾导致: - NetworkManager unmanaged 列表新增
kube-ipvs0:kube-proxy IPVS 模式下 ClusterIP 绑定在该 dummy 接口上,被 NM 接管可能出现接口 DOWN。 - 校验输出改为断言式:iptables 服务应为
disabled/inactive、兜底 REJECT 规则应为 0 条。
完整脚本
bash
#!/bin/bash
# ==============================================================
# Rocky Linux 9.8 RKE2 + K8s + Calico 内核优化一键脚本
# 适配系统:Rocky Linux 9.8 (el9)
# 优化场景:生产环境K8s高并发、网络转发、Calico稳定运行
# 新增:自动安装 ipvs/iptables 依赖、规避系统默认缺失问题
# 修正:禁用 iptables.service(默认 REJECT 规则会阻断集群端口,故障案例:
# Pod 无法访问 ClusterIP no route to host / 节点加入报 too many learner members)
# 修正:NetworkManager 忽略 kube-ipvs0(IPVS 模式 ClusterIP 所在 dummy 接口)
# ==============================================================
set -e
echo -e "\033[32m【开始执行 RKE2+Calico 系统内核优化】\033[0m"
# 0. 自动检测并安装 IPVS、iptables 必备依赖(Rocky9 默认精简,需手动补装)
echo -e "\033[34m0. 检测并安装 IPVS/iptables 依赖组件\033[0m"
# 安装 ipvs 管理工具、内核模块依赖
dnf install -y ipvsadm ipset iptables-services >/dev/null 2>&1
# 屏蔽 firewalld,兼容 iptables 规则
#systemctl stop firewalld >/dev/null 2>&1
#systemctl disable firewalld >/dev/null 2>&1
# ⚠️ 禁止启用 iptables.service:其默认规则(/etc/sysconfig/iptables)会在
# INPUT/FORWARD 链末尾追加 REJECT --reject-with icmp-host-prohibited,
# 阻断 etcd 2379/2380、API 6443、supervisor 9345、CNI 等集群端口,
# 导致节点无法加入集群、Pod 无法访问 ClusterIP(no route to host)
systemctl disable --now iptables >/dev/null 2>&1 || true
systemctl disable --now ip6tables >/dev/null 2>&1 || true
# 清除可能已加载的默认兜底 REJECT 规则(幂等,规则不存在则忽略)
iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited 2>/dev/null || true
iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited 2>/dev/null || true
ip6tables -D INPUT -j REJECT --reject-with icmp6-adm-prohibited 2>/dev/null || true
ip6tables -D FORWARD -j REJECT --reject-with icmp6-adm-prohibited 2>/dev/null || true
# 1. 永久关闭 Swap
echo -e "\033[34m1. 关闭Swap分区\033[0m"
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 2. 加载K8s/Calico必需内核模块并开机自启
echo -e "\033[34m2. 加载内核转发、IPVS、网桥模块\033[0m"
cat > /etc/modules-load.d/k8s-calico.conf << EOF
overlay
br_netfilter
ip_conntrack
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
tcp_bbr
EOF
# 加载所有模块
modprobe overlay || true
modprobe br_netfilter || true
modprobe ip_conntrack || true
modprobe ip_vs || true
modprobe ip_vs_rr || true
modprobe ip_vs_wrr || true
modprobe ip_vs_sh || true
modprobe tcp_bbr || true
# 3. 禁止NetworkManager管理Calico/IPVS虚拟网卡(解决网络漂移问题)
echo -e "\033[34m3. 适配Calico/IPVS网卡,禁止NetworkManager接管\033[0m"
# kube-ipvs0:kube-proxy IPVS 模式绑定 ClusterIP 的 dummy 接口,被NM接管可能变 DOWN
cat > /etc/NetworkManager/conf.d/calico.conf << EOF
[keyfile]
unmanaged-devices=interface-name:kube-ipvs0;interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
EOF
systemctl restart NetworkManager
# 4. 配置SELinux为宽容模式(生产稳定适配)
echo -e "\033[34m4. 配置SELinux宽容模式\033[0m"
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 5. 全局内核sysctl优化(适配高并发K8s+Calico)
echo -e "\033[34m5. 写入内核优化参数\033[0m"
cat > /etc/sysctl.d/99-rke2-calico-optimize.conf << EOF
# 容器网络转发基础必备
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
# 内存优化,禁用swap倾向
vm.swappiness = 0
vm.overcommit_memory = 1
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
# 高并发文件句柄限制
fs.file-max = 2097152
fs.nr_open = 1048576
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 8192
# 连接跟踪优化,解决conntrack满丢包
net.netfilter.nf_conntrack_max = 2621440
net.netfilter.nf_conntrack_buckets = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
# TCP网络吞吐、队列优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_mtu_probing = 1
# BBR网络加速
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 内核崩溃自动重启
kernel.panic = 10
kernel.panic_on_oops = 1
kernel.sched_autogroup_enabled = 0
EOF
# 生效所有内核参数
sysctl --system
# 6. 系统资源限制优化(nofile最大文件句柄)
echo -e "\033[34m6. 配置系统最大文件句柄限制\033[0m"
sed -i '/^.*nofile/d' /etc/security/limits.conf
cat >> /etc/security/limits.conf << EOF
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
EOF
# 7. SSD磁盘调度优化、关闭透明大页
echo -e "\033[34m7. 磁盘IO调度优化\033[0m"
# 设置SSD调度器为mq-deadline
echo mq-deadline | tee /sys/block/sda/queue/scheduler >/dev/null 2>&1 || true
# 关闭透明大页,规避高负载抖动
echo never | tee /sys/kernel/mm/transparent_hugepage/enabled >/dev/null 2>&1 || true
# 8. 验证关键配置
echo -e "\033[32m【优化完成,关键参数校验】\033[0m"
echo "IP转发状态:$(sysctl -n net.ipv4.ip_forward)"
echo "网桥iptables转发:$(sysctl -n net.bridge.bridge-nf-call-iptables)"
echo "BBR拥塞控制:$(sysctl -n net.ipv4.tcp_congestion_control)"
echo "Conntrack最大值:$(sysctl -n net.netfilter.nf_conntrack_max)"
echo "Swap使用状态:$(free -h | grep Swap)"
echo "IPVS模块状态:$(lsmod | grep ip_vs | wc -l) 模块已加载"
echo "iptables服务状态:$(systemctl is-enabled iptables 2>/dev/null)/$(systemctl is-active iptables)(应为 disabled/inactive)"
echo "兜底REJECT规则:$(iptables -L INPUT -n | grep -c 'icmp-host-prohibited') 条(应为 0)"
echo -e "\033[32m==============================================\033[0m"
echo -e "\033[32m 优化全部完成!请执行 reboot 重启节点生效 \033[0m"
echo -e "\033[32m==============================================\033[0m"注意事项
- 脚本应在安装 RKE2 之前执行;已在运行的节点上执行会重启 NetworkManager 并重载 sysctl,请评估影响。
- 保留安装
iptables-services包是为了提供iptables/ipvsadm/ipset工具(kube-proxy IPVS 模式与 Calico 需要),有问题的只是该服务开机加载的默认 REJECT 规则,因此脚本只禁用服务、不卸载包。 - 多 server 节点扩容时务必逐个加入(一个 Ready 且 etcd learner 提升完成后再加下一个)。