k8s 存储类storageclass

 StorageClass 概念

常见的动态卷制备器及其清单文件位置:

  1. NFS Provisioner:

  2. Ceph RBD Provisioner:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow   //sc  名称
provisioner: kubernetes.io/gce-pd  //制备器,是用什么后端存储创建pv
parameters:
  type: pd-standard
  fstype: ext4
  cachingmode: none
reclaimPolicy: Delete     //回收策略
allowVolumeExpansion: true   //允许扩容
mountOptions:
- debug
  1. provisioner: kubernetes.io/gce-pd

    • 指定了这个 StorageClass 使用 kubernetes.io/gce-pd 作为 provisioner,也就是 Google Compute Engine Persistent Disk。
  2. parameters

    • 这里定义了 Persistent Volume 的一些参数:
      • type: pd-standard: 使用标准型 Persistent Disk
      • fstype: ext4: 文件系统类型为 ext4
      • cachingmode: none: 禁用缓存
  3. reclaimPolicy: Delete

    • 定义了当 Persistent Volume 被释放时的回收策略为 Delete,即删除 PV。也可以设置保留:Retain
  4. allowVolumeExpansion: true

    • 允许对该 StorageClass 创建的 Persistent Volume 进行扩容。
  5. mountOptions

    • 定义了挂载 Persistent Volume 时的额外挂载选项,这里设置了 debug 选项。

provisioner:制备器,关联存储设备,决定是用什么存储创建pv。

问题解决: 

更换制备器镜像版本,不然pv创建不出来。pvc一直pending

1.20版本之后,k8s把功能关掉了

解决方法:任选其中一个,这里选择更换镜像版本

1. 更换镜像

2. apiserver 修改参数

 修改参数

测试阶段

创建制备器

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 192.168.43.111
            - name: NFS_PATH
              value: /data/nfssc
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.43.111
            path: /data/nfssc

 创建sc

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "true"  # 当 PVC 被删除时如何处理底层的存储卷.true:不会被删除,而是被移动到一个指定的归档目录中;false: 当 PVC 被删除后,其中的所有数据都会被完全清除
  type: pd-standard
  fstype: ext4   # 文件系统为ext4,此配置仅对块存储有效。对于nfs制备器,不生效。
  cachingmode: readwrite   # "none" 表示不使用缓存,"readonly" 表示只读缓存,"readwrite" 表示读写缓存。
reclaimPolicy: Retain
allowVolumeExpansion: true #允许扩容

]# kubectl   get sc
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Retain          Immediate           true                   6s

创建制备器
]# kubectl get pod -A
NAMESPACE              NAME                                         READY   STATUS             RESTARTS   AGE
default                nfs-client-provisioner-854b558545-wkn4c      0/1     ImagePullBackOff   0          5m58s
fstype: ext4 参数解释
  • parameters.fstype=ext4 的含义:

    • 在存储类中,fstype 参数定义了底层卷的文件系统类型(如 ext4xfs)。
    • 这里的设置主要适用于支持块存储(如 AWS EBS、GCE Persistent Disk)。然而,在 NFS 的情况下,fstype 并不起作用,因为 NFS 是一个网络文件系统,其客户端会将其挂载为 nfsnfs4 类型。
    • 所以,即使在 StorageClass 中设置 fstype=ext4,容器内挂载的文件系统类型仍为 nfs4,因为您使用的是 NFS 子目录外部动态提供者 (nfs-subdir-external-provisioner)。
示例
进入容器
/prometheus $ df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
overlay              overlay        47.0G     15.9G     31.1G  34% /
tmpfs                tmpfs          64.0M         0     64.0M   0% /dev
tmpfs                tmpfs           1.9G         0      1.9G   0% /sys/fs/cgroup
192.168.43.131:/data/loki/monitor-prometheus-data-pvc-pvc-1d2d246f-378d-457e-b165-b1847849ae98/prometheus
                     nfs4           47.0G     15.9G     31.1G  34% /prometheus

 

 扩容报错信息
应该是nfs-provisioner不支持动态扩容
kubectl describe pvc -n monitor
Name:          prometheus-data-pvc
Namespace:     monitor
StorageClass:  nfs-client
Status:        Bound
Volume:        pvc-1d2d246f-378d-457e-b165-b1847849ae98
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      6Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       prometheus-7744946b88-c9snp
Events:
  Type     Reason             Age   From           Message
  ----     ------             ----  ----           -------
  Warning  ExternalExpanding  15m   volume_expand  Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.

创建pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

]# kubectl   apply -f test-claim.yaml
persistentvolumeclaim/test-claim created

[root@master-1 deploy]# kubectl   get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-367f69cc-6602-432c-8ef5-aea7f269b827   1Mi        RWX            nfs-client     6s

