kubernetes-卷-记录

349 阅读19分钟

cephfs

允许将现有的fs挂载到pod中。在pod被删除时被保留,只是被卷卸载。

configMap

提供了向pod注入配置数据的方法。configMap对象可以被挂载为卷。


apiVersion: v1

kind: Pod

metadata:

  name: configmap-pod

spec:

  containers:

    - name: test

      image: busybox:1.28

      volumeMounts:

        - name: config-vol

          mountPath: /etc/config

  volumes:

    - name: config-vol

      configMap:

        name: log-config

        items:

          - key: log_level

            path: log_level

downloadAPI

在这类卷中,所公开的数据以纯文本格式的只读文件形式存在。

说明: 容器以 subPath 卷挂载方式使用 downward API 时,在字段值更改时将不能接收到它的更新。

emptyDir

emptyDir会随pod创建和删除。容器崩溃不好导致pod被从节点上移除。

emptyDir的一些用途:

  - 缓存空间

  - 耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。

  - 在web服务器容器服务数据时,保存内容管理器容器获取的文件。

emptyDir.medium字段用来控制emptyDir卷的存储位置。

fc(光纤通道)

允许将光纤通道块挂载到pod中。可以设置参数targetWWNs指定单个或多个目标WWN(World Wide Names)

hostPath

hostPath 存在安全风险,尽量避免使用HostPath。

hostPath的一些用法:

  - 允许需要访问docker内部机制的容器

  - 允许容器中运行cAdvisor

  - 允许Pod指定给定的hostPath在运行Pod之前是否应该存在。

可以指定的type如下:

|值|行为|

|---|---|

||空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。|

|DirectoryOrCreate|如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。|

|Directory|在给定路径上必须存在的目录。|

|FileOrCreate|如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。|

|File|在给定路径上必须存在的文件|

|Socket|在给定路径上必须存在的UNIX套接字|

|CharDevice|在给定路径上必须存在的字符设备|

|BlockDevice|在给定路径上必须存在的块设备|

host FileOrcreate模式不会负责创建文件的父目录。如果挂载的父级目录不存在,pod启动会失败。


apiVersion: v1

kind: Pod

metadata:

  name: test-webserver

spec:

  containers:

  - name: test-webserver

    image: registry.k8s.io/test-webserver:latest

    volumeMounts:

    - mountPath: /var/local/aaa

      name: mydir

    - mountPath: /var/local/aaa/1.txt

      name: myfile

  volumes:

  - name: mydir

    hostPath:

      # 确保文件所在目录成功创建。

      path: /var/local/aaa

      type: DirectoryOrCreate

  - name: myfile

    hostPath:

      path: /var/local/aaa/1.txt

      type: FileOrCreate

iscsi

能将iscsi卷挂载到pod中。只能单个写模式挂载,能够多个使用者读模式挂载。

local

代表某个被挂载的本地存储设备,例如:磁盘、分区或者目录。

只能用作静态创建的持久卷。不支持动态配置。

与hostPath相比,能以持久和可移植的方式使用,而无需手动将Pod调度到节点。通过查看PV的节点亲和性配置,就能了解卷的节点约束。

设置local卷时,需要设置PV的nodeAffinity属性。使用storageClass时建议设置volumeBindingMode为WaitForFirstConsumer。


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中。


apiVersion: v1

kind: Pod

metadata:

  name: test-pd

spec:

  containers:

  - image: registry.k8s.io/test-webserver

    name: test-container

    volumeMounts:

    - mountPath: /my-nfs-data

      name: test-volume

  volumes:

  - name: test-volume

    nfs:

      server: my-nfs-server.example.com

      path: /my-nfs-volume

      readOnly: true

persistentVolumeClaim

将持久卷PersistentVolume挂载到Pod中。

Portworx CSI 迁移

针对Portworx添加CSIMigration特性,在1.23中默认禁用,1.25中已进入Beta阶段,默认关闭。它将所有插件操作不在指向树内插件(In-Tree Plugin),转而指向容器存储接口(Container Storage Interface,CSI)驱动。要启用此特性,需要在kube-controller-manager 和kubelet中设置 CSIMigrationPortworx=true 。

rbd

允许将Rados块设备卷挂载到Pod中。rbd在删除Pod时被保存,卷只是被卸载。

