持久卷的类型

PV 持久卷是用插件的形式来实现的。Kubernetes 目前支持以下插件:

  • csi - 容器存储接口 (CSI)
  • fc - Fibre Channel (FC) 存储
  • hostPath - HostPath 卷 (仅供单节点测试使用;不适用于多节点集群;请尝试使用 local 卷作为替代)
  • iscsi - iSCSI (SCSI over IP) 存储
  • local - 节点上挂载的本地存储设备
  • nfs - 网络文件系统 (NFS) 存储

以下的持久卷已被弃用。这意味着当前仍是支持的,但是 Kubernetes 将来的发行版会将其移除。

  • azureFile - Azure File (于 v1.21 弃用)
  • flexVolume - FlexVolume (于 v1.23 弃用)
  • portworxVolume - Portworx 卷 (于 v1.25 弃用)
  • vsphereVolume - vSphere VMDK 卷 (于 v1.19 弃用)
  • cephfs - CephFS 卷 (于 v1.28 弃用)
  • rbd - Rados Block Device (RBD) 卷 (于 v1.28 弃用)

旧版本的 Kubernetes 仍支持这些“树内(In-Tree)”持久卷类型:

  • awsElasticBlockStore - AWS Elastic Block Store (EBS) (v1.27 开始不可用)
  • azureDisk - Azure Disk (v1.27 开始不可用)
  • cinder - Cinder (OpenStack block storage) (v1.27 开始不可用)
  • photonPersistentDisk - Photon 控制器持久化盘。(从 v1.15 版本开始将不可用)
  • scaleIO - ScaleIO 卷(v1.21 之后不可用)
  • flocker - Flocker 存储 (v1.25 之后不可用)
  • quobyte - Quobyte 卷 (v1.25 之后不可用)
  • storageos - StorageOS 卷 (v1.25 之后不可用)

常见回收策略:

  • 回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim
    对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。
    由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。
  • 回收策略 Delete 可以让卷插件自动回收资源,删除动作会将 PersistentVolume 对象从 Kubernetes
    中移除,同时也会从外部基础设施中移除所关联的存储资产。
  • 回收策略 Recycle (已经废弃)会在卷上执行一些基本的擦除 (rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。

local卷

本地存储类型的PV是Kubernetes中一种比较特殊的持久化存储,它允许将节点上的本地磁盘或目录用作PV。与其他PV类型(例如NFS、Ceph或云存储)不同,本地存储类型的PV直接使用节点上的存储资源,因此具有更低的延迟和更高的性能。

使用本地存储类型的PV时,需注意以下几个关键点:

  • 节点特性:本地存储类型的PV与特定的节点绑定,因为它直接使用节点上的存储资源。
  • 数据持久性:由于本地存储类型的PV与特定节点关联,当该节点发生故障时,存储在PV中的数据可能无法访问。
  • 调度限制:Pod使用本地存储类型的Persistent Volume
    Claim(PVC)时,Kubernetes会尝试将Pod调度到关联PV的节点上。
  • 回收策略:当PVC被删除时,PV的回收策略将决定如何处理关联的本地存储。

示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/ssd1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - example-node

nfs卷

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    path: /data/kubernetes
    server: 192.168.129.128

StorageClass

StorageClass(SC)的主要作用在于,自动创建PV,从而实现PVC按需自动绑定PV。
下面我们通过创建一个基于NFS的SC来演示SC的作用。
要想使用NFS的SC,还需要安装一个NFS provisioner,provisioner里会定义NFS相关的信息(服务器IP、共享目录等)

部署步骤:

helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo update
helm install nfs-client-provisioner stable/nfs-client-provisioner --set storageClass.name=nfs-client --set nfs.server=192.168.129.128 --set nfs.path=/data/kubernetes --set storageClass.defaultClass=true

创建pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfspvc
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi

创建pod:

apiVersion: v1
kind: Pod
metadata:
  name: nfspod
spec:
  containers:
  - name: nfspod
    image: nginx:1.23.2
    volumeMounts:
    - name: nfspv
      mountPath: "/usr/share/nginx/html"
  volumes:
  - name: nfspv
    persistentVolumeClaim:
      claimName: nfspvc
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