物理机裸金属环境安装Kubernetes前,必须确保驱动、内核、模块、网络路径四者同时就位;CentOS 7.8为最稳妥基线,但需验证BIOS/网卡固件版本、内核模块(br_netfilter等)、systemd兼容性、网卡驱动、product_uuid/MAC唯一性、swap禁用、SELinux策略及containerd cgroup驱动匹配。

物理机裸金属环境安装 Kubernetes 前,系统兼容性不是“能装就行”,而是“驱动、内核、模块、网络路径”四者必须同时就位;CentOS 7.8 是当前最稳妥的基线,但哪怕同是 CentOS 7.8,不同厂商 BIOS/网卡固件版本也可能导致 kubeadm init 卡在 etcd 启动或 kubelet 无法注册节点。
确认内核版本与 systemd 兼容性
Kubernetes 1.24+ 要求内核 ≥ 3.10.0-957(CentOS 7.6 起满足),但关键不在最低版本,而在内核是否启用必要功能模块。裸金属常见问题是默认内核未编译 br_netfilter 或 ip_vs,导致 kube-proxy 启动失败或 Service 不通。
- 运行
lsmod | grep -E 'br_netfilter|nf_conntrack|ip_vs',缺任一模块需手动加载并持久化(写入/etc/modules-load.d/k8s.conf) -
systemd版本需 ≥ 219(CentOS 7.4+ 默认满足),否则kubelet无法正确管理容器生命周期,表现为systemctl status kubelet显示Failed to start Kubernetes API Server但无具体错误 - 检查
/proc/sys/net/bridge/bridge-nf-call-iptables是否为1,不是则需执行sysctl -w net.bridge.bridge-nf-call-iptables=1并写入/etc/sysctl.d/k8s.conf
网卡驱动与多路径路由冲突
裸金属服务器常配双口万兆网卡(如 Intel X710、Mellanox ConnectX-4),若驱动版本过旧或启用 SR-IOV,kubelet 可能无法绑定正确接口,导致 NodeReady 状态始终为 NotReady,日志中反复出现 failed to get node info: node \"xxx\" not found。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 用
lspci -k | grep -A3 -i ethernet查网卡型号及当前驱动,比对厂商官网支持列表(例如 Dell R740 需 ixgbe 5.12.5+ 才完整支持 RSS + LRO) - 禁用可能干扰的内核参数:在
/etc/default/grub的GRUB_CMDLINE_LINUX中移除intel_iommu=on(除非明确需要 GPU 直通),避免与containerd的 cgroup v2 模式冲突 - 若机器有多个网卡且默认路由不指向集群通信网段,必须显式设置
--node-ip参数:启动kubelet时加--node-ip=192.168.137.129,或在/var/lib/kubelet/config.yaml中配置nodeIP
product_uuid 与 MAC 地址唯一性验证
裸金属环境最容易被忽略的点:同一台物理机重装系统后,/sys/class/dmi/id/product_uuid 不变,但若克隆过磁盘镜像或使用 RAID 卡缓存,多个节点可能读出相同 UUID,导致 kubeadm join 失败并报错 node with name \"node1\" already exists,即使 hostname 不同。
- 逐节点执行
sudo cat /sys/class/dmi/id/product_uuid和ip link show | grep -A1 \"state UP\" | grep ether,确保两者全局唯一 - 若 UUID 冲突(常见于戴尔 iDRAC 自动部署或 HP iLO 模板镜像),需进 BIOS 关闭 “Virtualization Technology for Directed I/O (VT-d)” 后重置 TPM/Secure Boot,再重新生成 DMI 信息
- MAC 地址重复更隐蔽:某些 OCP 网卡(如 Facebook Yosemite)默认所有端口共享一个 MAC,需进网卡固件菜单(Ctrl+G 进入 iBFT)单独配置每口 MAC
swap 分区与 SELinux 策略实际影响
文档说“必须禁用 swap”,但裸金属上常因历史运维习惯保留 swap;实际后果不是安装失败,而是 kubelet 在内存压力下触发 OOM Killer 杀掉 etcd 进程,现象是集群初始化成功,但 5–10 分钟后 Master 节点自动失联。
- 执行
sudo swapoff -a && sudo sed -i '/swap/d' /etc/fstab彻底禁用,不要只关当前会话 - SELinux 设为
permissive是临时方案,但生产环境建议保持enforcing并加载 k8s 策略:运行sudo semodule -i /usr/share/selinux/packages/kubernetes.pp.bz2(RHEL/CentOS 8+ 自带,CentOS 7 需手动编译) - 检查
containerd是否使用 systemd cgroup 驱动:containerd config default | grep systemd应返回"SystemdCgroup": true,否则与kubelet --cgroup-driver=systemd不匹配,Pod 启动卡在ContainerCreating
裸金属装 K8s 最难的从来不是命令敲得对不对,而是 BIOS 设置、网卡固件、内核模块、cgroup 驱动这四层之间存在隐式依赖——改其中一层,另外三层可能全要重验。建议把 lspci、cat /sys/class/dmi/id/product_uuid、lsmod | grep br_netfilter、containerd config default 四条命令的结果做成 checklist,在每台物理机上装系统前就拍下来比对。

















