创新互联kubernetes教程:Kubernetes存储类

介绍

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

StorageClass 资源

每个 StorageClass 都包含 ​provisioner​、​parameters ​和 ​reclaimPolicy ​字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。

管理员可以为没有申请绑定到特定 StorageClass 的 PVC 指定一个默认的存储类。

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

存储制备器 

每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。

卷插件 内置制备器 配置例子
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
FlexVolume - -
Flocker -
GCEPersistentDisk GCE PD
Glusterfs Glusterfs
iSCSI - -
Quobyte Quobyte
NFS - NFS
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
ScaleIO ScaleIO
StorageOS StorageOS
Local - Local

你不限于指定此处列出的 "内置" 制备器(其名称前缀为 "kubernetes.io" 并打包在 Kubernetes 中)。 你还可以运行和指定外部制备器,这些独立的程序遵循由 Kubernetes 定义的 规范。 外部供应商的作者完全可以自由决定他们的代码保存于何处、打包方式、运行方式、使用的插件(包括 Flex)等。 代码仓库 kubernetes-sigs/sig-storage-lib-external-provisioner 包含一个用于为外部制备器编写功能实现的类库。你可以访问代码仓库  kubernetes-sigs/sig-storage-lib-external-provisioner 了解外部驱动列表。

例如,NFS 没有内部制备器,但可以使用外部制备器。 也有第三方存储供应商提供自己的外部制备器。

回收策略

由 StorageClass 动态创建的 PersistentVolume 会在类的 ​reclaimPolicy ​字段中指定回收策略,可以是 ​Delete ​或者 ​Retain​。如果 StorageClass 对象被创建时没有指定 ​reclaimPolicy​,它将默认为 ​Delete​。

通过 StorageClass 手动创建并管理的 PersistentVolume 会使用它们被创建时指定的回收政策。

允许卷扩展

FEATURE STATE: Kubernetes v1.11 [beta]

PersistentVolume 可以配置为可扩展。将此功能设置为 ​true ​时,允许用户通过编辑相应的 PVC 对象来调整卷大小。

当下层 StorageClass 的 ​allowVolumeExpansion ​字段设置为 true 时,以下类型的卷支持卷扩展。

卷类型 Kubernetes 版本要求
gcePersistentDisk 1.11
awsElasticBlockStore 1.11
Cinder 1.11
glusterfs 1.11
rbd 1.11
Azure File 1.11
Azure Disk 1.11
Portworx 1.11
FlexVolume 1.13
CSI 1.14 (alpha), 1.16 (beta)

此功能仅可用于扩容卷,不能用于缩小卷。

挂载选项

由 StorageClass 动态创建的 PersistentVolume 将使用类中 ​mountOptions ​字段指定的挂载选项。

如果卷插件不支持挂载选项,却指定了挂载选项,则制备操作会失败。 挂载选项在 StorageClass 和 PV 上都不会做验证,如果其中一个挂载选项无效,那么这个 PV 挂载操作就会失败。

卷绑定模式

volumeBindingMode ​字段控制了卷绑定和动态制备 应该发生在什么时候。

默认情况下,​Immediate ​模式表示一旦创建了 PersistentVolumeClaim 也就完成了卷绑定和动态制备。 对于由于拓扑限制而非集群所有节点可达的存储后端,PersistentVolume 会在不知道 Pod 调度要求的情况下绑定或者制备。

集群管理员可以通过指定 ​WaitForFirstConsumer ​模式来解决此问题。 该模式将延迟 PersistentVolume 的绑定和制备,直到使用该 PersistentVolumeClaim 的 Pod 被创建。 PersistentVolume 会根据 Pod 调度约束指定的拓扑来选择或制备。这些包括但不限于 资源需求、 节点筛选器、 pod 亲和性和互斥性、 以及污点和容忍度。

以下插件支持动态供应的 ​WaitForFirstConsumer ​模式:

以下插件支持预创建绑定 PersistentVolume 的 ​WaitForFirstConsumer ​模式:

FEATURE STATE: Kubernetes v1.17 [stable]

动态配置和预先创建的 PV 也支持 CSI卷, 但是你需要查看特定 CSI 驱动程序的文档以查看其支持的拓扑键名和例子。

如果你选择使用 ​
WaitForFirstConsumer​,请不要在 Pod 规约中使用 ​
nodeName ​来指定节点亲和性。 如果在这种情况下使用 ​
nodeName​,Pod 将会绕过调度程序,PVC 将停留在 ​
pending ​状态。

