4

在Kubernetes中创建NFS类型的StorageClass

 8 months ago
source link: https://jasonkayzk.github.io/2023/12/15/%E5%9C%A8Kubernetes%E4%B8%AD%E5%88%9B%E5%BB%BANFS%E7%B1%BB%E5%9E%8B%E7%9A%84StorageClass/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如果要在Kubernetes中部署StatefulSet类型的Pod,需要先创建持久化的StorageClass、PV,从而让PVC能够使用对应的存储;

StorageClass常用的类型有:Local(例如:HostPath、EmptyDir等)、NFS、Ceph;

在声明NFS类型的StorageClass时需要用到第三方的Provisioner;

本文讲解了如何在Kubernetes中结合 Kuboard 使用 nfs-subdir-external-provisioner 创建NFS类型的StorageClass;

在Kubernetes中创建NFS类型的StorageClass

前言

本文在:《在VMWare中部署你的K8S集群》 的基础之上进行!

安装并配置NFS服务

这里开启了另外一台 Ubuntu 来作为 NFS 服务器;

hostname 设置为 ubuntu-4

安装NFS

首先,在这台机器上安装并配置 NFS;

参考文章:

NFS 服务器上安装 Server:

sudo apt update
sudo apt install nfs-kernel-server

各个 K8S 节点上也需要安装 nfs 客户端:

  sudo apt update
  sudo apt install nfs-common

创建挂载点

然后在 NFS 服务器上创建挂载点:

sudo mkdir /var/nfs/general -p

并修改 owner:

root@ubuntu-4:/var/nfs/general# ls -dl /var/nfs/general

drwxr-xr-x 15 nobody nogroup 4096 Dec 15 07:21 /var/nfs/general

配置NFS

修改 /etc/exports 添加配置:

# /var/nfs/general    client_ip(rw,sync,no_subtree_check)

+ /var/nfs/general  *(rw,sync,no_subtree_check)

如果配置为 *,则任何 ClientIp 都可以访问这个目录;

配置含义:

  • rw:Client 可以读写;
  • sync:同步写操作,保证在响应客户端之前数据已经强制写入(提高可靠性,但是降低文件操作效率);
  • no_subtree_check:关闭文件子树检查,避免NFS服务器在处理每次请求时都检查文件树合法;关闭后可以避免客户端重命名文件产生的问题;

重启服务

配置完成后重启服务:

sudo systemctl restart nfs-kernel-server

开机自启动:

sudo systemctl enable nfs-kernel-server

测试:在Client节点创建挂载点

在 Client 节点创建要挂载的目录:

sudo mkdir -p /nfs/general
sudo mount nfs_host_ip:/var/nfs/general /nfs/general

nfs_host_ip 修改为 NFS 服务器 IP 地址;

校验写入:

# client
sudo touch /nfs/general/general.test

执行成功,并且在 NFS Server 对应目录中能看到文件即可!

# client
sudo rm /nfs/general/general.test

sudo umount /nfs/general

创建 StorageClass

StorageClass是一个存储类,通过创建StorageClass可以动态生成一个存储卷,供 k8s 使用;

使用 StorageClass 可以根据PVC动态的创建PV,减少管理员手工创建PV的工作;

StorageClass的定义主要包括名称、后端存储的提供者 (privisioner) 和后端存储的相关参数配置;

注意:StorageClass一旦被创建,就无法修改,如需修改,只能删除重建!

接下来就需要使用 nfs-subdir-external-provisioner Provisioner;

这个 Provisioner 使用已经配置好的 nfs 服务器,来自动创建持久卷,即自动帮我们创建 PV;

  • 自动创建的 PV 以{namespace}-{pvcName}-{pvName} 这样的命名!

  • 格式创建在 NFS 服务器上的共享数据目录中;

  • 当这个 PV 被回收后会以 archieved-{namespace}-{pvcName}-{pvName} 这样的命名格式存在 NFS 服务器上;

我们可以直接通过 Helm 安装:

$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

$ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/exported/path

官方文档:

或者我们也可以通过 Kuboard 进行配置:

在集群概览页,点击 Create StorageClass

kuboard-storageclass.png

然后根据需求进行配置即可:

kuboard-storageclass-2.png

等待部署完成后,可以查看部署成功:

root@ubuntu-1:~# k get sc -A
NAME         PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
my-storage   nfs-my-storage   Delete          Immediate           false                  5h25m

root@ubuntu-1:~# k get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS                   REASON   AGE
nfs-pv-my-storage                          75Gi       RWX            Retain           Bound    kube-system/nfs-pvc-my-storage   nfs-storageclass-provisioner            5h26m

即部署完成;

下一篇文章将会讲述如何使用我们创建的 StorageClass 部署 StatefulSet:

附录

参考文章:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK