CentOS 上部署 Kubernetes 的主要难点与对策
一 系统与内核兼容性与资源门槛
- 内核版本与功能支持:在 CentOS 7.9 上,默认 3.10 内核缺少 eBPF、IPVS 高级特性、较新的 VXLAN/overlay 优化,部署 Kubernetes 1.28+(尤其是 1.31) 常出现网络性能显著下降、偶发卡顿等问题;升级到 5.x LTS 内核或使用 CentOS Stream 8/9、Rocky Linux 8/9 等现代发行版可显著改善。验证命令:
uname -r、stat -fc %T /sys/fs/cgroup/(cgroups v1 为 tmpfs,v2 为 cgroup2fs)。
- cgroups 版本差异:CentOS 9 默认启用 cgroups v2,而部分早期 K8s 版本(如 1.20)对其支持不完善,需在内核启动参数中回退到 cgroups v1:
grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0" && reboot。
- 资源门槛:单机学习环境建议至少 2 核 CPU、2GB 内存、20GB 磁盘;低于 2GB 常出现 kubelet OOM 导致反复重启。
- 版本选择:在 CentOS 7.9 上,推荐 Kubernetes 1.23.x;若需 1.24+,务必先升级内核(≥4.19 更稳),否则易出现网络/稳定性问题。
二 容器运行时与 cgroup 驱动一致性
- 运行时选择:Kubernetes 1.24 起移除 dockershim,推荐直接使用 containerd;若坚持使用 Docker,需确保其与 kubelet 的 cgroup driver 一致。
- containerd 配置要点:生成默认配置并启用 SystemdCgroup = true,否则 kubelet 与容器运行时 cgroup 不一致会导致 Pod 无法启动或频繁重启。示例:
containerd config default > /etc/containerd/config.toml && sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml。
- Docker 场景:在 /etc/docker/daemon.json 设置
"exec-opts": ["native.cgroupdriver=systemd"] 并重启 Docker,确保与 kubelet 一致。
三 网络难点 防火墙端口 CNI 与 Pod 外网
- 防火墙与端口放行:K8s 组件与网络插件需要大量端口。示例(firewalld):放行 6443、2379-2380、10250、10251、10252、30000-32767/TCP,以及 8472/UDP(Flannel VXLAN);或在学习/测试环境临时停用防火墙。
- 内核网络参数:必须启用桥接流量经 iptables 与转发:
net.bridge.bridge-nf-call-iptables=1、net.bridge.bridge-nf-call-ip6tables=1、net.ipv4.ip_forward=1,并加载 br_netfilter、overlay 模块。
- CNI 与节点 NotReady:未安装 CNI 或配置错误会导致 Node NotReady;安装对应网络插件(如 Calico/Flannel)并确认 /etc/cni/net.d 配置正确。
- Pod 外网访问:常见为 NAT/网桥模式 配置不当、宿主机 IP 变化、路由/网关/DNS 异常;需核对 NAT/桥接、静态 IP、DNS 配置,并逐层排查宿主机与网关连通性。
四 镜像拉取与仓库可达性
- 官方仓库访问慢/不可达:国内环境常因 k8s.gcr.io 等仓库访问受限导致
kubeadm init 阶段镜像拉取失败或超时。
- 解决方案:使用国内镜像源(如 registry.aliyuncs.com/google_containers)作为 image-repository;或提前用脚本/清单拉取并重新打标签;必要时为 yum/dnf 配置代理。示例:
kubeadm init --image-repository=registry.aliyuncs.com/google_containers ...。
五 存储与有状态服务对接
- Ceph RBD/CephFS 对接:需创建 Secret(存放 Ceph 密钥)、PV/PVC(容量、访问模式、回收策略)、必要时配置 StorageClass 与 provisioner;对接外部 Ceph 时,注意 monitors、pool、image、user 与 secretRef 一致。
- 常见要点:RBD 默认 pool=rbd、支持 RWO/ROX 等访问模式;persistentVolumeReclaimPolicy 常用 Retain(重要数据更稳妥);若使用 kubernetes.io/rbd 动态供给,需确认集群已部署相应 provisioner。