doina

一个小菜鸟运维工程师.

kubernetes PV和PVC持久卷

基本概念

PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节,用于实现持久化存储.

Persistent Volume(PV)是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统

PersistentVolumeClaim(PVC)是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC声明可以请求特定的大小和访问模式(如:读写或只读)

PV支持的类型 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes

PV的回收策略(persistentVolumeReclaimPolicy)

  • pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)
    • 保留策略:允许人工处理保留的数据.
    • 删除策略:将删除pv和外部关联的存储资源,需要插件支持.
    • 回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支.

参考: https://kubernetes.io/zh/docs/tasks/administer-cluster/change-pv-reclaim-policy/

PVC阶段状态(STATUS)

  • Available – 资源尚未被claim使用
  • Bound – 卷已经被绑定到claim了
  • Released – claim被删除,卷处于释放状态,但未被集群回收
  • Failed – 卷自动回收失败

目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。

访问模式(accessModes)

  • ReadWriteOnce – PV以 read-write 挂载到一个节点
  • ReadWriteMany – PV以read-write方式挂载到多个节点
  • ReadOnlyMany – PV以read-only方式挂载到多个节点

Pod Volume的类型(非持久存储)

emptryDir

emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。

emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: nginx-log
      mountPath: /var/log/nginx
  volumes:
  - name: nginx-log
    emptyDir: {}

hostPath

hostPath Volume为Pod挂载宿主机上的目录或文件。 hostPath Volume的使得容器可以使用宿主机的高速文件系统进行存储。

apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: nginx-log
      mountPath: /var/log/nginx
  volumes:
  - name: nginx-log
    hostPath:
      path: /data/nginx/log

PV/PVC结合NFS使用实践(持久存储)

安装NFS

安装参考: https://baiyongjie.com/?p=545

# 创建一个/data/pvdata的共享目录

# mkdir /data/pvdata
# chown nfsnobody:nfsnobody /data/pvdata
# cat /etc/exports
/data/pvdata 172.22.22.0/24(rw,async,all_squash)

建立PV

# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-data  #pv的名称
spec:
  capacity: #容量
    storage: 10Gi  #pv可用的大小
  accessModes: #访问模式
    - ReadWriteOnce  #PV以read-write挂载到一个节点
  persistentVolumeReclaimPolicy: Recycle #持久卷回收策略
  storageClassName: nfs  #存储类名称
  nfs:
    path: /data/pvdata      #NFS的路径
    server: 172.22.22.215   #NFS的IP地址

# kubectl apply -f pv.yaml 
persistentvolume/pv-data created

# kubectl get pv
NAME     CAPACITY   ACCESS MODES    RECLAIM   POLICY  STATUS  CLAIM  STORAGECLASS REASON   AGE
pv-data  10Gi       RWO    Recycle  Available                                              29s

建立PVC

# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-log #PVC的名称
spec:
  accessModes:
    - ReadWriteOnce #PVC以read-write挂载到一个节点
  resources:
    requests:
      storage: 10Gi #PVC允许申请的大小

# kubectl apply  -f pvc.yaml 
persistentvolumeclaim/pvdata created

# kubectl get pvc
NAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-log   Bound    pv-data   10Gi       RWO                           18m

创建Deployment

# cat nginx.yaml 
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
          - containerPort: 80
        volumeMounts:
          - name: nginx   #申请pvc的名称,要和spec.volumes.name匹配
            mountPath: /var/log/nginx/  #pod内部的目录
            subPath: logs/nginx #挂载到pv目录下的logs/nginx,如不指定此参数则挂在到pv的/目录下
      volumes: 
      - name: nginx #申请的名称,要和spec.spec.containers.volumes.name匹配
        persistentVolumeClaim:  #PVC方式
          claimName: nginx-log  #PVC的名称

# ll /data/pvdata/log/nginx/
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 25 04:48 access.log
-rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 25 04:48 error.log
点赞

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据