数据卷emptydir,是本地存储,Pod重启,数据不存在了,需要对数据持久化存储
1、基本概念
管理存储是管理计算的一个明显问题。该 PersistentVolume 子系统为用户和管理员提供了 一个 API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的 API 资源:PersistentVolume 和 PersistentVolumeClaim
PersistentVolume(PV):持久化存储,存储资源进行抽象,对外提供可以调用的地方(生产者)。 此 API 对象捕获存储实现的详细信息,包括 NFS,iSCSI 或特定于云提供程 序的存储系统。
PersistentVolumeClaim(PVC):用户调用,不需要关心内部实现细节。声明可以请求特 定的大小和访问模式(例如,可以一次读/写或多次只读)。
StorageClass 为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能 映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes 本 身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”。
PVC 和 PV 是一一对应的。
2、生命周期
PV 是群集中的资源。PVC 是对这些资源的请求,并且还充当对资源的检查。PV 和 PVC 之间 的相互作用遵循以下生命周期:
Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
供应准备 Provisioning—通过集群外的存储系统或者云平台来提供存储持久化支持。
- 静态提供 Static:集群管理员创建多个 PV。 它们携带可供集群用户使用的真实存储的 详细信息。 它们存在于 Kubernetes API 中,可用于消费
- 动态提供 Dynamic:当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群可能会尝试为 PVC 动态配置卷。 此配置基于 StorageClasses:PVC 必须请求一个 类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己 禁用动态配置。
绑定 Binding—用户创建 pvc 并指定需要的资源和访问模式。在找到可用 pv 之前,pvc 会保持未绑定状态。
使用 Using—用户可在 pod 中像 volume 一样使用 pvc。
释放 Releasing—用户删除 pvc 来回收存储资源,pv 将变成“released”状态。由于还 保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他 pvc 使用。
回收 Recycling—pv 可以设置三种回收策略:保留(Retain),回收(Recycle)和删除 (Delete)。
- 保留策略:允许人工处理保留的数据。
- 删除策略:将删除 pv 和外部关联的存储资源,需要插件支持。
- 回收策略:将执行清除操作,之后可以被新的 pvc 使用,需要插件支持
3、NFS作为持久化存储
(1) 安装NFS
server端
yum install nfs-utils.x86_64 -y
mkdir /data
vim /etc/exports
/data 192.168.0.0/24(rw,async,no_root_squash,no_all_squash)
systemctl start rpcbind
systemctl start nfs
node节点端
yum install nfs-utils.x86_64 -y
(2) 创建PV卷(NFS类型)
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-server10
labels:
app: nfs-server10
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany # · ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
# · ReadOnlyMany(ROX):可以以只读的方式被多个 Pod 挂载。
# · ReadWriteMany(RWX):这种存储可以以读写的方式被多个 Pod 共享。
persistentVolumeReclaimPolicy: Recycle # 保留(Retain),回收(Recycle)和删除 (Delete)。
nfs:
path: "/k8s-nfs-data/"
server: "192.168.18.6"
readOnly: false
创建并查看
kubectl apply -f *.yaml
(3) 创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web01-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
创建并查看
kubectl apply -f *.yaml
(4) Pod挂载持久化存储YAML示例
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web04
name: web04
spec:
replicas: 1
selector:
matchLabels:
app: web04
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web04
spec:
containers:
- image: nginx:1.14
name: nginx
resources: {}
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-svc
status: {}
创建并查看
kubectl apply -f *.yaml
# 常见对外访问
kubectl expose deployment web04 --port=80 --type=NodePort --target-port=80
在nfs server 目录中创建web html文件
echo "nfs pv html" > /k8s-nfs-data/index.html
浏览器访问
4、挂载到接到本地
volumeMounts:
- mountPath: "/prometheus"
name: data
- mountPath: "/etc/prometheus"
name: config-volume
volumes:
- name: data
emptyDir: {}
- name: config-volume
configMap:
name: prometheus-config