kubernetes

Kubernetes 持久化存储

2018-04-24  本文已影响1261人  猴子精h

介绍

k8s-pvc.png

对于管理计算资源,管理存储资源明显是一个另外的问题。 PersistentVolume 子系统为用户和管理提供了一个 API,该 API 将如何提供存储的细节抽象了出来。为此,我们引入了两个关于存储的新 API 资源:PersistentVolumePersistentVolumeClaim

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

PersistentVolumeClaim (PVC) 是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。声明的请求可以指定特定的大小,访问模式。

StorageClass 为管理员提供了描述存储类的方法。不同的 class 可能会映射到不同的服务质量等级或备份策略,或由群集管理员确定的任意策略。 Kubernetes 本身不清楚各种 class 代表的什么。这个概念在其他存储系统中有时被称为 "配置文件"。

配置

静态创建 PV

集群管理员创建一些 PV。它们带有可供集群用户使用的实际存储细节。PersistentVolume 类型以插件形式实现。Kubernetes 目前支持以下插件类型:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:             # 指定 PV 容量
    storage: 5Gi
  volumeMode: Filesystem  # 卷模式,除了文件系统,还支持原始块,Filesystem/Block
  accessModes: 
    - ReadWriteOnce   # 访问模式,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载), ReadOnlyMany(该卷可以被多个节点以只读模式挂载),ReadWriteMany(该卷可以被多个节点以读/写模式挂载)
  persistentVolumeReclaimPolicy: Recycle  # 回收策略,Retain(保留,手动回收),Recycle(回收,基本擦除), Delete(关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除)
  storageClassName: slow      # 存储类名。指定类名的 PV 需要与指定类名的 PVC 绑定
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: 172.17.0.2

动态创建 PV

当集群管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时。集群会基于 StorageClasse PVC 存储类 来创建 PV,并与 PersistentVolumeClaim 一一绑定。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: slow
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}
StorageClass 存储类说明

StorageClass 为管理员提供了描述存储类的方法。不同的 class 可能会映射到不同的服务质量等级或备份策略,或由群集管理员确定的任意策略。 Kubernetes 本身不清楚各种 class 代表的什么。这个概念在其他存储系统中有时被称为 "配置文件"。

StorageClass 中包含 provisioner、parameters 和 reclaimPolicy 字段,当 class 需要动态分配 PersistentVolume 时会使用到。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
mountOptions:
  - debug

provisioner: Storage class 有一个分配器,用来决定使用哪个卷插件分配 PV。该字段必须指定,详情请见:https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner

使用

在 Pod 中以 volume 的实行挂载。

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: dockerfile/nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim
上一篇下一篇

猜你喜欢

热点阅读