文章目录
- 前言
-
- [k8s po 配置持久化挂载(nfs)](#k8s po 配置持久化挂载(nfs))
-
- [1. 相关概念](#1. 相关概念)
-
- [1.1. 用处](#1.1. 用处)
- [1.2. 为什么需要持久化挂载?](#1.2. 为什么需要持久化挂载?)
- [1.3. NFS 在 K8s 里的作用](#1.3. NFS 在 K8s 里的作用)
- [1.4. 架构图](#1.4. 架构图)
- [2. 配置思路](#2. 配置思路)
-
- [2.1. 目录权限处理的几种方式](#2.1. 目录权限处理的几种方式)
-
- [2.1.1. 直接赋予 777](#2.1.1. 直接赋予 777)
- [2.1.2. 基于用户组 ID 配置](#2.1.2. 基于用户组 ID 配置)
- [2.1.3. 直接指定容器用户 ID](#2.1.3. 直接指定容器用户 ID)
- [2.2. 总结](#2.2. 总结)
- [3. k8s 设置挂载](#3. k8s 设置挂载)
-
- [3.1. 建立pv](#3.1. 建立pv)
- [3.1. 建立pvc](#3.1. 建立pvc)
- [3.3. 快速验证](#3.3. 快速验证)
- [3.4. po 配置加NFS挂载](#3.4. po 配置加NFS挂载)
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
k8s po 配置持久化挂载(nfs)
1. 相关概念
1.1. 用处
在 Kubernetes 中使用 NFS 网络文件系统 来做 持久化存储卷 (PersistentVolume, PV) 和 持久化存储声明 (PersistentVolumeClaim, PVC),从而让 Pod 的数据在重启或调度到其他节点时依然能保留。
1.2. 为什么需要持久化挂载?
- Pod 本地存储是临时的:Pod 删除/重建时,容器里的数据会丢失。
- 需要共享数据:多个 Pod 要访问同一份文件(日志、配置、上传文件等)。
- 解耦计算和存储:应用无状态化,存储独立出来。
1.3. NFS 在 K8s 里的作用
NFS(Network File System)是一种 跨节点共享目录 的协议。
在 K8s 中,使用 NFS 相当于为集群里的所有节点提供了一个统一的共享目录:
- 多个 Pod 可以同时挂载该目录,做到 数据共享;
- Pod 重启或迁移后,数据依然 持久保存。
1.4. 架构图
bash
(K8s Pod ↔ PVC ↔ PV ↔ NFS 服务器)
2. 配置思路
部署细节此处略,可以参考官方文档或安装教程)
关键在于 NFS 共享目录权限 的处理。因为容器里的应用用户 ID 和宿主机用户 ID 可能不一致,容易导致没有写权限。
2.1. 目录权限处理的几种方式
2.1.1. 直接赋予 777
对要共享的目录(例如 /data/nfs/app)设置:
bash
chmod -R 777 /data/nfs/app
优点:简单粗暴,保证任何容器都能读写。
缺点:权限过大,存在安全风险。
2.1.2. 基于用户组 ID 配置
查询需要挂载的 Pod 内部运行用户的 UID/GID,例如:
- 用户 ID:10001
- 用户组 ID:10000
那么可以在 NFS 服务器上配置目录权限:
bash
chown -R root:10000 /data/nfs/app
chmod -R 775 /data/nfs/app
这样,同组用户就能创建和写入文件。
2.1.3. 直接指定容器用户 ID
如果明确知道 Pod 内部使用的用户 ID,可以直接把目录属主改成该用户:
bash
chown -R 10001:10000 /data/nfs/app
chmod -R 755 /data/nfs/app
这样,容器内用户就完全拥有该目录的权限,同时保证其他人只读。
2.2. 总结
- NFS 是 K8s 常见的持久化存储方案,简单、通用。
- 核心问题在于目录权限,需要根据实际容器用户来调整。
推荐:开发环境可以直接用 777;生产环境最好用 用户组 ID 或 指定 UID 的方式,既保证功能又更安全。
3. k8s 设置挂载
3.1. 建立pv
pv集群级,不需要指定命名空间:
bash
apiVersion: v1
kind: PersistentVolume
metadata:
name: yzy-data
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 200Gi
nfs:
path: /data/nfs/app
server: <NFS服务ip>
persistentVolumeReclaimPolicy: Delete
storageClassName: nfs-storage
volumeMode: Filesystem
3.1. 建立pvc
bash
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yzy-data
namespace: <命名空间>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Gi
storageClassName: nfs-storage
volumeMode: Filesystem
volumeName: yzy-data # 显式绑定上面建的 PV
3.3. 快速验证
bash
# 1. 应用
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
# 2. 看状态
kubectl get pv yzy-data pvc/yzy-data -n <命名空间>
# 3. 若 PVC 一直 Pending
kubectl describe pvc yzy-data -n <命名空间>
3.4. po 配置加NFS挂载
- volumes ------ 声明"盘从哪来"
- volumeMounts ------ 声明"挂到容器哪"
示例: