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,数据还在

相关推荐
小猿姐1 小时前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
阿里云云原生12 小时前
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
云原生·agent
阿里云云原生1 天前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang4532 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4532 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4532 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生2 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生3 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事5 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js