相反,在这种情况下,你可以使用节点选择器作为主机名,如下所示

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  nodeSelector:
    kubernetes.io/hostname: kube-01
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

允许的拓扑结构 

FEATURE STATE: Kubernetes v1.12 [beta]

当集群操作人员使用了 ​WaitForFirstConsumer ​的卷绑定模式, 在大部分情况下就没有必要将制备限制为特定的拓扑结构。 然而,如果还有需要的话,可以使用 ​allowedTopologies​。

这个例子描述了如何将供应卷的拓扑限制在特定的区域,在使用时应该根据插件 支持情况替换 ​zone ​和 ​zones ​参数。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - us-central-1a
    - us-central-1b

参数

Storage Classes 的参数描述了存储类的卷。取决于制备器,可以接受不同的参数。 例如,参数 type 的值 io1 和参数 iopsPerGB 特定于 EBS PV。 当参数被省略时,会使用默认值。

一个 StorageClass 最多可以定义 512 个参数。这些参数对象的总长度不能 超过 256 KiB, 包括参数的键和值。

AWS EBS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4

zone ​和 ​zones ​已被弃用并被 允许的拓扑结构 取代。

GCE PD 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
   fstype: ext4
  replication-type: none

如果 ​replication-type​ 设置为 ​none​,会制备一个常规(当前区域内的)持久化磁盘。

如果 ​replication-type​ 设置为 ​regional-pd​,会制备一个 区域性持久化磁盘(Regional Persistent Disk)。

强烈建议设置 ​volumeBindingMode: WaitForFirstConsumer​,这样设置后, 当你创建一个 Pod,它使用的 PersistentVolumeClaim 使用了这个 StorageClass, 区域性持久化磁盘会在两个区域里制备。 其中一个区域是 Pod 所在区域。 另一个区域是会在集群管理的区域中任意选择。磁盘区域可以通过 ​allowedTopologies ​加以限制。

zone ​和 ​zones ​已被弃用并被 allowedTopologies 取代。

Glusterfs

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://127.0.0.1:8081"
  clusterid: "630372ccdc720a92c681fb928f27b53f"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:3"
kubectl create secret generic heketi-secret \
  --type="kubernetes.io/glusterfs" --from-literal=key='opensesame' \
  --namespace=default

Secret 的例子可以在 glusterfs-provisioning-secret.yaml 中找到。

NFS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs
provisioner: cdxwcx.com/external-nfs
parameters:
  server: nfs-server.cdxwcx.com
  path: /share
  readOnly: "false"

Kubernetes 不包含内部 NFS 驱动。你需要使用外部驱动为 NFS 创建 StorageClass。 这里有些例子:

OpenStack Cinder 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gold
provisioner: kubernetes.io/cinder
parameters:
  availability: nova

FEATURE STATE: Kubernetes 1.11 [deprecated]

OpenStack 的内部驱动已经被弃用。请使用  OpenStack 的外部云驱动。

vSphere

vSphere 存储类有两种制备器

树内制备器已经被 弃用。

CSI 制备器

vSphere CSI StorageClass 制备器在 Tanzu Kubernetes 集群下运行。示例请参 vSphere CSI 仓库。

vCP 制备器

以下示例使用 VMware Cloud Provider (vCP) StorageClass 调度器

  1. 使用用户指定的磁盘格式创建一个 StorageClass。
  2. apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/vsphere-volume
    parameters:
      diskformat: zeroedthick

    diskformat​: ​thin​, ​zeroedthick ​和 ​eagerzeroedthick​。默认值: ​"thin"​。

  3. 在用户指定的数据存储上创建磁盘格式的 StorageClass。
  4. apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/vsphere-volume
    parameters:
        diskformat: zeroedthick
        datastore: VSANDatastore

    datastore​:用户也可以在 StorageClass 中指定数据存储。 卷将在 storage class 中指定的数据存储上创建,在这种情况下是 ​VSANDatastore​。 该字段是可选的。 如果未指定数据存储,则将在用于初始化 vSphere Cloud Provider 的 vSphere 配置文件中指定的数据存储上创建该卷。

  5. Kubernetes 中的存储策略管理

有几个 vSphere 例子 供你在 Kubernetes for vSphere 中尝试进行持久卷管理。

Ceph RBD 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/rbd
parameters:
  monitors: 10.16.153.105:6789
  adminId: kube
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: kube
  userSecretName: ceph-secret-user
  userSecretNamespace: default
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"

Quobyte 

FEATURE STATE: Kubernetes v1.22 [deprecated]

Quobyte 树内(in-tree)存储插件已弃用, 你可以在 Quobyte CSI 仓库中找到用于树外(out-of-tree)Quobyte 插件的 ​StorageClass ​示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: slow
provisioner: kubernetes.io/quobyte
parameters:
    quobyteAPIServer: "http://138.68.74.142:7860"
    registry: "138.68.74.142:7861"
    adminSecretName: "quobyte-admin-secret"
    adminSecretNamespace: "kube-system"
    user: "root"
    group: "root"
    quobyteConfig: "BASE"
    quobyteTenant: "DEFAULT"

Azure 磁盘

Azure Unmanaged Disk Storage Class(非托管磁盘存储类)

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: slow
provisioner: kubernetes.io/azure-disk
parameters:
  skuName: Standard_LRS
  location: eastus
  storageAccount: azure_storage_account_name

Azure 磁盘 Storage Class(从 v1.7.2 开始)

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: slow
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Standard_LRS
  kind: managed

Azure 文件

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azurefile
provisioner: kubernetes.io/azure-file
parameters:
  skuName: Standard_LRS
  location: eastus
  storageAccount: azure_storage_account_name

在存储制备期间,为挂载凭证创建一个名为 ​secretName ​的 Secret。如果集群同时启用了 RBAC 和 控制器角色, 为 ​system:controller:persistent-volume-binder​ 的 clusterrole 添加 ​Secret ​资源的 ​create ​权限。

在多租户上下文中,强烈建议显式设置 ​secretNamespace ​的值,否则 其他用户可能会读取存储帐户凭据。

Portworx 卷 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: portworx-io-priority-high
provisioner: kubernetes.io/portworx-volume
parameters:
  repl: "1"
  snap_interval:   "70"
  priority_io:  "high"

ScaleIO 

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: slow
provisioner: kubernetes.io/scaleio
parameters:
  gateway: https://192.168.99.200:443/api
  system: scaleio
  protectionDomain: pd0
  storagePool: sp1
  storageMode: ThinProvisioned
  secretRef: sio-secret
  readOnly: "false"
  fsType: xfs

ScaleIO Kubernetes 卷插件需要配置一个 Secret 对象。 Secret 必须用 ​kubernetes.io/scaleio​ 类型创建,并与引用它的 PVC 所属的名称空间使用相同的值。如下面的命令所示:

kubectl create secret generic sio-secret --type="kubernetes.io/scaleio" \
  --from-literal=username=sioadmin --from-literal=password=d2NABDNjMA== \
  --namespace=default

StorageOS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/storageos
parameters:
  pool: default
  description: Kubernetes volume
  fsType: ext4
  adminSecretNamespace: default
  adminSecretName: storageos-secret

StorageOS Kubernetes 卷插件可以使 Secret 对象来指定用于访问 StorageOS API 的端点和凭据。 只有当默认值已被更改时,这才是必须的。 Secret 必须使用 ​kubernetes.io/storageos​ 类型创建,如以下命令:

kubectl create secret generic storageos-secret \
--type="kubernetes.io/storageos" \
--from-literal=apiAddress=tcp://localhost:5705 \
--from-literal=apiUsername=storageos \
--from-literal=apiPassword=storageos \
--namespace=default

用于动态制备卷的 Secret 可以在任何名称空间中创建,并通过 ​adminSecretNamespace ​参数引用。 预先配置的卷使用的 Secret 必须在与引用它的 PVC 在相同的名称空间中。

本地

FEATURE STATE: Kubernetes v1.14 [stable]

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

本地卷还不支持动态制备,然而还是需要创建 StorageClass 以延迟卷绑定, 直到完成 Pod 的调度。这是由 ​WaitForFirstConsumer ​卷绑定模式指定的。

延迟卷绑定使得调度器在为 PersistentVolumeClaim 选择一个合适的 PersistentVolume 时能考虑到所有 Pod 的调度限制。


本文题目:创新互联kubernetes教程:Kubernetes存储类
文章分享:http://www.turtgq.com/article/cddiojj.html

其他资讯