Kubernetes 的存储类StorageClass

前言:

在Kubernetes中,存储类(StorageClass)是一种用于定义持久卷(PersistentVolume)的动态供应的方式。它允许管理员配置不同类型的存储,以满足不同应用程序的需求,并且可以根据需要动态地创建PV。存储类为Pod提供了一种简单的方式来请求存储资源,而无需了解底层存储系统的细节。存储类定义了以下细节:

  1. Provisioner(供应程序):指定了存储提供商或插件,用于动态创建PV。当PVC请求与存储类绑定时,存储类会调用相应的供应程序来创建PV。常见的供应程序包括:kubernetes.io/aws-ebs、kubernetes.io/gce-pd(、kubernetes.io/azure-disk、kubernetes.io/glusterfs 等。
  2. Parameters (参数):可选字段,用于指定供应程序的配置参数。这些参数可以根据存储提供商的要求而变化,例如存储容量、性能配置、备份策略等。
  3. ReclaimPolicy(回收策略):指定了PV在被释放后的行为。常见的回收策略包括:Retain:保留PV,不进行任何操作。需要管理员手动处理释放后的PV。Delete:自动删除PV,并且清除底层存储资源。默认为Delete

StorageClass对象的名称很重要,是用户可以请求特定类的方式(Pvc请求资源时候PersistentVolumeClaim.spec.storageClassName下配置此名称)。 管理员在首次创建StorageClass对象时设置类的名称和其他参数,并且在创建对象后无法更新这些对象。管理员可以为不请求任何特定类绑定的PVC指定默认的StorageClass。

StorageClass其他字段

allowedTopologies:用于指定允许使用该存储类的节点拓扑约束。它允许管理员限制存储类可以被使用的节点的拓扑域(Topology)。在Kubernetes中,节点拓扑约束用于将 Pod 调度到特定的节点上,以满足不同的需求,例如数据本地性、可靠性、性能等。通过allowedTopologies字段,可以为存储类指定允许的节点拓扑约束,以确保存储资源被分配到特定的节点上。(指定你的存储资源只能在那些k8s节点上使用)

mountOptions:用于控制动态创建的持久卷(PersistentVolume)的挂载选项。它允许你指定一些特定的挂载选项,以满足你的需求。具体来说,mountOptions字段是一个字符串数组,其中包含要应用于动态创建的PV的挂载选项。这些选项将在PV被挂载到容器中时生效。例如,你可以指定 [“ro”, “soft”] 作为挂载选项,表示将 PV 以只读(read-only)模式挂载,并且采用软件方式(soft)进行挂载。需要注意的是,Kubernetes不会对mountOptions字段中的选项进行验证。如果指定的挂载选项无效,PV 的挂载将会失败。因此,在配置mountOptions时,请确保你提供的选项是有效的。

NFS资源的StorageClass

NFS供应商Github地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

1、创建NFS的sa账户

该账户会在供应商服务中授权操作k8s资源。(不做注释以后再说)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-stgc-delte
---
#对nfs-stgc-delete授权
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-role
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["extensions"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["nfs-stgc-delte"]
    verbs: ["use"]
---
#将nfs-stgc-delte用户绑定nfs-provisioner-role设置的权限
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-binng
subjects:
  - kind: ServiceAccount
    name: nfs-stgc-delte
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-role
  apiGroup: rbac.authorization.k8s.io

---
#创建Role权限。ClusterRole适用于整个集群,而Role只适用于特定的命名空间。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-nfs-role
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
#将创建的Role权限绑定到nfs-stgc-delte
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-nfs-binding
subjects:
  - kind: ServiceAccount
    name: nfs-stgc-delte
    namespace: default
roleRef:
  kind: Role
  name: leader-nfs-role
  apiGroup: rbac.authorization.k8s.io

2、运行供应商商服务。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      nodeSelector:
        app: ng
      serviceAccountName: nfs-stgc-delte
      containers:
        - name: nfs-client-provisioner
          image: docker.io/eipwork/nfs-subdir-external-provisioner:v4.0.2
          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.0.108
            - name: NFS_PATH
              value: /mnt/k8s
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.0.108
            path: /mnt/k8s

在deployment.spec.template.spec.serviceAccountName下配置授权用户。修改镜像为docker.io/eipwork/nfs-subdir-external-provisioner:v4.0.2
运行服务查看:

[root@master yaml]# kubectl get deployment 
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nfs-client-provisioner   1/1     1            1           84m

3、创建StorgaeClass对象

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-stgc-delete
  namespace: default
allowVolumeExpansion: true
allowedTopologies:
  - matchLabelExpressions:
    - key: app
      values: 
      - to
#mountOptions:
#- debug
parameters: 
  pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}"
  onDelete: delete
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
#官方给的NFS供应商
reclaimPolicy: Delete
volumeBindingMode: Immediate

配置节点约束,只允许资源在标签为app:to的节点上使用。配置reclaimPolicy为delete。

StorageClass回收策略:(StorageClass的回收策略优先级高。如果在PVC中也配置了回收策略在调用StorageClass资源后不生效。)

  • Retain(保留):当PV被释放时,Kubernetes不会自动删除PV所关联的存储资源。PV将保留在集群中,不会被释放。这个选项适用于需要手动处理PV回收的情况,例如需要将PV再次关联到新的 PVC 上。
  • Delete(删除):当PV被释放时,Kubernetes将自动删除PV所关联的存储资源。这个选项会立即释放存储资源,并且将其从集群中删除。这是最常见的回收策略,适用于大多数情况下。
  • Recycle(回收):当PV被释放时,Kubernetes将尝试删除PV中的数据,但不会删除存储资源本身。这个选项通常用于一些本地存储类型,例如 HostPath,它会简单地删除 PV 中的数据,以便下次再次使用。(这个不是即将废弃的PVC回收策略)

volumeBindingMode:用于指定 PV(PersistentVolume)如何绑定到PVC。有两个参数:

  • WaitForFirstConsumer:表示 PV 将等待第一个 PVC 请求并绑定到它之后才会被创建。这意味着 PV 只有在第一个 PVC 使用它之后才会被创建和绑定。这个选项通常用于动态创建的 PV,并且确保 PV 只在需要时才会被创建。
  • Immediate:表示 PV 将立即被创建,无论是否有 PVC 请求。这意味着 PV 会立即被创建并且可以被任何 PVC 使用。这个选项通常用于静态创建的 PV,或者用于一些不需要等待 PVC 请求的存储系统。
  • 默认情况下,如果未显式指定storageclass.volumeBindingMode 字段,它的值将是Immediate。

3、创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc-storage
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi
  storageClassName:  nfs-stgc-delete

PersistentVolumeClaim.spec.storageClassName配置StorageClass.metadata.name。

查看PVC:

 [root@master yaml]# kubectl get pvc
 NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
 nginx-pvc-storage   Bound    pvc-9c2fcf3c-1479-4f3d-a195-7e8aa5ff8b3d   1Gi        RWX            nfs-stgc-delete   37m

4、在Pod中使用PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dy
  labels:
    web: nginx
  namespace: default
  annotations:
    dac: " image version to v1.0"
spec:
  minReadySeconds: 10
  #新创建的Pod成为就绪状态之前,Deployment控制器等待的最短时间(秒数)。确保Pod中的业务程序能正常工作之前有做狗的时候完成初始化和准备工作。
  paused: false
  progressDeadlineSeconds: 60
  #该字段用于指定部署操作的进度检查的超时时间(以秒为单位)。这个字段的作用是为了确保部署操作能够在指定的时间内完成,并在超时后进行相应的处理。
  replicas: 4
  revisionHistoryLimit: 5
  #该用于指定要保留的 Deployment 版本历史记录的最大数量。Deployment 版本历史记录包含了过去创建的每个 Deployment 的详细信息,包括创建时间、更新时间、副本数量等。
  #如果设置为 0,则不会保留任何历史记录;如果设置为负值,则表示将保留所有历史记录。
  selector:
    matchLabels:
      ser: nginx-test
  strategy:
  #定义滚动更新策略
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      name: nginx
      #namespeace
      labels:
        ser: nginx-test
    spec:
      nodeSelector:
        app: to
      hostname: nginx-dy
      containers:
      - image: docker.io/library/nginx:v1
        name: nginx-dy
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-post
          containerPort: 80
        volumeMounts:
        - name: nginx-pvc
          mountPath: /home
          readOnly: false
          #为true为只读方式挂载
      volumes:
      -  name: nginx-pvc
         persistentVolumeClaim:
           claimName: nginx-pvc-storage
         
          

修改Deployment.spec.template.spec.volumes下资源信息,创建Pod。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值