NFS安装和基于K8S的使用

85

StorageClass介绍

StorageClass是Kubernetes资源类型的一种,它由管理员为管理Persistent Volume(PV)之便而按需创建的类别(逻辑组)。StorageClass的主要作用包括动态存储卷分配、存储卷的属性管理以及存储资源的管理。

StorageClass可以定义PV的属性,如存储的大小、类型等,以及创建这种PV需要使用到的存储插件,如Ceph、NFS等。有了这些信息,Kubernetes就能够根据用户提交的Persistent Volume Claim(PVC),找到对应的StorageClass,然后调用StorageClass声明的存储插件,创建出需要的PV。

此外,StorageClass还可以将存储资源进行分类管理,方便开发者根据应用程序的需求进行选择。每个StorageClass都有一个供应商(Provisioner),用来决定使用哪个卷插件制备PV。

因此,StorageClass为管理员提供了描述存储“类”的方法,不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略

NFS介绍

NFS代表网络文件系统(Network File System),它是一种分布式文件系统协议,用于在计算机系统之间共享文件和目录。NFS的工作原理是将文件系统挂载到远程计算机上,使得远程计算机可以像访问本地文件系统一样访问共享的文件和目录。它使用客户端-服务器模型,其中客户端计算机通过网络连接到NFS服务器,请求访问共享的文件和目录。NFS服务器将文件和目录的内容传输到客户端计算机上,使得客户端可以像访问本地文件系统一样访问共享的文件和目录。

实验介绍

由于没有独立的存储服务器,这里仅仅在linux/Centos7服务器中安装nfs服务并指定特定目录为存储后端的路径来作为nfs服务器演示。并作为K8S的后端存储创建StorageClass,从而动态的创建PV。

实验步骤

安装配置nfs服务

  1. 安装

centos: yum install -y nfs-common nfs-utils rpcbind 
ubuntu: apt install rpcbind nfs-server nfs-kernel-server -y
  1. 创建目录并赋权

mkdir /nfs_dir # 当然可以是其他目录 
chmod 666 /nfs_dir 
【centos执行,Ubuntu不需要】chown nfsnobody /nfs_dir
  1. 修改配置文件/etc/exports # 没有的话需要创建

centos: /nfs_dir *(rw,no_root_squash,no_all_squash,sync) 
ubuntu: /nfs_dir *(rw,async,insecure,no_subtree_check,no_root_squash)
  1. 上述配置文件含义解析

/nfs_dir                        #代表共享出来的目录
*                               #允许*/24的网络访问此共享。
rw                              #表示权限 读写
sync                            #表示同步写入
no_root_squash                  #表示客户机以root访问时赋予本地root权限,如果设置成all_squash会出现任何用户都无法访问挂载目录的情况
  1. 启动服务并设置为自启动

【centos】
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
【ubuntu】
systemctl enable rpcbind nfs-server
systemctl start rpcbind nfs-server

注意

其他想要使用该nfs服务的服务器都需要安装rpcbind包

centos: yum install -y nfs-utils rpcbind
ubuntu: apt install rpcbind nfs-server nfs-kernel-server -y

测试

在另一台服务器上尝试挂载NFS服务器的共享目录到本地

mkdir LOCAL_mount_path
showmount -e NFS_server_ip #  查看NFS服务器可被我挂载的路径信息,一般如下
        Export list for NFS_server_ip:
        NFS_server_mout_path *
        
centos: mount -t nfs NFS_server_ip:NFS_server_mout_path  LOCAL_mount_path # 执行挂载
ubuntu: mount -t nfs -o rw NFS_server_ip:NFS_server_mout_path  LOCAL_mount_path # 执行挂载

umount LOCAL_mount_path # 解除挂载
rm -rf LOCAL_mount_path # 删除数据

Kubernetes && NFS Server

Helm部署NFS的SC

开源的项目地址为https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

  1. 添加并更新repo

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update nfs-subdir-external-provisioner
  1. 查询可用版本

$ helm search repo nfs-subdir-external-provisioner --versions
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.18          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.17          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.16          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.15          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.14          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.13          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.12          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.11          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.10          4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.9           4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.8           4.0.2           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.6           4.0.1           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.5           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.4           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.3           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.2           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.1           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      4.0.0           4.0.0           nfs-subdir-external-provisioner is an automatic...
nfs-subdir-external-provisioner/nfs-subdir-exte...      3.0.0           3.1.0           nfs-subdir-external-provisioner is an automatic...
  1. 下载指定的charts

helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.18
  1. 安装

helm upgrade -install nfs-subdir-external-provisioner nfs-subdir-external-provisioner-4.0.18.tgz --namespace nfs-sc --create-namespace \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/exported/path \
    --set storageClass.name=nfs-client
# registry.k8s.io的镜像拉取不下来的情况下,可使用如下命令:
helm upgrade -install nfs-subdir-external-provisioner nfs-subdir-external-provisioner-4.0.18.tgz --namespace nfs-sc --create-namespace \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/exported/path \
    --set storageClass.name=nfs-client \
    --set image.repository=k8s.dockerproxy.com/sig-storage/nfs-subdir-external-provisioner
  1. 卸载

helm uninstall nfs-subdir-external-provisioner --namespace nfs-sc
  1. 验证

$ kubectl get pods -n nfs-sc
NAME                                               READY   STATUS    RESTARTS   AGE
nfs-subdir-external-provisioner-8559f7d5d9-gqhls   1/1     Running   0          14s
$ kubectl get sc
NAME         PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   20s

测试使用

  1. 应用部署文件

apiVersion: v1
kind: Service
metadata:
  name: test
  labels:
    app: test
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 8000
    name: console
    nodePort: 32152
  selector:
    app: test
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      restartPolicy: Always
      containers:
      - name: test
        image: test:v1
        resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 400m
            memory: 400Mi
        volumeMounts:
          - mountPath: /app/logs
            name: log-volume
        ports:
          - containerPort: 8000
            protocol: TCP
      volumes:
        - name: log-volume
          persistentVolumeClaim:
            claimName: test
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  1. 验证

[root@xxx default-cloudnet-search-admin-pvc-8254afc5-5630-49fe-810a-25cbba09f18c]# ls -l
总用量 196
-rw-r--r-- 1 root root 197757 4月  13 13:24 2024-04-13.log
[root@xxx default-cloudnet-search-admin-pvc-8254afc5-5630-49fe-810a-25cbba09f18c]# pwd
/nfs_dir/default-cloudnet-search-admin-pvc-8254afc5-5630-49fe-810a-25cbba09f18c