只能单写多读形式安装。

RBD CSI 迁移

启用RBD的CSIMigration特性后,所有插件操作从现有的树内插件重定向到CSI驱动程序。要使用该特性需要启用xsiMigrationRBD

secret

用于给Pod传递敏感信息。以文件形式挂载到Pod中,由tmpfs(基于RAM的文件系统)提供存储。

vSphere CSI 迁移

在1.27中,对树内vsphereVolume类的所有操作都被重定向到csi.vsphere.vmware.com CSI驱动程序。

vSphere CSI驱动不支持:

  •  diskformat

  •  hostfailurestotolerate

  •  forceprovisioning

  •  cachereservation

  •  diskstripes

  •  objectspacereservation

  •  iopslimit

subPath

在单个Pod中共享卷以提供多方使用时很有用。volumeMounts.subPath属性用于指定所引用的卷内的子路径,而不是根路径。


apiVersion: v1

kind: Pod

metadata:

  name: my-lamp-site

spec:

    containers:

    - name: mysql

      image: mysql

      env:

      - name: MYSQL_ROOT_PASSWORD

        value: "rootpasswd"

      volumeMounts:

      - mountPath: /var/lib/mysql

        name: site-data

        subPath: mysql

    - name: php

      image: php:7.0-apache

      volumeMounts:

      - mountPath: /var/www/html

        name: site-data

        subPath: html

    volumes:

    - name: site-data

      persistentVolumeClaim:

        claimName: my-lamp-site-data

扩展环境变量的subPath

subPathExpr可以基于download API环境变量来构造subPath目录名。subPath和subPathExpr属性是互斥的。


apiVersion: v1

kind: Pod

metadata:

  name: pod1

spec:

  containers:

  - name: container1

    env:

    - name: POD_NAME

      valueFrom:

        fieldRef:

          apiVersion: v1

          fieldPath: metadata.name

    image: busybox:1.28

    command: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]

    volumeMounts:

    - name: workdir1

      mountPath: /logs

      # 包裹变量名的是小括号,而不是大括号

      subPathExpr: $(POD_NAME)

  restartPolicy: Never

  volumes:

  - name: workdir1

    hostPath:

      path: /var/log/pods

资源

emptyDir的存储介质由保存kubelet数据的根目录(/var/lib/kubelet)的文件系统的介质确定。

out-of-tree 卷插件

Out-of-tree卷插件包括容器存储接口(CSI)。使得存储供应商能够创建自定义存储插件。无需将插件源码添加kubernetes仓库。

CSI

容器存储接口为容器编排系统定义标准接口,以将任意系统暴露给它们的容器工作负载。

CSI的三种使用方式:

  • pvc对象引用

  • 一般性临时存卷

  • CSI临时卷,前提是驱动可以支持这种用法

CSI持久卷配置字段:

  • driver:指定卷驱动名称的字符串值

  • volumeHandle: 唯一标识卷的字符串值

  • readOnly: 一个可选的布尔值

  • fsType: 如果PV的VolumeMode为Filesystem,那么此字段指定挂载时应该使用的文件系统。

  • volumeAttributes: 一个字符串到字符串的映射表,用来设置卷的静态属性。

  • controllerPublishSecetRef: 对包敏感信息的secret对象的引用;该敏感信息会被传递给CSI驱动来完成CSI ControllerPublishVolume和ControllerUnpublishVolume调用。

  • nodeExpandSecretRef: 对包含敏感信息的Secret对象的引用。

  • nodePublishSecretRef: 对包含敏感信息的Secret对象的引用,该信息会传递CSI驱动以完成CSI NodeStageVolume调用。

  • nodeStageSecretRef: 对敏感信息的Secret对象的引用,该信息会传递给CSI驱动以完成CSI NodeStageVolume调用。

挂载卷的传播

挂载传播特性由Continer.volumeMounts中的mountPropagation字段控制。

  • None  不会感知到主机后续在此卷或其任何子目录上执行的挂载变化

  • HostToContainer 此卷挂载将会感知到主机后续针对卷或其任何子目录的挂载操作。

  • Bidirectional 这种挂载和HostToContainer 挂载表现相同。另外,容器创建的卷挂载将被传播回至主机和使用同一卷的所有Pod的所有容器。

