• kubernetes集群配置默认存储类(nfs)


    概述

    StorageClass 为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 “配置文件”。

    • 查看Kubernetes集群中的默认存储类
    kubectl get storageclass
    
    • 1

    安装nfs服务端

    • 找一台新的服务器,作为nfs服务端,然后进行 nfs的安装 【服务器:172.16.11.17】
    • 安装nfs
    yum install -y nfs-utils
    
    • 1
    • 创建存放数据的目录
    mkdir -p /data/k8s
    
    • 1
    • 设置挂载路径
    # 打开文件
    vim /etc/exports
    # 添加如下内容
    /data/k8s *(rw,no_root_squash)
    
    • 1
    • 2
    • 3
    • 4

    node节点上安装

    • 在k8s集群需要部署应用的node节点安装nfs
    yum install -y nfs-utils
    
    • 1

    启动nfs

    • node节点上配置完成后,到nfs服务器启动nfs
    systemctl start nfs
    
    • 1

    配置StorageClass

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

    自动创建的 PV 以 ${namespace} - ${pvcName}- ${pvName} 这样的命名格式创建在 NFS 服务器上的共享数据目录中,而当这个 PV 被回收后会以 archieved- ${namespace}- ${pvcName}- ${pvName} 这样的命名格式存在 NFS 服务器上。

    • 当然在部署nfs-client之前,需要先成功安装上 nfs 服务器,上面已经安装好了,服务地址是172.16.11.17,共享数据目录是/data/k8s/,然后部署 nfs-client 即可。

    创建Deployment

    • 首先配置 Deployment(nfs-client.yaml)
    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:
          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
                  value: 172.16.11.17   #替换成自己的nfs服务器
                - name: NFS_PATH
                  value: /data/k8s  # 替换成自己的挂载目录
          volumes:
            - name: nfs-client-root
              nfs:
                server: 172.16.11.17   #替换成自己的nfs服务器
                path: /data/k8s  # 替换成自己的挂载目录
    
    • 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

    创建ServiceAccount

    • Deployment使用了一个名为 nfs-client-provisioner 的serviceAccount,所以也需要创建一个 sa,然后绑定上对应的权限。(nfs-client-sa.yaml)
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
    
    ---
    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: ["list", "watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      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
    • 新建的一个名为 nfs-client-provisioner 的ServiceAccount,然后绑定了一个名为 nfs-client-provisioner-runner 的ClusterRole,而该ClusterRole声明了一些权限,其中就包括对persistentvolumes的增、删、改、查等权限,所以我们可以利用该ServiceAccount来自动创建 PV。

    创建StorageClass对象

    • nfs-client 的 Deployment 声明完成后,就可以创建一个StorageClass对象。(nfs-client-class.yaml)
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: course-nfs-storage
    provisioner: fuseim.pri/ifs
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 声明了一个名为 course-nfs-storage 的StorageClass对象。
    • 注意provisioner对应的值一定要和上面的Deployment下面的 PROVISIONER_NAME 这个环境变量的值一样。

    创建资源对象

    kubectl create -f nfs-client.yaml
    kubectl create -f nfs-client-sa.yaml
    kubectl create -f nfs-client-class.yaml
    
    • 1
    • 2
    • 3
    • 查看资源状态
    kubectl get pods
    # 查看存储类
    kubectl get storageclass
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    • 可以设置这个 course-nfs-storage 的 StorageClass 为 Kubernetes 的默认存储后端,我们可以用 kubectl patch 命令来更新。
    kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    
    • 1
    • 执行完命令后,我们默认存储类就配置成功了。
    kubectl get storageclass
    
    • 1

    在这里插入图片描述

    常见问题

    问题一

    • 部署k8s动态持久卷nfs报错如下:
    waiting for a volume to be created, either by external provisioner “gxf-nfs-storage” or manually created by system administrator
    
    • 1
    • 由于Kubernetes 1.20禁用了selfLink,创建的时候会报错。
    vi  /etc/kubernetes/manifests/kube-apiserver.yaml
    
    • 1
    • 添加一行内容
    - --feature-gates=RemoveSelfLink=false
    
    • 1

    在这里插入图片描述

    • 重新应用
    kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
    
    • 1
    • 持续补充中…

    参考文档

    你知道的越多,你不知道的越多。

  • 相关阅读:
    数字孪生软件架构选BS还是CS?不,我们选择CSaaS!
    ps -xu | grep这个命令的用途
    VR古迹复原——数字化复原圆明园,开创文化遗产保护新方式
    Redis实现全局唯一id
    R语言向前或者向后移动时间序列数据(自定义滞后或者超前的期数):使用lag函数将时间序列数据向前移动一天(设置参数k为正值)
    嵌入式分享合集113
    NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记
    六、函数和变量的命名
    Leetcode66. 加一
    白炽灯对婴儿眼睛好吗?分享适合婴儿、光线柔和的护眼台灯
  • 原文地址:https://blog.csdn.net/qq_40722827/article/details/127948651