概述

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

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

安装nfs服务端

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

node节点上安装

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

启动nfs

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

配置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  # 替换成自己的挂载目录

创建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
  • 新建的一个名为 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

  • 声明了一个名为 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
  • 查看资源状态
kubectl get pods
# 查看存储类
kubectl get storageclass

在这里插入图片描述

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

在这里插入图片描述

常见问题

问题一

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

在这里插入图片描述

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

参考文档

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

Logo

开源、云原生的融合云平台

更多推荐