Bidirectional可以破坏主机操作系统,因此只被允许特权容器中使用。

参考连接kubernetes-volumes

持久卷

持久卷(PersistentVolume,pv)是集群中的一块存储,可以由管理员事先制备,或者存储类(StorageClass)来动态制备。PV持久卷和普通Volume一样,使用卷插件来实现。

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与Pod类似。Pod消耗节点资源,PVC消耗PV资源。

制备

PV分为静态和动态制备

静态制备

集群管理员创建若干PV卷。这些卷带有真实存储的细节信息,对集群用户可见。

动态制备

基于StorageClass来实现的:PVC申领请求某个存储类,必须已经创建并配置该类才能动态制备PV。需要在API服务器上启用DefaultStorageClass准入控制器。可通过API server组件的--enable-admission-plugins标志值实现这点。

绑定

用户创建一个带有特定存储容量和特定访问模式需要的PVC对象;在动态制备场景下,制备的PVC和PV是一对一映射。如果找不到匹配的PV卷,PVC会无限期处于未绑定状态。当与之匹配的PV卷可用时,PVC申领会被绑定。

保护使用中的存储对象

当PVC为Terminating且Finalizers列表中包含kubernetes.io/pvc-protetion时,PVC处于被保护状态。

回收(Reclaiming)

当用户不再使用其存储卷时,可以从API中将PVC对象删除,从而允许该资源被回收再利用。PV的回收策略告诉集群,当其被从申领中释放时如何处理该数据卷。目前的几种状态Retained(保留)、Recycled(回收)或Deleted(删除)。

保留(Retain)

回收策略Retain使得用户可以手动回收资源。当PVC被删除时,PV卷任然存在,对应的数据卷被视为"以释放(released)"。需要手动回收该卷:

  • 删除PV。

  • 根据情况手动清除关联存储资产上的数据。

  • 手动删除关联的存储资产。

删除(Delete)

对于支持Delete回收策略的卷插件,删除动作将PV删除,同时移除关联的存储资产。动态制备的卷会继承StorageClass中设置的回收策略。默认为Delete。

PV删除保护finalizer

可以在PV上添加Finalizer,以确保只有在删除对应的存储后才删除具有Delete回收策略的PV。

kubernetes.io/pv-controller和external-provisioner.volume.Kubernetes.io/finalizer可被添加到动态制备的卷上。

预留PV

通过PVC中指定PV,可以声明特定PV与PVC之间的绑定关系。如果PV存在未被通过其claimRef字段预留给PVC,则该PV会和该PVC绑定到一起。绑定操作不会考虑某些卷匹配条件是否满足,包括节点亲和性等。任然会检查存储类、访问模式和请求的存储大小是否合法。

使用claimPolicy属性设置为Retain的PersistentVolume卷时,包括希望复用现有PV时,很有用。

扩充PVC申领

支持扩充类型的卷:

  • azureDisk

  • azureFile

  • awsElasticBlockStore

  • csi

  • flexVolume

  • gcePersistentDisk

  • rbd

  • portworxVolume

PVC的存储类中将allowVolumeExpansion设置为true时,才可以扩充该PVC。设置一个更大的尺寸值。这一操作会触发下层PV提供存储的卷的扩充。kubernetes不会创建新的PV来满足请求。现有的卷会被调整大小。

直接边际PV的大小可以阻止该卷自动调整大小。如果对PV的容量进行编辑,然后又对PVC的.spec进行编辑,使得PVC大小匹配PV的话,则不会发送存储大小调整。控制面观察到资源匹配,并认为其后备卷大小已手动增加,无需调整。

CSI卷扩充

CSI扩充能力默认启用,扩充CSI卷要求CSI驱动支持卷扩充操作。

重设包含文件系统的卷的大小

只有卷中包含文件系统是XFS、EXT3或EXT4时,才可以重设卷大小。当卷中包含文件系统时,只有Pod使用ReadWrite模式来使用PVC申领的情况下才能重设其文件系统的大小。文件系统扩充的操作可能是在Pod启动期间完成,或在下层文件系统支持在想扩充的前提下在Pod运行期间完成。

重设使用中PVC的大小

