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 存储中的数据。