• 【实战】Kubernetes安装持久化工具NFS-StorageClass


    前言

    前面的博文我们介绍了如何用kuberadmin的架构概述与简单执行流程,以及部署K8S集群的详细步骤。今天我们继续介绍如何安装持久化工具NFS-StorageClass。

    技术积累

    存储类(storage class)

    存储类是Kubernetes资源类型的一种,是管理员为创建PV方便而按需创建的类别。
    要使用 StorageClass,就得安装对应的自动配置程序,比如这里存储后端使用的是 nfs,那么就需要使用到一个 nfs-client 的自动配置程序,也叫它 Provisioner,这个程序使用我们已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动创建 PV。PV、PVC和StorageClass之间的运作关系如下图所示:
    在这里插入图片描述

    什么是NFS

    网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

    NFS是主流的k8s数据持久化解决方案与pod共享存储解决方案;NFS数据卷提供对NFS挂载支持,可以自动将NFS共享 路径挂载到Pod中;NFS是一个主流的文件共享服务器。

    什么是PV\PVC

    在Kubernetes中,PV(Persistent Volume)网络管理员配置的存储和PVC(Persistent Volume Claim)用户申请的存储是用于持久化存储的两个概念,
    它们的区别如下:

    PV是实际的存储资源,例如物理存储设备、网络存储设备等。PVC是对PV的请求,描述了应用程序需要多少存储资源以及存储资源的属性。
    PV由管理员手动配置,而PVC由应用程序自动创建。应用程序在需要持久化存储时,可以创建一个PVC,Kubernetes将根据PVC的要求自动查找或创建一个匹配的PV,并将PV与PVC进行绑定。

    PV和PVC是分离的概念,它们可以独立地管理。当一个PVC被删除时,它所绑定的PV并不会立即被删除。相反,PV会被标记为"Released"状态,等待管理员手动删除。
    PV和PVC之间的绑定是一对一的关系。一个PVC只能绑定一个PV,而一个PV只能被一个PVC绑定。但是,多个PVC可以绑定同一个PV,以实现共享存储。

    PV可以设置访问模式(Access Modes),例如ReadWriteOnce、ReadWriteMany和ReadOnlyMany。Access Modes定义了多个Pod如何访问同一个PV。例如,ReadWriteOnce表示PV只能被一个Pod以读写方式访问,而ReadWriteMany表示PV可以被多个Pod以读写方式访问。

    为什么要用NFS-StorageClass

    ​ PV 都是静态的,要使用的一个 PVC 的话就必须手动去创建一个 PV,这种方式在很大程度上并不能满足我们的需求,比如我们有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,这就需要 StorageClass动态的创建PV。

    ​要使用 StorageClass,需要安装对应的自动配置程序,比如我们这里存储使用的是 NFS,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 NFS服务器,来自动创建持久卷,也就是自动帮我们创建 PV。

    安装NFS-StorageClass

    保证K8S集群正常投用

    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES                  AGE   VERSION
    master   Ready    control-plane,master   60d   v1.27.2
    node1    Ready                     60d   v1.27.2
    node2    Ready                     60d   v1.27.2
    [root@master ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装NFS工具与客户端

    # 所有kubernetes集群节点中都需要安装nfs
    [root@master ~]# yum install -y nfs-utils
    
    
    # 在master节点中执行
    [root@master ~]# echo "/data/nfs *(insecure,rw,sync,no_root_squash)" > /etc/exports
    [root@master ~]# mkdir -p /data/nfs && chmod -R 777 /data/nfs
    [root@master ~]# exportfs -r
    #master节点启动rpc 与 nfs
    [root@master ~]# systemctl enable rpcbind && systemctl start rpcbind
    [root@master ~]# systemctl enable nfs && systemctl start nfs
    
    
    #在所有的node节点执行
    [root@master ~]# systemctl enable rpcbind && systemctl start rpcbind
    [root@master ~]# systemctl enable nfs && systemctl start nfs
    [root@master ~]# showmount -e master
    
    #验证k8s集群节点nfs工具安装和配置正确
    [root@master ~]#  showmount -e  master
    Export list for master:
    /data/nfs *
    [root@master ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    如下图所示表示安装成功:
    在这里插入图片描述

    NFS安装常见错误

    1、clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)
    需要关闭服务端和客户端防火墙以及selinux。

    安装NFS-StorageClass存储器

    创建k8s执行文件

    [root@master ~]# vim nfs-storage.yaml
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: nfs-provisioner  
    parameters:
      archiveOnDelete: "true" 
    
    ---
    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.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
              # resources:
              #    limits:
              #      cpu: 10m
              #    requests:
              #      cpu: 10m
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: nfs-provisioner
                - name: NFS_SERVER
                  value: 10.10.22.91 ## master nfs服务器IP
                - name: NFS_PATH  
                  value: /data/nfs  ## nfs服务器共享的目录路径
          volumes:
            - name: nfs-client-root
              nfs:
                server: 10.10.22.91
                path: /data/nfs
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["get", "list", "watch"]
      - 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
      # replace with namespace where provisioner is deployed
      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
      # replace with namespace where provisioner is deployed
      namespace: default
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126

    执行k8s安装文件

    #执行nfs-storageclass安装文件
    [root@master ~]# kubectl apply -f nfs-storage.yaml
    #验证执行结果
    [root@master ~]# kubectl get storageclass
    NAME                    PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    nfs-storage (default)   nfs-provisioner   Delete          Immediate           false                  60d
    [root@master ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如下图所示表示安装成功:
    在这里插入图片描述

    ⭐️路漫漫其修远兮,吾将上下而求索 🔍

  • 相关阅读:
    视频服务HDR Vivid 还原色彩,让所见成“真”
    思腾云计算
    MySQL索引
    【openwrt学习笔记】新patch的制作和旧patch的修改
    vue高德地图(二):获取并标记用户位置
    【网页设计】HTML+CSS保护野生动物北极熊介绍网页设计专题
    软件设计模式系列之八——适配器模式
    FreeRTOS源码阅读笔记2--list.c
    HCNP Routing&Switching之MAC安全
    谈谈JSF业务线程池的大小配置
  • 原文地址:https://blog.csdn.net/weixin_39970883/article/details/134006891