所有使用中的PVC在其文件系统被扩充后,立即可供Pod使用。此特性对于没有被Pod或Deployment使用的PVC是无效的。必须在执行扩展操作之前创建一个使用该PVC的Pod。

处理扩展卷过程失败

如果扩充下层存储失败,可以手动恢复PVC申领的状态并取消重设大小请求。否则会反复重试

  • 将绑定到PVC的PV标记为Retain回收策略

  • 删除PVC对象。由于PV的回收策略为Retain,我们不会重建PVC时丢失数据。

  • 删除PV规约中的claimRef,这样新的PVC可以绑定到该卷。这一操作会使得PV卷变为"可用(Available)"。

  • 使用小于PV卷大小的尺寸重建PVC,设置PVC的volumeName字段为PV卷的名称。这一操作将把新的PVC对象绑定到现有PV卷

  • 恢复PV卷上设置的回收策略。

通过请求扩展为更小尺寸。此特性为alpha特性。RecoverVolumeExpansionFailure必须被启用以允许使用此特性。

当开启此特性后可通过扩展更小尺寸重试扩展。可以通过编辑.spec.resources选择一个更小值。可通过查看.status.resizeStatus以及PVC上的事件来监控调整大小操作的状态。不支持将pvc缩小到小于当前的尺寸。

持久卷类型

  • cephfs

  • csi

  • fc

  • hostPath

  • iscsi

  • local

  • nfs

  • rbd

持久卷


apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv0003

spec:

  capacity:

    storage: 5Gi

  volumeMode: Filesystem

  accessModes:

    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Recycle

  storageClassName: slow

  mountOptions:

    - hard

    - nfsvers=4.1

  nfs:

    path: /tmp

    server: 172.17.0.2

卷模式支持两种:Filesystem和Block。默认Filesystem。

访问模式:ReadWriteOnce、ReadOnlyMany、ReadWriteMany、ReadWriteOncePod

卷访问模式并不能在存储已经被挂载的情况下实施写保护。

每个PV可以属于某个类,通过storageClassName属性设置为某个名称来指定。特定类的PV卷只能绑定到请求该类存储卷的PVC申领。

