Kubernetes v1.25 引入了一个 Alpha 特性来更改默认 StorageClass 被分配到 PersistentVolumeClaim (PVC) 的方式。 启用此特性后,你不再需要先创建默认 StorageClass,再创建 PVC 来分配类。 此外,任何未分配 StorageClass 的 PVC 都可以在后续被更新。此特性在 Kubernetes v1.26 中已进阶至 Beta。
更改默认 StorageClass
启用这个 Alpha 特性后,管理员想要更改默认 StorageClass 时会有两个选项:
- 在移除与 PVC 关联的旧 StorageClass 之前,创建一个新的 StorageClass 作为默认值。 这将导致在短时间内出现两个默认值。此时,如果用户要创建一个 PersistentVolumeClaim, 并将 storageClassName 设置为 null(指代默认 StorageClass), 则最新的默认 StorageClass 将被选中并指定给这个 PVC。
- 先移除旧的默认值再创建一个新的默认 StorageClass。这将导致短时间内没有默认值。 接下来如果用户创建一个 PersistentVolumeClaim,并将 storageClassName 设置为 null (指代默认 StorageClass),则 PVC 将永远处于 Pending 状态。 一旦默认 StorageClass 可用,用户就不得不通过删除并重新创建 PVC 来修复这个问题。
如何启用
需要在kube-controller-manager
和 kube-apiserver
中使用 --feature-gates
配置启用
--feature-gates="...,RetroactiveDefaultStorageClass=true"
演示
创建一个PvC文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
在没有默认StorageClass存储时,PVC文件为Pending状态
$kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-1 Pending
我们需要将本地有的StorageClass 设置为默认存储
#查看storageClass
[root@k8s-master-01 ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-cephfs-sc cephfs.csi.ceph.com Delete Immediate true 2d23h
csi-rbd-sc rbd.csi.ceph.com Delete Immediate true 2d23h
local openebs.io/local Delete WaitForFirstConsumer false 8d
#变更为默认存储
kubectl patch local -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
#local为你的storageclass名称
实际上就是sc添加了下面的一行
storageclass.kubernetes.io/is-default-class: "true"
确认 PersistentVolumeClaims 现在已被正确制备,并且已使用新的默认 StorageClass
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-1 Bound pvc-06a964ca-f997-4780-8627-b5c3bf5a87d8 1Gi RWO local 87m
查看默认StorageClass已经被修改
$ kubectl get storageclass
NAME PROVISIONER AGE
local kubernetes.io/gce-pd 1d
官方文档:
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/change-default-storage-class/
https://kubernetes.io/zh-cn/blog/2023/01/05/retroactive-default-storage-class/