简单理解的概念
pv : 相当于磁盘分区
pvc: 相当于磁盘请求
PV和PVC的生命周期
访问模式
可以对 PV 进行访问模式的设置,用于设置用户对存储资源的访问的权限。访问模式如下:
• ReadWriteOnce(RWO):读写权限,只允许最多一个节点挂载。
• ReadOnlyMany(ROX):只读权限,允许被多个节点挂载。
• ReadWriteMany(RWX):读写权限,允许被多个节点挂载。
• ReadWriteOncePod(RWOP):读写权限,只允许一个Pod挂载,这仅支持 CSI 卷和 Kubernetes 1.22+ 版。
回收策略
目前的支持的回收策略:
• Retain(保留):保留数据,需要手工处理
• Recycle(回收):简单清除文件的操作(例如执行 rm -rf /thevolume/* 命令)。
• Delete(删除): 将从 Kubernetes 中删除 PV 对象,以及外部基础设施中相关的存储资产,例如 AWS EBS、GCE PD、Azure disk。
阶段
某个 PV 在生命周期中,可能会将处于以下阶段之一:
• Available:可用状态,还未与某个 PVC 绑定。
• Bound:绑定状态,己与某个 PVC 绑定。
• Released:绑定的 PVC 已经删除,资源己释放,但没有被集群回收
• Failed:自动资源回收失败。
简单示例
搭建一个NFS共享服务器,共享目录为 /home/nfs_data
定义PV
apiVersion: v1
kind: PersistentVolume
Metadata:
name: my-pv01
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs_data
server: 192.168.3.200
kubectl apply -f pv01.yaml
kubectl get pv
NAME CAPACITY ACCESS MODES RECLaim POLICY STATUS CLaim STORAGECLASS REASON AGE
my-pv01 5Gi RWX Retain Available 85s
申请pvc
apiVersion: v1
kind: PersistentVolumeClaim
Metadata:
name: my-pvc01
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
kubectl apply -f pvc01.yaml
root@k8s-master01:/home/kubernetes_yaml/vol# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc01 Bound my-pv01 5Gi RWX 41s
root@k8s-master01:/home/kubernetes_yaml/vol# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLaim POLICY STATUS CLaim STORAGECLASS REASON AGE
persistentvolume/my-pv01 5Gi RWX Retain Bound default/my-pvc01 6m17s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/my-pvc01 Bound my-pv01 5Gi RWX 105s
容器引用
apiVersion: v1
kind: Pod
Metadata:
name: my-pod01
spec:
containers:
- name: Nginx
image: Nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/Nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: my-pvc01
kubectl apply -f pvc-pod.yaml
root@k8s-master01:/home/kubernetes_yaml/vol# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READInesS GATES
my-pod01 1/1 Running 0 5m50s 172.27.14.200 k8s-node02 <none> <none>
root@k8s-master01:/home/kubernetes_yaml/vol# curl 172.27.14.200
pvc01-pod
StorageClass
git clone https://github.com/kubernetes-retired/external-storage
cd nfs-clint/deploy
rbac.yaml # 授权访问apiserver
deployment.yaml 部署插件 需修改NFS服务器地址和共享目录
class.yaml #创建存储类
#kubectl get sc # 查看存储类
apiVersion: v1
kind: Pod
Metadata:
name: pod-sc
spec:
containers:
- name: web
image: Nginx
volumeMounts:
- name: nfs-pvc
mountPath: "/usr/share/Nginx/html"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
Metadata:
name: test-claim
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi