1.数据存储NFS网络文件系统搭建

NFS 概述:

NFS(Network File System)是一种分布式文件系统协议,用于通过网络共享文件和目录。它允许客户端计算机通过网络访问和读取远程服务器上的文件,就像它们在本地文件系统中一样。NFS 是一种常见的网络文件共享协议,在许多环境中被广泛使用。

用途:

在 Kubernetes 中,NFS 可以作为一种持久化存储解决方案,用于存储和共享数据。NFS 存储适用于需要多个 Pod 共享相同数据的场景,如数据库、文件共享、日志文件存储等。它提供了可靠的数据持久性和高可用性,使多个 Pod 可以访问和修改相同的文件。

部署NFS服务器

1.下载nfs-util (对应要用到的节点都需要安装,但是不需要启动)

yum install nfs-utils -y

2.创建目录(nfs服务器)

#目录可以自定义
mkdir /opt/nfsdata
#给路径授权
chmod 777 /opt/nfsdata

3.编辑/etc/exports 配置文件(nfs服务器)

vim /etc/exports
# 目录的读写权限暴露给这个网段的全部主机
/opt/nfsdata 172.31.101.0/24(rw,insecure,sync)

解释:
172.31.101.0/24表示的IP范围, 换成32位二进制,四组,每组8位
/24 表示前24位不变,后8位由全0变化到全1的过程,也就是由“00000000”变化到“11111111”
又因为全0是子网网络地址,全1是子网广播地址,这两个地址是不分配给主机使用的。
所以有效的可分配的范围是前24位不变,后8位由“00000001”变化为“11111110”的范围
再转换回十进制就是172.31.101.1~172.31.101.254

参数:

  • rw 共享目录可读可写
  • secure 限制客户端只能从小于1024的tcp/ip端口连接服务器;
  • insecure允许客户端从大于1024的tcp/ip端口连接服务器;
  • sync 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
  • async 将数据先保存在内存缓冲区中,必要时才写入磁盘;

4.启动rpcbind(安装nfs依赖包会自动下载)和nfs服务

systemctl start rpcbind
systemctl start nfs

5.验证

showmount -e localhost

2.K8S数据存储之NFS持久卷挂载

创建pod挂载nfs

apiVersion: v1
kind: Pod
metadata:
  name: my-nfs
  namespace: dev
  labels: 
    apps: nginx-nfs
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:
  - name: logs-volume
    nfs:
      server: 172.31.101.8  #nfs服务器地址
      path: /opt/nfsdata #共享文件路径

暴露服务

kubectl expose pod my-nfs -n dev --port=80 --target-port=80 --type=NodePort

查看nfs服务器的/opt/nfsdata此时路径下面已经有内容了

3.K8S高级存储PV,PVC

概述:

PV 和 PVC 提供了一种管理持久化存储的抽象层,使得应用程序可以方便地访问持久化的数据,并且与底层存储设备解耦,应用程序不需要关心具体的存储设备,只需通过 PVC 请求所需的存储资源。通过使用 PV 和 PVC,可以更好地管理和分配存储资源,确保数据的持久性和可靠性。
PV 是集群中的持久化存储资源,而 PVC 则是 Pod 对 PV 的请求。

PV(PersistentVolume):

  • PV 是集群中的持久化存储资源,它可以由集群管理员预先配置和管理。
  • PV 独立于 Pod 存在,可以被多个 Pod 共享使用。
  • PV 可以连接到各种后端存储系统,如本地磁盘、网络存储、云存储等。
  • PV 有自己的生命周期,可以手动创建、删除和管理。
  • PV 通过定义存储容量、访问模式和存储类等属性来描述存储资源。

PVC(PersistentVolumeClaim):

  • PVC 是 Pod 对 PV 的申请,它表示 Pod 对持久化存储资源的需求。
  • PVC 是在命名空间级别上创建的,可以绑定到同一命名空间中的多个 PV 上。
  • PVC 可以指定存储容量、访问模式和存储类等属性,用于匹配符合需求的 PV。
  • PVC 通过声明需要的存储资源,让 Kubernetes 自动分配和管理 PV 的使用。

用途

PV 和 PVC 用于管理和提供持久化存储资源,适用于各种应用场景,例如:

  • 数据库存储:将数据库数据持久化保存在 PV 上,确保数据的持久性和可靠性。
  • 文件存储:将文件系统挂载到 PVC 上,供多个 Pod 共享读写文件。
  • 日志存储:将应用程序的日志输出保存在 PV 上,便于日志分析和存档。

