Kubernetes(k8s) po 配置持久化挂载(nfs)

文章目录

  • 前言
    • [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挂载
  1. volumes ------ 声明"盘从哪来"
  2. volumeMounts ------ 声明"挂到容器哪"

示例:

相关推荐
努力打怪升级3 小时前
容器学习day05_k8s(二)
学习·容器·kubernetes
哈里谢顿3 小时前
Kubernetes Cluster(K8s 集群)介绍
kubernetes
哈里谢顿3 小时前
Kubernetes 部署 OpenStack 详细指南
kubernetes
Dobby_053 小时前
【Linux】网络安全管理:SELinux 和 防火墙联合使用 | Redhat
linux·运维·云原生·防火墙·selinux
静若繁花_jingjing4 小时前
云原生部署_Docker入门
docker·云原生·容器
运维开发王义杰4 小时前
信息安全:代码质量双雄对决,SonarQube 与 Codacy,传统巨擘与云原生新贵的深度剖析
安全·云原生
于齐龙4 小时前
关于kubernetes和docker版本的一些总结
docker·容器·kubernetes
敲上瘾6 小时前
Docker 容器核心指令与数据库容器化实践
linux·运维·服务器·docker·容器·eureka·dubbo
Linux运维技术栈6 小时前
Kubernetes 全景指南:从核心概念到云原生未来
云原生·容器·kubernetes