node-nfs-client · 节点级 NFS 客户端引导器
node-nfs-client 是一个运行在集群每个节点上的 DaemonSet,职责单一:保证宿主机上装好了 NFS 客户端(nfs-common / mount.nfs)。
节点制备过程曾遗漏在新加入的节点上安装 NFS 客户端,导致依赖 NFS 的 PVC 无法挂载(例如 backup-prometheus 的备份卷)。这个 DaemonSet 通过特权容器 chroot 进宿主机检查并按需安装,把"每个节点都具备 NFS 挂载能力"这件事固化成集群内的声明式资源,而不是依赖节点制备脚本。
部署形态
- Name
- 命名空间
- Description
- kube-system(manifest 内联指定,不走 category namePrefix)
- Name
- 工作负载类型
- Description
- DaemonSet —— 每个节点一个 Pod
- Name
- 镜像
- Description
- debian:13-slim
- Name
- 容器名
- Description
- ensure-nfs
- Name
- 调度
- Description
- tolerations 为
operator: Exists,容忍所有污点,因此包括 3 个 control-plane 节点在内的全部节点都会运行(不限定 workload 标签)
- Name
- 主机访问
- Description
- hostNetwork: true、hostPID: true,容器以 privileged 运行,通过 hostPath
/挂载宿主机根文件系统到/host
- Name
- 资源
- Description
- requests cpu 10m / memory 16Mi,limits cpu 200m / memory 128Mi
容器启动后 chroot /host 进入宿主机执行检查与安装,完成后进入 while true; do sleep 3600; done 保持 Pod 常驻;Pod 重启时会重新执行检查逻辑。核心逻辑如下:
set -e
if chroot /host sh -c 'command -v mount.nfs >/dev/null 2>&1'; then
echo "$(chroot /host hostname): nfs client already present"
else
echo "$(chroot /host hostname): installing nfs-common..."
chroot /host sh -c 'export DEBIAN_FRONTEND=noninteractive; apt-get update -qq && apt-get install -y -qq nfs-common'
echo "$(chroot /host hostname): done"
fi
while true; do sleep 3600; done
配置与依赖
该组件没有 ConfigMap、ExternalSecret,也不连接任何数据库或中间件,kustomization 只引用一个 daemonset.yaml。
它对宿主机的隐含依赖是:节点为基于 Debian/apt 的发行版(apt-get install nfs-common),且能访问 apt 软件源。安装操作是幂等的 —— 已经存在 mount.nfs 的节点会被跳过,只打印一行 "already present"。
访问与监控
无 Service、无 Ingress —— 这是一个纯节点引导组件,不对外提供任何网络端点(hostNetwork: true 仅为让容器在宿主机网络命名空间内操作)。
manifest 中没有 ServiceMonitor、PrometheusRule、HPA、VPA 或 PDB。运行状态直接通过 DaemonSet Pod 的日志观察:每个节点的 Pod 会打印该节点是已具备 NFS 客户端还是刚完成安装。
注意事项
这个 DaemonSet 的存在本身就是一次踩坑的修复:节点制备遗漏 NFS 客户端,使得 NFS 后端的 PVC 挂载失败(如 backup-prometheus)。它兜住的是新节点加入这一场景 —— 新节点上线后 DaemonSet 会自动在其上铺一个 Pod 完成安装。
它与集群里大量使用 RWX nfs-client PVC 的工作负载是配套的(例如 DNF 游戏服的数据目录就建立在 RWX nfs-client 之上),底层 NFS 存储供应由 nfs-provisioner 负责。node-nfs-client 解决的是"节点侧能不能 mount",nfs-provisioner 解决的是"卷从哪里来",两者分工不同。
由于容器以 privileged 并 chroot 到宿主机根文件系统执行 apt-get install,它会改动宿主机的软件包状态。这是有意为之的设计,但也意味着不要把它当成无副作用的普通工作负载随意改动镜像或命令。
返回 infrastructure 总览