去nfs查看目录
]# pwd
/data/nfssc
]# ls
default-test-claim-pvc-367f69cc-6602-432c-8ef5-aea7f269b827

创建pod

测试创建pod
]# cat test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox:stable
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim
# 查看容器状态,这个应该是执行完成了任务,自动退出了,属于正常 ]# kubectl
get pod NAME READY STATUS RESTARTS AGE ingress-nginx-controller-tv296 0/1 CrashLoopBackOff 21 30h nfs-client-provisioner-6b968bd894-k8rdn 1/1 Running 0 6m1s test-pod 0/1 Completed 0 2m52s

 查看pvc

]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
pvc-367f69cc-6602-432c-8ef5-aea7f269b827   1Mi        RWX            Retain           Bound    default/test-claim   nfs-client              6m44s

[root@master-1 deploy]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-367f69cc-6602-432c-8ef5-aea7f269b827   1Mi        RWX            nfs-client     6m54s

扩容pv

  • 确保存储类支持动态扩容

    • 存储类 (StorageClass) 必须启用了扩容功能,且其 allowVolumeExpansion 字段为 true
  • PV 和 PVC 的绑定模式支持扩容

    • 如果 PVC 已绑定到 PV,存储后端需要支持动态扩容。

步骤 1:检查存储类是否支持扩容

运行以下命令,查看目标存储类的配置:

kubectl get storageclass <STORAGE_CLASS_NAME> -o yaml

确认配置中 allowVolumeExpansion 是否为 true

allowVolumeExpansion: true

 步骤 2:编辑 PVC 并调整大小

kubectl edit pvc <PVC_NAME>

 调整 spec.resources.requests.storage 的值,例如:

spec:
  resources:
    requests:
      storage: 20Gi

在 Kubernetes 中,扩容 PVC(PersistentVolumeClaim)需要满足以下条件:

  1. 确保存储类支持动态扩容

    • 存储类 (StorageClass) 必须启用了扩容功能,且其 allowVolumeExpansion true
  2. PV 和 PVC 的绑定模式支持扩容

    • 如果 PVC 已绑定到 PV,存储后端需要支持动态扩容。

以下是扩容 PVC 的具体步骤:

步骤 1:检查存储类是否支持扩容

运行以下命令,查看目标存储类的配置:

kubectl get storageclass <STORAGE_CLASS_NAME> -o yaml

确认配置中 allowVolumeExpansion 是否为 true

allowVolumeExpansion: true

如果未启用扩容,请修改存储类或创建新的存储类并启用此功能。

步骤 2:编辑 PVC 并调整大小
  1. 编辑 PVC: 使用以下命令编辑 PVC 的规格:

    kubectl edit pvc <PVC_NAME>
  2. 调整 spec.resources.requests.storage 的值,例如:

    spec:
      resources:
        requests:
          storage: 20Gi

步骤 3:验证扩容状态
  1. 检查 PVC 的状态,确认是否扩容成功:

    kubectl get pvc <PVC_NAME>

    状态应为 Bound,且容量已更新。

  2. 如果 PV 的大小未更新,检查存储提供商的控制器日志(如 CSI 插件)。


注意事项
  1. 文件系统调整

    • 扩容操作完成后,如果是文件系统类型的卷(如 ext4),可能需要在 Pod 内手动调整文件系统。
    • 执行以下命令调整文件系统大小:
resize2fs /dev/<DEVICE_NAME>
  • 不支持扩容的场景

    • 如果 PVC 的存储类或后端存储不支持动态扩容,可以创建一个新的更大 PVC,并手动迁移数据。
  • 重启 Pod: 某些情况下,可能需要重新启动使用该 PVC 的 Pod 以应用扩容后的更改。

设置集群默认的sc

两种方式

 使用配置文件设置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "true"
  type: pd-standard
  fstype: ext4
  cachingmode: readwrite
reclaimPolicy: Retain
allowVolumeExpansion: true

打补丁设置

]# kubectl patch sc nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

取消

]# kubectl patch sc nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

 设置后查看

[root@master-1 nfs-provisioner]# kubectl  get sc
NAME                   PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   k8s-sigs.io/nfs-subdir-external-provisioner   Retain          Immediate           true                   31d

缺省使用默认sc创建pvc

当你创建一个 PersistentVolumeClaim(PVC)而不指定 storageClassName 时,它将使用默认的存储类。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-default-pvc
spec:
  #storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

部署查看

[root@master-1 nfs-provisioner]# kubectl  get pvc
NAME                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-default-pvc        Bound    pvc-0c039c9b-6a88-4c0e-96d5-5122028f2f43   1Mi        RWX            nfs-client     8s

 

posted @ 2024-05-29 19:16  不会跳舞的胖子  阅读(221)  评论(0)    收藏  举报