CentOS 与 Kubernetes 兼容性要点与对策
一 兼容矩阵与硬性门槛
- 下表聚焦生产中最容易踩坑的三点:操作系统、内核、容器运行时与 K8s 版本的匹配关系。
| 维度 |
推荐或门槛 |
说明 |
| CentOS 7.9 |
内核3.10为默认值 |
在不升级内核时,建议最高使用 Kubernetes 1.23.x;从 1.24 起对内核特性(如 eBPF)要求更高,3.10 存在明显限制。 |
| CentOS 7.9 升级内核 |
建议升级至 5.4 LTS(ELRepo)或更高 |
升级后可较好运行 1.28+,对 1.31 的网络与稳定性显著改善。 |
| CentOS 8 Stream / Rocky Linux 8/9 |
默认内核4.18+ |
与 Kubernetes 1.24+ 的 containerd/CRI 生态更匹配,维护成本更低。 |
| 运行时与 1.24+ |
使用 containerd/CRI-O |
1.24 移除内置 Dockershim,Docker 需经由 cri-dockerd 适配后才能作为容器运行时。 |
| 网络插件 |
Flannel v0.14.0+、Calico v3.20+ |
与 Kubernetes 1.23.x 验证兼容;更高 K8s 版本请使用对应分支。 |
二 常见兼容性问题与症状
- 内核过旧导致网络性能骤降:在 CentOS 7.9 3.10 上运行 K8s 1.28+(尤其 1.31),常见现象为跨节点带宽被限制在百 KB/s~几 MB/s、偶发 CPU 僵死、应用(如 Jenkins)部署/启动异常缓慢。根因包括:IPVS 高级特性缺失(如无法设置 net/ipv4/vs/conn_reuse_mode)、eBPF 支持残缺、VXLAN 封装开销大、nf_conntrack 效率低。升级至 5.x 内核后通常可恢复至千兆级吞吐。
- cgroup 泄漏导致节点不可用:早期 K8s 1.9 + CentOS 7 组合在节点重启等场景下,出现 “no space left on device” 与大量 cgroup 目录残留,最终节点失联。该问题已被社区广泛记录,属于历史已知坑点。
- 1.24+ 仍试图直连 Docker:未安装 cri-dockerd 或未切换到 containerd 时,kubelet 无法通过 CRI 与 Docker 通信,表现为镜像拉取/ Pod 创建失败。
- 网络参数未就位:未启用 net.ipv4.ip_forward=1、net.bridge.bridge-nf-call-iptables=1 等,导致 Service 网络不通或 Pod 间通信异常。
三 版本选择与升级路线
- 存量 CentOS 7.9 集群
- 若需维持 1.23.x:保持内核 3.10,使用 containerd 或 Docker(经适配),网络插件用 Flannel v0.14.0+ / Calico v3.20+。适合短期过渡与稳定性优先场景。
- 若需 1.28+ / 1.31:优先给所有节点升级内核至 5.4 LTS(ELRepo),验证通过后再升级 K8s 版本;实测可显著改善网络与稳定性。
- 新建集群
- 优先选择 CentOS Stream 8/9、Rocky Linux 8/9 或 Ubuntu 22.04 LTS,默认内核 4.18+/5.15+,与 K8s 1.24+ 的 containerd/CRI 生态更契合,长期维护成本更低。
- 运行时决策
- 1.24+ 默认使用 containerd/CRI-O;如必须使用 Docker,部署 cri-dockerd 作为 shim 层,并统一 cgroup 驱动为 systemd。
四 落地配置清单(可直接复用)
- 内核与模块
- 加载模块:
br_netfilter、overlay
- sysctl:
net.bridge.bridge-nf-call-iptables=1、net.bridge.bridge-nf-call-ip6tables=1、net.ipv4.ip_forward=1
- 容器运行时 containerd(1.24+ 推荐)
- 安装
containerd.io,生成配置:containerd config default > /etc/containerd/config.toml
- 关键项:
SystemdCgroup = true;镜像加速与 sandbox_image(如 registry.aliyuncs.com/google_containers/pause:3.9)
- 启动:
systemctl enable --now containerd
- kubeadm 初始化要点
- 指定版本(示例):
kubelet-1.24.17-0 kubeadm-1.24.17-0 kubectl-1.24.17-0
criSocket: unix:///run/containerd/containerd.sock
podSubnet 与所选 CNI 匹配(如 Flannel 10.244.0.0/16、Calico 192.168.0.0/16)
- 网络插件
- Flannel v0.14.0+ 或 Calico v3.20+;安装前确认 Pod CIDR 与控制器参数一致,避免 NotReady。