1:什么是存储类
存储类(StorageClass),首先我们要知道的是存储类是干吗用的,它可以帮我们自动创建PV与PVC(相对与Statefulset),其次就是我们创建PVC的时候可以指定SC之后它会帮我们去自动创建PV与存储进行对接,这就是我们要了解的SC。
2:什么是默认存储类
Kubernetes v1.25 引入了一个 Alpha 特性来更改默认 StorageClass 被分配到 PersistentVolumeClaim (PVC) 的方式。 启用此特性后,你不再需要先创建默认 StorageClass,再创建 PVC 来分配类。 此外,任何未分配 StorageClass 的 PVC 都可以在后续被更新。此特性在 Kubernetes v1.26 中已进阶至 Beta。
3:如何启用这个特性
启用这个 Alpha 特性后,管理员想要更改默认 StorageClass 时会有两个选项:
1:在移除与 PVC 关联的旧 StorageClass 之前,创建一个新的 StorageClass 作为默认值。 这将导致在短时间内出现两个默认值。此时,如果用户要创建一个 PersistentVolumeClaim, 并将 storageClassName 设置为 null(指代默认 StorageClass), 则最新的默认 StorageClass 将被选中并指定给这个 PVC。
2:先移除旧的默认值再创建一个新的默认 StorageClass。这将导致短时间内没有默认值。 接下来如果用户创建一个 PersistentVolumeClaim,并将 storageClassName 设置为 null (指代默认 StorageClass),则 PVC 将永远处于 Pending 状态。 一旦默认 StorageClass 可用,用户就不得不通过删除并重新创建 PVC 来修复这个问题。
需要在`kube-controller-manager `和 `kube-apiserver `中使用 --feature-gates 配置启用
--feature-gates="...,RetroactiveDefaultStorageClass=true"
# 这里我是sealos调用kubeadm部署的,所以我们直接去master节点上的/etc/kubernetes/manifests/去修改yaml,因为K8S自身的组件是以静态Pod的方式去部署的,是不受API-Server的控制的
[root@k-m-1 manifests]# cat kube-controller-manager.yaml | grep "feature-gates"
- --feature-gates=EphemeralContainers=true
- --feature-gates=RetroactiveDefaultStorageClass=true # 加这一行
[root@k-m-1 manifests]# cat kube-apiserver.yaml | grep "feature-gates"
- --feature-gates=EphemeralContainers=true
- --feature-gates=RetroactiveDefaultStorageClass=true # 加这一行
# 修改完之后如果集群是单api-server的话会有一小段时间重启API-Server,这会导致集群暂时无法连接,但是存在的服务依旧可用
[root@k-m-1 manifests]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-685796d95f-4j249 1/1 Running 5 (3h9m ago) 11h
calico-apiserver calico-apiserver-685796d95f-xppbk 1/1 Running 4 (3h9m ago) 11h
calico-system calico-kube-controllers-85666c5b94-2jl78 1/1 Running 2 (3h9m ago) 11h
calico-system calico-node-7z2nr 1/1 Running 1 (3h58m ago) 11h
calico-system calico-node-vc9x9 1/1 Running 1 (3h58m ago) 11h
calico-system calico-typha-856fc54685-z92mm 1/1 Running 1 (3h58m ago) 11h
calico-system csi-node-driver-bjm5b 2/2 Running 2 (3h58m ago) 11h
calico-system csi-node-driver-wdcf5 2/2 Running 2 (3h58m ago) 11h
kube-system coredns-565d847f94-w75lp 1/1 Running 1 (3h58m ago) 11h
kube-system coredns-565d847f94-xxxxz 1/1 Running 1 (3h58m ago) 11h
kube-system etcd-k-m-1 1/1 Running 1 (3h58m ago) 11h
kube-system kube-apiserver-k-m-1 1/1 Running 0 3h9m
kube-system kube-controller-manager-k-m-1 1/1 Running 0 3h8m
kube-system kube-proxy-7prlv 1/1 Running 1 (3h58m ago) 11h
kube-system kube-proxy-r78g4 1/1 Running 1 (3h58m ago) 11h
kube-system kube-scheduler-k-m-1 1/1 Running 2 (3h10m ago) 11h
kube-system kube-sealos-lvscare-k-w-1 1/1 Running 1 (3h58m ago) 11h
nfs-storage nfs-client-provisioner-6db786894d-49lvf 1/1 Running 6 (3h9m ago) 11h
tigera-operator tigera-operator-6675dc47f4-zgpvt 1/1 Running 0 3h7m
# 我这里部署的是NFS的存储作为sc,然后我们只做这些还不够,我们需要去部署sc的yaml内去加注解来说明它是默认的sc
[root@k-m-1 nfs]# cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
annotations:
# 这里注解说明了这个是默认的storageclass
storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs
parameters:
archiveOnDelete: "true"
然后我们部署一下这个SC,之后我们看看sc(会在sc的名称后出现default)
[root@k-m-1 nfs]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage (default) fuseim.pri/ifs Delete Immediate false 11h
# 可以看到sc后面出现了default,这样我们的默认sc存储类就配置好了,也可以使用下面的命令去更新sc
[root@k-m-1 nfs]# kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
4:测试默认存储类
既然我们做好了默认的存储类,那么我们肯定是要来测试一下这个特性的,我们来看看是否像我们所说的,部署一个pvc不需要指定storageclass了
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
可以看到上面的存储并没有指定sc的名称,以往我们这么做的话pvc的状态肯定是Pending,那么我们现在再试一下
[root@k-m-1 ~]# kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc created
[root@k-m-1 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc Bound pvc-9015b16a-875f-44a3-9076-4b83376bacee 1Gi RWO managed-nfs-storage 3s
从这里我们看出了,它的storageclass默认绑定给了NFS,也就是默认绑定了我们设置的默认sc,然后状态也是绑定了,也就说明了,sc已经创建出PV与pvc进行绑定了,那么这里就是我们这次文章来说明的`default storage class`的特性了
# 注:这个时候肯定会有人问,如果我有多个默认的SC怎么办,来看看结果
[root@k-m-1 ~]# kubectl apply -f pvc.yaml
Error from server (Forbidden): error when creating "pvc.yaml": persistentvolumeclaims "pvc" is forbidden: Internal error occurred: 2 default StorageClasses were found
# 直接就告诉你:你的创建被禁止了,因为发现了两个默认的存储类,而PVC无法确定用哪儿个StorageClass来创建PVC,你需要自己手动指定一个,那么这个时候就不再适合使用默认的StorageClass了,默认大家都懂,大多数情况下都只是一个,所以这个问题大家是不必担心的