k8s 持久化存储方案-PVC

参考官网:https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclai

ms

一、K8s PV 是什么?

PersistentVolume(PV):PV 是集群中的存储资源,可以是物理存储设备、网络存储或云存储等。PV 独立于 Pod 存在,它们是集群级别的资源,由集群管理员进行配置和管理。PV 具有持久性,即使 Pod被删除,PV 中的数据也会保留。PV 定义了存储的容量、访问模式和其他属性。

K8s PVC 是什么

PersistentVolumeClaim(PVC):PVC 是 Pod 对 PV 的申请,它表示 Pod 需要一定的存储资源来满足其持久化存储需求。PVC 在 Pod 和 PV 之间建立了一个抽象层,使得 Pod 无需关心底层存储的具体细节。PVC 定义了 Pod 对存储的需求,包括存储容量、访问模式等。

K8s PVC 和 PV 工作原理:当创建一个 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)时,它们之间的相互作用和工作原理如下:

通过 PV 和 PVC 的结合使用,Kubernetes 提供了一种灵活的持久化存储管理机制,使得使得 k8s

使用者可以轻松地申请、使用和管理存储资源,同时提供了不同的回收策略以满足不同的需求。

二、创建 pod,使用 pvc 作为持久化存储卷

1、创建 nfs 共享目录

#在宿主机创建 NFS 需要的共享目录

root@xuegod63 \~# mkdir /data/volume_test/v{1,2} -p

#配置 nfs 共享宿主机上的/data/volume_test/v1..v2 目录

root@xuegod63 \~# vim /etc/exports

/data/volume_test/v1 *(rw,no_root_squash)

/data/volume_test/v2 *(rw,no_root_squash)

#重新加载配置,使配置成效

root@xuegod63 \~# exportfs -arv

2、如何编写 pv 的资源清单文件

#查看定义 pv 需要的字段 kubectl explain pv

pv.yaml 配置文件

复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v1
  labels:
    app: v1
spec:
  capacity:
    storage: 1Gi  
  accessModes: ["ReadWriteOnce"]
  nfs:
    path: /data/volume_test/v1 
    server: 192.168.1.63     
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v2
  labels:
    app: v2
spec:
  capacity:
      storage: 2Gi
  accessModes: ["ReadWriteMany"]
  nfs:
    path: /data/volume_test/v2
    server: 192.168.1.63

3、创建 pv

#更新资源清单文件

复制代码
 kubectl apply -f pv.yaml

#查看 pv 资源

复制代码
kubectl get pv --show-labels

4、创建 pvc,和符合条件的 pv 绑定

pvc.yaml 配置文件

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  selector:
    matchLabels:
     app: v2
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi

#更新资源清单文件

复制代码
kubectl apply -f pvc.yaml

#查看 pv 和 pvc

复制代码
kubectl get pv
kubectl get pvc

5、创建 pod,挂载 pvc

vim pod_pvc.yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: nginx-html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nginx-html
    persistentVolumeClaim:
      claimName: my-pvc

#更新资源清单文件

root@xuegod63 \~# kubectl apply -f pod_pvc.yaml

#查看 pod 状态 #

复制代码
kubectl get pods -owide | grep pod-pvc

测试 pod 挂载 PVC 是否正常:

在绑定的 v2 目录下创建文件,写入测试内容"my-pvc"

root@xuegod63 \~# echo "my-pvc" >> /data/volume_test/v2/index.html

root@xuegod63 \~# curl 10.244.104.12

my-pvc

测试删除 pod,再重新创建 pod ,挂载原先的 pvc,看数据是否会丢失:

root@xuegod63 \~#kubectl delete -f pod_pvc.yaml

root@xuegod63 \~#kubectl apply -f pod_pvc.yaml

root@xuegod63 \~# kubectl get pods -owide | grep pod-pvc

pod-pvc 1/1 Running 0 27s 10.244.104.13

root@xuegod63 \~# curl 10.244.104.13

my-pvc

pod 重新挂载到原 pvc,数据还在

相关推荐
Waay29 分钟前
K8s ETCD 详解|备份恢复+静态Pod原理+kubectl查询底层流程(面试必考)
面试·kubernetes·etcd
松岩39 分钟前
dcgm-exporter部分指标
kubernetes
我是谁??3 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
Patrick_Wilson3 小时前
K8s 探针避坑:Next.js 不同部署模式下的健康检查实践
kubernetes·node.js·next.js
运维瓦工4 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Plastic garden4 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
Plastic garden4 小时前
k8s(11) Pod 控制器,服务发现与存储管理
kubernetes
与海boy5 小时前
docker compose minio
docker·容器·eureka
星辰徐哥5 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops