Kubernetes 集群初始化前的检测与准备脚本,
这个脚本会一步步检查并配置常见的前置条件,确保执行 kubeadm init 之前环境没坑。
一、实现功能
检测系统版本(CentOS/Ubuntu)
关闭 SELinux
关闭 swap
加载 IPVS 模块
配置 sysctl 网络参数
设置时区 & NTP 同步
检测 CRI socket 是否存在
检测端口占用情况(6443、10250 等)
检测 kubeadm/kubelet/kubectl 是否安装
检测镜像仓库可访问性
输出最终检查结果
二、完整脚本(k8s-precheck.sh)
#!/bin/bash
# K8S Cluster Preflight Check & Preparation Script
# Author: tigerhhzz
# Date: 2025-08-11
set -e
echo "=============================="
echo " Kubernetes Preflight Checker "
echo "=============================="
# 1. 检测系统信息
echo "[1/11] 检测系统版本..."
if [ -f /etc/os-release ]; then
cat /etc/os-release
else
echo "无法检测系统版本,退出"
exit 1
fi
# 2. 关闭 SELinux
echo "[2/11] 禁用 SELinux..."
if command -v setenforce &>/dev/null; then
setenforce 0 || true
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
echo "SELinux 已禁用"
else
echo "未检测到 SELinux"
fi
# 3. 关闭 swap
echo "[3/11] 关闭 swap..."
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
echo "swap 已关闭"
# 4. 加载 IPVS 模块
echo "[4/11] 配置 IPVS..."
cat >/etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
echo "IPVS 模块已加载"
# 5. 配置 sysctl 网络参数
echo "[5/11] 配置 sysctl..."
cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
modprobe br_netfilter
sysctl --system >/dev/null
echo "sysctl 配置已完成"
# 6. 设置时区 & NTP
echo "[6/11] 配置时区与 NTP..."
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
if command -v chronyd &>/dev/null; then
systemctl enable chronyd --now
chronyc -a makestep
elif command -v ntpd &>/dev/null; then
systemctl enable ntpd --now
else
echo "未检测到 chrony 或 ntpd,请手动安装"
fi
# 7. 检测 CRI socket
echo "[7/11] 检测 CRI socket..."
if [ -S /var/run/cri-dockerd.sock ]; then
echo "检测到 cri-dockerd.sock"
elif [ -S /var/run/containerd/containerd.sock ]; then
echo "检测到 containerd.sock"
else
echo "未检测到可用的 CRI socket,请安装 Docker/Containerd/CRI-Dockerd"
fi
# 8. 检测端口占用
echo "[8/11] 检测常用端口占用..."
PORTS=(6443 10250 10257 10259 2379 2380)
for port in "${PORTS[@]}"; do
if ss -lnt | grep -q ":$port"; then
echo "❌ 端口 $port 已被占用"
else
echo "✅ 端口 $port 可用"
fi
done
# 9. 检测 Kubernetes 工具
echo "[9/11] 检测 kubeadm/kubelet/kubectl..."
if command -v kubeadm &>/dev/null; then
echo "✅ kubeadm 已安装,版本: $(kubeadm version -o short 2>/dev/null || kubeadm version)"
else
echo "❌ kubeadm 未安装"
fi
if command -v kubelet &>/dev/null; then
echo "✅ kubelet 已安装,版本: $(kubelet --version 2>/dev/null)"
else
echo "❌ kubelet 未安装"
fi
if command -v kubectl &>/dev/null; then
echo "✅ kubectl 已安装,版本: $(kubectl version --client=true -o short 2>/dev/null || kubectl version --client=true)"
else
echo "❌ kubectl 未安装"
fi
# 10. 检测镜像仓库(带自动切换)
echo "[10/11] 检测镜像仓库可访问性..."
PRIMARY_REPO="registry.aliyuncs.com/google_containers"
FALLBACK_REPO="k8s.m.daocloud.io"
if curl -s --connect-timeout 5 https://$PRIMARY_REPO &>/dev/null; then
echo "✅ 镜像仓库 $PRIMARY_REPO 可访问"
IMAGE_REPO=$PRIMARY_REPO
elif curl -s --connect-timeout 5 https://$FALLBACK_REPO &>/dev/null; then
echo "⚠️ 阿里云镜像不可达,切换到 $FALLBACK_REPO"
IMAGE_REPO=$FALLBACK_REPO
else
echo "❌ 无法访问任何镜像仓库,请检查网络"
IMAGE_REPO=""
fi
# 11. 总结
echo "[11/11] 检查完成,请根据上方结果修复问题后再执行 kubeadm init"
echo "=============================="
echo " K8S Preflight Check Finished "
echo "=============================="
三、使用方法和验证
保存脚本为 k8s-precheck.sh
给执行权限:
chmod +x k8s-precheck.sh
执行:
./k8s-precheck.sh
这样一键就能把环境准备好,然后直接初始化集群。
“人的一生会经历很多痛苦,但回头想想,都是传奇”。