回收策略

  • Retain 手动回收

  • Recycle  基本擦除 rm -rf /thevolume/*

  • Delete   删除关联资产。目前仅NFS和HostPath支持回收(Recycle)

挂载类型选型

  • awsElasticBlockStore

  • azureDisk

  • azureFile

  • cephfs

  • gcePersistentDisk

  • iscsi

  • nfs

  • rbd

  • vsphereVolume

节点亲和性

可以通过设置节点亲和性来定义一些约束,限制从哪些节点上可以访问此卷。使用这些卷的Pod只会被调度到节点亲和性规则所选择的节点上执行。要设置节点亲和性,设置PV卷.spec中的nodeAffinity。

阶段

每个卷会处于以下阶段(Phase)之一:

  • Available(可用)卷是一个空闲资源,尚未绑定到任何申领

  • Bound(已绑定)该卷已经绑定到某申领

  • Released(已释放)所绑定的申领已被删除,但资源尚未被集群回收

  • Failed(失败)卷的自动回收操作失败

选择符

  • matchLabels  卷必须包含带有此值的标签

  • matchExpressions  通过设定键、值列表和操作符来构造的需求。合法的操作符有In、Notin、Exists和DoesNotExist。

通过storageclass.kubernetes.io/is-default-class赋值为true来完成。

基于block的卷


apiVersion: v1

kind: PersistentVolume

metadata:

  name: block-pv

spec:

  capacity:

    storage: 10Gi

  accessModes:

    - ReadWriteOnce

  volumeMode: Block

  persistentVolumeReclaimPolicy: Retain

  fc:

    targetWWNs: ["50060e801049cfd1"]

    lun: 0

    readOnly: false


apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: block-pvc

spec:

  accessModes:

    - ReadWriteOnce

  volumeMode: Block

  resources:

    requests:

      storage: 10Gi


apiVersion: v1

kind: Pod

metadata:

  name: pod-with-block-volume

spec:

  containers:

    - name: fc-container

      image: fedora:26

      command: ["/bin/sh", "-c"]

      args: [ "tail -f /dev/null" ]

      volumeDevices:

        - name: data

          devicePath: /dev/xvda

  volumes:

    - name: data

      persistentVolumeClaim:

        claimName: block-pvc

卷快照与卷克隆

卷快照(Volume Snapshot)与卷克隆都只支持树外CSI卷插件。

投射卷

一个projected可以将若干现有的卷映射到同一个目录上。

可被投射的资源:

  • secret

  • downwardAPI

  • configMap

  • serviceAccountToken

所有的卷源都要求处于Pod所在的同一个命名空间。


apiVersion: v1

kind: Pod

metadata:

  name: volume-test

spec:

  containers:

  - name: container-test

    image: busybox:1.28

    volumeMounts:

    - name: all-in-one

      mountPath: "/projected-volume"

      readOnly: true

  volumes:

  - name: all-in-one

    projected:

      sources:

      - secret:

          name: mysecret

          items:

            - key: username

              path: my-group/my-username

              mode: 755

      - downwardAPI:

          items:

            - path: "labels"

              fieldRef:

                fieldPath: metadata.labels

            - path: "cpu_limit"

              resourceFieldRef:

                containerName: container-test

                resource: limits.cpu

      - configMap:

          name: myconfigmap

          items:

            - key: config

              path: my-group/my-config

      - serviceAccountToken:

          audience: api

          expirationSeconds: 3600

          path: token

expirationSeconds字段是服务账号令牌预期的生命期长度。默认1小时,至少10分钟。也可以通过--service-account-max-token-expiration设置最大值上限。

Linux中SecurityContext设置RunAsUser属性的Pod中,投射文件具有正确的署主关系。kubelet将确保serviceAccountToken卷的内容归该用户所有,并且令牌文件的权限模式会被设置为0600。

临时卷

临时卷会遵从Pod的生命周期,与Pod一起创建和删除。Pod规约中,以内联方式定义,这简化了应用程序的部署和管理。

临时卷类型

支持的临时卷类型:

  • emptyDir:Pod启动时为空,存储空间来自kubelet根目录或内存,由kubelet管理。

  • configMap、downloadAPI、secret:将不同类型的Kubernetes数据注入到Pod中。由kubelet管理。

  • CSI临时卷:类似于前面的卷类型,但由专门支持此类型的指定CSI驱动程序提供。

  • 通用临时卷:它可以由所有支持持久卷的驱动程序提供

CSI临时卷必须由第三方CSI存储驱动程序提供。通用临时卷可以由第三方CSI存储驱动程序提供,也可以由支持动态制备的任何其他存储驱动程序提供。

CSI临时卷类似于configMap、downwardAPI和secret类型的卷:在各个本地节点管理卷的存储,并在Pod调度到节点后于其他本地资源一起创建。Pod的存储资源的限制只能由kubelet对其自己管理的存储强制执行。

CSI临时存储的Pod的清单:


kind: Pod

apiVersion: v1

metadata:

  name: my-csi-app

spec:

  containers:

    - name: my-frontend

      image: busybox:1.28

      volumeMounts:

      - mountPath: "/data"

        name: my-csi-inline-vol

      command: [ "sleep", "1000000" ]

  volumes:

    - name: my-csi-inline-vol

      csi:

        driver: inline.storage.kubernetes.io

        volumeAttributes:

          foo: bar

volumeAttributes决定驱动程序准备什么样的卷。

通用临时卷

类似于emptyDir卷,但也提供一些额外的特性:

  • 存储可以是本地的,也可以是网络连接的

  • 卷可以有固定的大小,Pod不能超量使用。

  • 卷可能有一些初始数据,这取决于驱动程序和参数

  • 支持典型的卷操作,前提是相关的驱动程序也支持该操作,包括快照、克隆、调整大小、存储容量跟踪。


kind: Pod

apiVersion: v1

metadata:

  name: my-app

spec:

  containers:

    - name: my-frontend

      image: busybox:1.28

      volumeMounts:

      - mountPath: "/scratch"

        name: scratch-volume

      command: [ "sleep", "1000000" ]

  volumes:

    - name: scratch-volume

      ephemeral:

        volumeClaimTemplate:

          metadata:

            labels:

              type: my-frontend-volume

          spec:

            accessModes: [ "ReadWriteOnce" ]

            storageClassName: "scratch-storage-class"

            resources:

              requests:

                storage: 1Gi

自动创建的PVC采取确定性的命名机制:Pod名称和卷名称的组合,中间由连字符-连接。

存储类

StorageClass包含provisioner、parameters和reclaimPolicy字段,这些字段会在StorageClass需要动态制备PersistentVolume时使用到。


apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  annotations:

    storageclass.kubernetes.io/is-default-class: false

  name: standard

provisioner: kubernetes.io/aws-ebs

parameters:

  type: gp2

reclaimPolicy: Retain

allowVolumeExpansion: true

mountOptions:

  - debug

volumeBindingMode: Immediate

回收策略

reclaimPolicy 字段中指定回收策略,默认是Delete,可以是Retain。

allowVolumeExpansion为可扩展 设置为true则可扩展。

mountOptions指定挂载选项,如果卷不支持挂载选项,指定后会失败。

绑定模式

volumeBindingMode字段控制了卷绑定和动态制备应该发生在什么时候。默认为Immediate模式。

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

可以通过WaitForFirstConsumer模式解决这个问题。


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

可以使用allowedTopologies设置制备拓扑结构。


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

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"

  • monitors: Ceph monitor,逗号分隔。该参数是必须的。

  • adminId: Ceph 客户端ID,用于在池ceph池中创建映像。默认admin

  • adminSecret: adminId的Secret名称。该参数为必须。提供的secret必须有值为"kubernetes.io/rbd"的type参数。

  • adminSecretNamespace:  adminSecret的命名空间。默认是default。

  • pool:CephRBD池。默认是"rbd"

  • userId: Ceph 客户端ID,用于映射RBD镜像。默认与adminId相同

  • userSecretName: 用于映射RBD镜像的userId的Ceph Secret的名字。必须与PVC存在于相同的namespace中。该参数是必须的。提供的secret必须具有值为"kubernetes.io/rbd"的type参数。

  • userSecretNamespace: userSecretName的命名空间。

  • fsType: Kubernetes 支持的fsType。默认为"ext4"

  • imageFormat: Ceph RBD 镜像格式,“1”或者“2”.默认为1

  • imageFeatures:可选参数,只能在imageFormat设置为2时才使用。目前功能只有layering。默认未打开。

动态卷

使用动态卷


apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: slow

provisioner: kubernetes.io/gce-pd

parameters:

  type: pd-standard

---

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: claim1

spec:

  accessModes:

    - ReadWriteOnce

  storageClassName: fast

  resources:

    requests:

      storage: 30Gi

设置默认StorageClass为默认,添加注解ingressclass.kubernetes.io/is-default-class: "true"

卷快照、卷快照class、CSI卷克隆

都基本都是要CSI,目前没有使用,就不记录了。

存储容量

从1.27开始对存储容量跟踪的集群级API支持。

API

两个API扩展接口:

  • CSIStorageCapacity对象:由CSI驱动程序在安装驱动程序的命名空间中产生。每个对象包含一个存储类的容量信息,并定义哪些节点可以访问该存储。

  • CSIDriverSpec.StorageCapacity字段:设置为true时,Kubernetes调度程序将考虑使用CSI驱动程序的卷的存储容量。

调度

存储容量信息将会被kubernetes调度程序使用:

  • Pod使用的卷还没有被创建

  • 卷使用引用了CSI驱动的StorageClass,并且使用了WaitForFirstConsumer卷绑定模式

  • 驱动程序的CSIDriver对象的StorageCapacity被设置为true

将卷的大小与CSIStorageCapacity对象中列出的容量进行比较,并使用包含该节点的拓扑。

对于有Immediate卷绑定模式的卷,存储驱动程序将决定在何处创建该卷,而不取决于将使用该卷的Pod。对于CSI临时卷,调度总是不在考虑存储容量的情况下进行。基于:该卷类型仅由节点本地的特殊CSI驱动程序使用,并且不需要大量资源。的考虑

单节点有卷数量限制。

卷健康监测

卷健康检测是CSI驱动从底层的存储系统着手,探测异常的卷状态,以事件的形式上报到PVC或Pod。

如果要启动节点失效监测功能,可以设置enable-node-watcher为true。