Kubernetes设置默认存储类

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了,默认大家都懂,大多数情况下都只是一个,所以这个问题大家是不必担心的
posted @ 2023-05-01 18:44  Layzer  阅读(1136)  评论(0编辑  收藏  举报