• k8s 网络持久化存储之StorageClass(如何一步步实现动态持久化存储)


    StorageClass的作用:

    创建pv时,先要创建各种固定大小的PV,而这些PV都是手动创建的,当业务量上来时,需要创建很多的PV,过程非常麻烦。
    而且开发人员在申请PVC资源时,还不一定有匹配条件的PV可用,这又带来了新的问题。
    于是Kubernetes提供了StorageClass来动态创建PV,StorageClass大大简化了PV的创建过程。
    当申请PVC资源时, 如果匹配到满足条件的StorageClass,还会自动为PVC创建对应大小的 PV并进行绑定。

    下面就来仔细讲讲现在如何一步步的通过创建StorageClass动态创建PV从而实现持久化存储的。

    网络存储卷

    Kubernetes是分布式容器集群,如何在多个Pod之间或多 个Node之间进行数据存储和共享是非常重要的问题。

    Kubernetes引入了网络存储卷,它支持为数众多的云提供商的产品和网络存储方案,如 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker等

    网络存储卷还能够 满足持久化数据的要求,这些数据将永久保存。

    网络存储卷是集成各种第三方的存储系统,不同的服务商提供的配置有一些不同,NFS只是其中一种。

    一. 安装NFS

    安装NFS服务器

    资源有限,此处我选择了master作为NFS服务器

    安装NFS服务器应用:yum install -y nfs-utils rpcbind

    image

    创建NFS共享目录:mkdir -p /data/k8snfs

    编辑NFS配置文件:vim /etc/exports

    image
    image

    重启服务:

    image

    检查服务器端是否正常加载 了/etc/exports的配置:

    image
    注意:如果使用云服务器,需要开放一下端口,否则客户端连接不上。使用:rpcinfo -p 查看需要开放的端口。注意有tcp和udp:
    image

    安装NFS客户端

    注意:每台需要使用NFS的Node都需要安装NFS

    安装客户端:yum install -y nfs-utils

    检查是否能访问远端的NFS服务器:sudo showmount -e {NFS服务器IP地址}

    image
    如果出现clnt_create: RPC: Port mapper failure - Timed out,使用云服务的话大概率是接口没开放。

    持久存储卷

    Kubernetes支持为数众多的 云提供商和网络存储方案,如 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker等。但因为网络存储卷 通常是集成各种第三方的存储系统,所以在配置上各有差别。

    不同的存储的配置参数不太一样,这些参数应该是存储管理员关注的,而非开发人员,Kubernetes提供了3种基于存储的抽象对象—— PersistentVolume(PV)、StorageClass和 PersistentVolumeClaim(PVC),以支持基础设施和应用之间的分离。

    存储管理人员设置 PV或StorageClass,并在里面配置存储系统和参数

    开发人员只 需要创建PVC来申请指定空间的资源以存储与共享数据即可,无须再关 注存储的具体实现和操作。

    当删除PVC时,它写入具体存储资源中的数据可以根据回收策略自动清理。
    image

    PV和PVC

    PV表示持久存储卷,定义了Kubernetes集群中可用的存储资源, 其中包含存储资源实现的细节,如包含如何使用 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker 等资源的具体设置。

    PVC表示持久存储卷的申请,是由用户发起的对存储资源的请求。 申请中只包含请求资源的大小和读写访问模式,无须关注具体的资源 实现细节,Kubernetes会自动为其绑定符合条件的PV

    二.部署StorageClass

    StorageClass是通过存储分配器(provisioner)来动态分配PV 的,但是Kubernetes官方内置的存储分配器并不支持NFS,所以需要额外安装NFS存储分配器。

    1. 安装NFS存储分配器

    第一步:设置存储分配器的权限

    因为storage自动创建pv需要经过kube-apiserver,所以要进行授权

    在node节点创建nfs-client-provisioner-authority.yaml文件

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      namespace: default
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    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"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: default
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: default
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: default
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    

    image

    第二步:安装NFS存储分配器

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-client-provisioner
      labels:
        app: nfs-client-provisioner
      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: quay.io/external_storage/nfs-client-provisioner:latest
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME  # 存储分配器的默认名称
                  value: fuseim.pri/ifs  
                - name: NFS_SERVER    # NFS服务器地址
                  value: xx.xx.236.113
                - name: NFS_PATH       # NFS共享目录地址
                  value: /data/k8snfs
          volumes:
            - name: nfs-client-root
              nfs:
                server: xx.xx.236.113  # NFS服务器地址
                path: /data/k8snfs     # NFS共享目录
    

    image

    image

    第三步: 创建StorageClass

    创建nfs-storage-class.yml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: managed-nfs-storage   # StorageClass名称
    
      # 存储分配器名称
    provisioner: fuseim.pri/ifs  # 对应“nfs-client-provisioner.yaml”文件中env.PROVISIONER_NAME.value
    
      # 允许pvc创建后扩容
    allowVolumeExpansion: True
    
    parameters:
      archiveOnDelete: "false"  # 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV,false删除PVC时,对应的PV不会删除
    

    image

    创建PVC

    StorageClass 创建完成后就可以创建 PVC 了。
    创建:testpvc.yml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: testpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 500Mi
    

    image
    此时发现,pvc一直是pending状态,并没有默认分配PV。 分析,可能是存储分配器除了问题
    image
    selfLink was empty 在k8s集群 v1.20之前都存在,在v1.20之后被删除,需要在/etc/kubernetes/manifests/kube-apiserver.yaml 添加参数 - --feature-gates=RemoveSelfLink=false
    如下所示:
    image
    image
    稍等一会,再进行查看PV和PVC
    image
    可以看到PV已经被自动创建,且PV,PVC的状态已经均为绑定状态。

    NFS和PV,PVC关系图:

    image

    本文参考博客:https://blog.csdn.net/zhang19903848257/article/details/125887017

  • 相关阅读:
    神经网络过拟合怎么解决,神经网络过拟合怎么办
    基于JavaScript的Web端股票价格查看器——大道
    2021-02-01
    机器学习笔记之最优化理论与方法(六)无约束优化问题——最优性条件
    第04篇:手写JavaRPC框架之搞定网络通信
    win11内存完整性不兼容驱动程序的五种删除方法
    opencv读取摄像头并读取时间戳
    上课笔记(7)(1)——#647. 找树根和孩子(root)
    大数据Doris(九):配置BE步骤
    企业为什么要用ERP呢?上了ERP,企业又用不好的原因有哪些?
  • 原文地址:https://www.cnblogs.com/zhangpeiyao/p/16648250.html