PV和PVC逻辑

  • PV 是集群中的【资源】,PVC 是对这些【资源的请求】
  • PV 和 PVC 之间的相互作用遵循这个生命周期
    Provisioning(配置) —> Binding(绑定) —> Using(使用) —> Releasing(释放) —> Recycling(回收)

PV的yaml模板

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi #存储大小
  accessModes:#访问模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle #回收策略
  storageClassName: slow #存储类别
  nfs:#卷插件
    path: /tmp
    server: 172.31.101.8
  • 存储大小:存储大小是可以设置和请求的唯一资源。 未来可能会包含 IOPS、吞吐量等属性
  • 访问模式:用户对资源的访问权限
  • ReadWriteOnce(RWO):读写权限,只能被单个节点挂载
  • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
  • 存储类别:
  • 每个 PV 可以属于某个类,通过将其 storageClassName属性设置为某个 StorageClass 的名称来指定。
  • 特定类的 PV 卷只能绑定到请求该类存储卷的 PVC 申领。
  • 未设置 storageClassName 的 PV 卷没有类设定,只能给到那些没有指定特定 存储类的 PVC 申领。
  • 回收策略(当PV不再被使用了之后的处理策略)
  • 保留 Retain – 当PV对象被删除之后,与之相关的位于外部的基础设施中的数据仍然存在(如nfs),需要根据实际情况手动回收
  • 回收 Recycle – 相当于在卷上执行rm -rf /volume/* 操作,之后该卷可以用于新的pvc申领
  • 删除 Delete – 当PV对象被删除之后,与之相关的位于外部的基础设施中的数据也被一并删除(如nfs),需要根据实际情况手动回收,更多是云厂商设备

PV 的生命周期有4种不同状态

  • Available(可用)——一块空闲资源还没有被任何声明绑定
  • Bound(已绑定)——卷已经被声明绑定
  • Released(已释放)——声明被删除,但是资源还未被集群重新声明
  • Failed(失败)——该卷的自动回收失败

PVC的yaml模板

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: dev
spec:
  accessModes: # 访问模式
  - ReadWriteMany
  selector: # 采用label标签对PV选择过滤
  storageClassName: # 存储类别,设置对应的class的PV才能被系统选出
  resources: # 需要存储资源的请求
    requests:
      storage: 3Gi

PVC 的生命周期有5种不同状态

  • Pending(可用)——PVC已经创建,但尚未绑定到可用的PersistentVolume(PV)
  • Bound(已绑定)——PVC已经成功绑定到可用的PV
  • Lost(丢失)——PVC与绑定的PV之间的关联丢失
  • Released(已释放)——PVC已经释放了对绑定PV的占用
  • Failed(失败)——PVC创建或绑定过程中发生错误

3.K8S高级存储PV+PVC+NFS使用

1.PV配置文件 pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv  # PV的名称
spec:
  capacity:
    storage: 1Gi  # PV的存储容量
  accessModes:
    - ReadWriteMany  # PV的访问模式
  persistentVolumeReclaimPolicy: Retain  # PV的回收策略
  nfs:
    path: /path/to/nfs  # NFS服务器上的路径
    server: <NFS_SERVER_IP>  # NFS服务器的IP地址

将 <NFS_SERVER_IP> 替换为实际的NFS服务器IP地址,/path/to/nfs 替换为实际的NFS共享路径。

2.PVC配置文件 pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc  # PVC的名称
spec:
  accessModes:
    - ReadWriteMany  # PVC的访问模式
  resources:
    requests:
      storage: 1Gi  # PVC的存储容量

3.使用NFS存储的Pod配置文件 pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod  # Pod的名称
spec:
  containers:
    - name: app-container  # 容器的名称
      image: nginx  # 使用的镜像
      volumeMounts:
        - mountPath: /var/www/html  # 挂载的路径
          name: nfs-volume  # 使用的卷名称
  volumes:
    - name: nfs-volume  # 卷的名称
      persistentVolumeClaim:
        claimName: nfs-pvc  # 关联的PVC名称
        readOnly: false

替换 <NFS_SERVER_IP> 为实际的NFS服务器IP地址,并根据需要调整存储容量和挂载路径。然后,可以使用 kubectl apply -f <文件名> 命令依次创建PV、PVC和Pod。

这样,Pod 将使用 PVC 挂载到对应的 NFS 存储路径上,使得 Pod 内的容器能够访问 NFS 存储中的数据。