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/
相关文章:
- Harbor 启动报错 502 Bad Gateway
- Kuerbernetes 1.11 集群二进制安装
- Kubernetes 1.14 二进制集群安装
- Kubernetes Init Container (初始化容器)