kubeadm init前必须完成四件事:关闭swap并注释fstab中swap行、禁用firewalld并清空iptables所有表、关闭selinux至disabled模式、配置唯一hostname及/etc/hosts全节点解析,缺一将导致preflight卡死或初始化失败。

kubeadm init 之前必须做完这四件事,缺一不可,否则初始化会卡在 preflight 或直接失败。
关闭 swap 和修改 /etc/fstab
Linux 内核在启用 swap 的情况下,kubelet 会拒绝启动 —— 这不是警告,是硬性拒绝。执行 swapoff -a 只是临时关闭,重启后恢复。真正要改的是 /etc/fstab:
- 用
sed -i '/swap/s/^/#/' /etc/fstab注释掉所有含 swap 的行(比正则匹配.*swap.*更安全,避免误注释路径含 swap 字符的挂载项) - 确认无残留:运行
swapon --show应无输出;free -h中 swap 行显示为 0B - 某些国产发行版(如 openEuler)默认启用 zram,也要检查
systemctl status zram-generator并禁用
禁用 firewalld + 清空 iptables 规则
Kubernetes 网络模型依赖 CNI 插件直接操作 iptables,firewalld 或残留规则会干扰 kube-proxy 工作,导致 Service 不通、Pod 间无法通信。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 停用并禁启:
systemctl disable --now firewalld - 清空所有链:
iptables -t nat -F && iptables -t filter -F && iptables -t mangle -F && iptables -X - 注意:不要只清
filter表,nat表里残留的 DNAT/SNAT 规则会导致 kube-proxy 同步失败,现象是kubectl get svc显示 ClusterIP 但curl超时
关闭 SELinux 并设为 permissive 模式
SELinux 在 enforcing 模式下会拦截 kubelet 对 cgroup、proc、sysfs 的访问,常见报错是 permission denied on /sys/fs/cgroup/cpu,cpuacct/kubepods 或容器启动后立即退出。
- 临时生效:
setenforce 0 - 永久生效:修改
/etc/selinux/config中的SELINUX=disabled(不是permissive,后者仍记录 deny 日志且部分策略仍生效) - 验证:
getenforce输出应为Disabled,而非Permissive
配置主机名与 /etc/hosts 解析
kubeadm 要求节点 hostname 不能是 localhost、master 这类泛域名,且所有节点必须能通过 hostname 互相解析 —— 否则 kubeadm join 会因证书 CN 不匹配或连接超时失败。
- 设置唯一 hostname:
hostnamectl set-hostname k8s-master-01(建议带序号,便于后续扩容) - 在
/etc/hosts中添加本机解析:127.0.0.1 k8s-master-01(必须有,否则 systemd-resolved 可能干扰) - 跨节点解析:所有节点的
/etc/hosts都要包含集群内全部节点 IP+hostname 映射,例如:192.168.10.10 k8s-master-01、192.168.10.11 k8s-node-01 - 跳过 DNS 依赖:不推荐依赖内网 DNS,
kubeadm init期间若 DNS 解析慢或失败,会卡在证书生成阶段
这些步骤看着琐碎,但每一条都对应一个真实阻断点。实际部署中,80% 的 kubeadm init 失败都源于其中某一项漏做或没做干净 —— 尤其是 swap 和 hosts 配置,最容易被忽略。










