6.3. 定义存储类
StorageClass
对象目前是一个全局范围的对象,必须由 cluster-admin
或 storage-admin
用户创建。
根据使用的平台,Cluster Storage Operator 可能会安装一个默认的存储类。这个存储类由 Operator 拥有和控制。不能在定义注解和标签之外将其删除或修改。如果需要实现不同的行为,则必须定义自定义存储类。
以下小节描述了 StorageClass
对象的基本定义,以及每个支持的插件类型的具体示例。
6.3.1. 基本 StorageClass
对象定义
以下资源显示了用来配置存储类的参数和默认值。这个示例使用 AWS ElasticBlockStore (EBS) 对象定义。
StorageClass
定义示例
kind: StorageClass 1 apiVersion: storage.k8s.io/v1 2 metadata: name: gp2 3 annotations: 4 storageclass.kubernetes.io/is-default-class: 'true' ... provisioner: kubernetes.io/aws-ebs 5 parameters: 6 type: gp2 ...
6.3.2. 存储类注解
要将存储类设置为集群范围的默认值,请在存储类元数据中添加以下注解:
storageclass.kubernetes.io/is-default-class: "true"
例如:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" ...
这将使任何没有指定特定卷的 PVC 通过默认的存储类被自动置备。
beta 注解 storageclass.beta.kubernetes.io/is-default-class
当前仍然可用,但将在以后的版本中被删除。
要设置存储类描述,请在存储类元数据中添加以下注解:
kubernetes.io/description: My Storage Class Description
例如:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: kubernetes.io/description: My Storage Class Description ...
6.3.3. RHOSP Cinder 对象定义
cinder-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: gold provisioner: kubernetes.io/cinder parameters: type: fast 1 availability: nova 2 fsType: ext4 3
6.3.4. AWS Elastic Block Store (EBS) 对象定义
aws-ebs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/aws-ebs parameters: type: io1 1 iopsPerGB: "10" 2 encrypted: "true" 3 kmsKeyId: keyvalue 4 fsType: ext4 5
6.3.5. Azure Disk 对象定义
azure-advanced-disk-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: managed-premium annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: kubernetes.io/azure-disk volumeBindingMode: WaitForFirstConsumer 1 allowVolumeExpansion: true parameters: kind: Managed 2 storageaccounttype: Premium_LRS 3 reclaimPolicy: Delete
- 1
- 强烈建议使用
WaitForFirstConsumer
。这会置备卷,同时允许有足够的存储空间从可用区将 pod 调度到空闲 worker 节点上。 - 2
- 可能的值有
Shared
(默认)、Managed
和Dedicated
。重要红帽仅在存储类中支持使用
kind: Managed
。使用
Shared
和Dedicated
时,Azure 会创建非受管磁盘,而 OpenShift Container Platform 为机器 OS(root)磁盘创建一个受管磁盘。但是,因为 Azure Disk 不允许在节点上同时使用受管和非受管磁盘,所以使用Shared
或Dedicated
创建的非受管磁盘无法附加到 OpenShift Container Platform 节点。 - 3
- Azure 存储帐户 SKU 层。默认为空。请注意,高级虚拟机可以同时附加
Standard_LRS
和Premium_LRS
磁盘,标准虚拟机只能附加Standard_LRS
磁盘,受管虚拟机只能附加受管磁盘,非受管虚拟机则只能附加非受管磁盘。-
如果
kind
设为Shared
,Azure 会在与集群相同的资源组中的几个共享存储帐户下创建所有未受管磁盘。 -
如果
kind
设为Managed
,Azure 会创建新的受管磁盘。 如果
kind
设为Dedicated
,并且指定了StorageAccount
,Azure 会将指定的存储帐户用于与集群相同的资源组中新的非受管磁盘。为此,请确保:- 指定的存储帐户必须位于同一区域。
- Azure Cloud Provider 必须具有存储帐户的写入权限。
-
如果
kind
设为Dedicated
,并且未指定StorageAccount
,Azure 会在与集群相同的资源组中为新的非受管磁盘创建一个新的专用存储帐户。
-
如果
6.3.6. Azure File 对象定义
Azure File 存储类使用 secret 来存储创建 Azure File 共享所需的 Azure 存储帐户名称和存储帐户密钥。这些权限是在以下流程中创建的。
流程
定义允许创建和查看 secret 的
ClusterRole
对象:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # name: system:azure-cloud-provider name: <persistent-volume-binder-role> 1 rules: - apiGroups: [''] resources: ['secrets'] verbs: ['get','create']
- 1
- 要查看并创建 secret 的集群角色名称。
将集群角色添加到服务帐户:
$ oc adm policy add-cluster-role-to-user <persistent-volume-binder-role> system:serviceaccount:kube-system:persistent-volume-binder
创建 Azure File
StorageClass
对象:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <azure-file> 1 provisioner: kubernetes.io/azure-file parameters: location: eastus 2 skuName: Standard_LRS 3 storageAccount: <storage-account> 4 reclaimPolicy: Delete volumeBindingMode: Immediate
- 1
- 存储类的名称。持久性卷声明使用此存储类来置备关联的持久性卷。
- 2
- Azure 存储帐户的位置,如
eastus
。默认为空,表示将在 OpenShift Container Platform 集群的位置创建新的 Azure 存储帐户。 - 3
- Azure 存储帐户的 SKU 层,如
Standard_LRS
。默认为空,表示将使用Standard_LRS
SKU 创建新的 Azure 存储帐户。 - 4
- Azure 存储帐户的名称。如果提供了存储帐户,则忽略
skuName
和location
。如果没有提供存储帐户,则存储类会为任何与定义的skuName
和location
匹配的帐户搜索与资源组关联的存储帐户。
6.3.6.1. 使用 Azure File 时的注意事项
默认 Azure File 存储类不支持以下文件系统功能:
- 符号链接
- 硬链接
- 扩展属性
- 稀疏文件
- 命名管道
另外,Azure File 挂载目录的所有者用户标识符 (UID) 与容器的进程 UID 不同。可在 StorageClass
对象中指定 uid
挂载选项来定义用于挂载的目录的特定用户标识符。
以下 StorageClass
对象演示了修改用户和组标识符,以及为挂载的目录启用符号链接。
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azure-file mountOptions: - uid=1500 1 - gid=1500 2 - mfsymlinks 3 provisioner: kubernetes.io/azure-file parameters: location: eastus skuName: Standard_LRS reclaimPolicy: Delete volumeBindingMode: Immediate
6.3.7. GCE PersistentDisk (gcePD) 对象定义
gce-pd-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard 1
replication-type: none
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete
- 1
- 选择
pd-standard
或pd-ssd
。默认为pd-standard
。
6.3.8. VMware vSphere 对象定义
vsphere-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/vsphere-volume 1 parameters: diskformat: thin 2
- 1
- 有关在 OpenShift Container Platform 中使用 VMware vSphere 的详情,请参阅 VMware vSphere 文档。
- 2
diskformat
:thin
、zeroedthick
和eagerzeroedthick
都是有效的磁盘格式。如需有关磁盘格式类型的更多详情,请参阅 vSphere 文档。默认值为thin
。
6.3.9. Red Hat OpenShift Container Storage 对象定义
使用 Red Hat OpenShift Container Storage 时,当从 Operator Hub 部署 Red Hat OpenShift Container Storage 4.4 时,会创建动态卷置备的存储类,如 验证是否创建并列出了存储类所述。