【Kubernetes存储篇】StorageClass存储类动态生成PV详解

一、StorageClass存储类理论

StorageClass的作用主要有以下几个方面:

  • 动态存储卷分配:StorageClass可以根据定义的属性动态地创建存储卷,无需手动创建和管理存储卷。
  • 存储卷的属性管理:StorageClass可以定义存储卷的属性,如存储类型、存储容量、访问模式等,从而更好地满足应用程序的存储需求。
  • 存储资源的管理:StorageClass可以将存储资源进行分类管理,方便开发者根据应用程序的需求进行选择。

每个 StorageClass 都有一个供应商(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定,官网提供供应商如下表:

卷插件内置制备器配置示例
AWSElasticBlockStoreAWS EBS
AzureFileAzure File
AzureDiskAzure Disk
CephFS--
CinderOpenStack Cinder
FC--
FlexVolume--
GCEPersistentDiskGCE PD
iSCSI--
NFS-NFS
RBDCeph RBD
VsphereVolumevSphere
PortworxVolumePortworx Volume
Local-Local

本文章以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。

二、案例:Storageclass存储类实战演示

1、搭建NFS服务端

注意:K8S集群所有Node节点都需要安装 nfs-utils

yum -y install nfs-utils
mkdir /data/nfs_pro -p
vim /etc/exports
/data/nfs_pro *(rw,no_root_squash)

加载生效 && 启动NFS服务

exportfs -arv
systemctl enable nfs --now

2、搭建NFS供应商(provisioner)

第一步:创建运行nfs-provisioner需要使用的SA账号

cat nfs-serviceaccount.yaml 
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner

执行 YAML 文件 && 查看创建的 SA 账号:

kubectl apply -f nfs-serviceaccount.yaml
kubectl get sa nfs-provisioner

第二步:针对SA账号进行授权:

kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

第三步:安装nfs-provisioner程序 YAML 如下:

cat nfs-deployment.yaml 
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
       app: nfs-provisioner
  replicas: 1
  strategy:        # 更新策略
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner   # 指定SA账号
      containers:
        - name: nfs-provisioner
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs     # NFS供应商名称
            - name: NFS_SERVER
              value: 16.32.15.200         # NFS服务端地址
            - name: NFS_PATH            
              value: /data/nfs_pro/      # NFS共享目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 16.32.15.200           # NFS服务端地址
            path: /data/nfs_pro/          # NFS共享目录

执行YAML 文件 && 查看 Pod状态:

kubectl apply -f nfs-deployment.yaml
kubectl get pods

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBtPcvv2-1686488952208)(D:\MD归档文档\IMG\image-20230611205737012.png)]

3、创建StorageClass存储类

cat nfs-storageclass.yaml 
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nfs
provisioner: example.com/nfs   # 指定NFS供应商名称,和上面对应上

注意:provisioner处写的 example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致。

执行YAML文件 && 查看storageclass 状态:

kubectl apply -f nfs-storageclass.yaml
kubectl get sc nfs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjJI0M9K-1686488952209)(D:\MD归档文档\IMG\image-20230611205820108.png)]

4、创建PVC,通过StorageClass动态生成PV

cat nfs-pvc.yaml 
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: storageclass-pvc-demo
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi
  storageClassName:  nfs    # 指定使用storageclass的名称,来自动生产PV

执行YAML 文件 && 查看是否自动生成PV

kubectl apply -f nfs-pvc.yaml 
kubectl get pvc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tbmDzy3r-1686488952210)(D:\MD归档文档\IMG\image-20230611210021158.png)]

如上图已经自动创建PV,并绑定上PVC了

5、创建Pod挂载PVC

cat nfs-pod-demo.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod-demo
  labels:
    type: nfs
spec:
  volumes:
  - persistentVolumeClaim: 
      claimName: storageclass-pvc-demo   # 指定PVC
    name: nfs-storage                    # 卷名称
  containers:
  - name: nfs-pod-demo
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: nfs-storage                 # 指定上面卷名称
      mountPath: /usr/share/nginx/html  # 容器挂载目录

执行 YAML 文件 && 查看Pod状态:

kubectl apply -f nfs-pod-demo.yaml
kubectl get pods nfs-pod-demo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9i5jyk0-1686488952210)(D:\MD归档文档\IMG\image-20230611210748889.png)]

在 PVC 绑定宿主机目录,创建 index.html 文件

echo "storageclass demo successd...." > /data/nfs_pro/default-storageclass-pvc-demo-pvc-d4e47c42-d969-44d5-983d-bf36994b6c86/index.html

获取Pod IP访问网站:

kubectl get pods nfs-pod-demo -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umtlS7vW-1686488952210)(D:\MD归档文档\IMG\image-20230611210840495.png)]

三、步骤总结

1、搭建NFS服务端

2、搭建NFS供应商,指定NFS服务端IP地址及共享目录

3、创建StorageClass资源,指定使用NFS供应商

4、创建PVC,使用storageClassName 自动指定使用StorageClass

5、创建Pod,使用PVC

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Kubernetes中,StorageClass可以定义以下存储别: 1. Provisioner(供应商):StorageClass中定义了用于提供存储的供应商或插件。不同的供应商可能有不同的实现和特性,例如:kubernetes.io/aws-ebs、kubernetes.io/azure-disk、kubernetes.io/gce-pd等。 2. Reclaim Policy(回收策略):StorageClass中定义了PV(Persistent Volume)的回收策略,即在PV被释放后,如何处理其底层存储资源。常见的回收策略包括: - Delete(删除):在PV被释放后,自动删除底层存储资源。 - Retain(保留):在PV被释放后,保留底层存储资源,需要手动处理。 - Recycle(回收):在PV被释放后,通过执行清除操作来准备PV供其他PVC使用。 3. Parameters(参数配置):StorageClass中可以定义特定供应商的参数配置,如存储型、性能要求、存储容量等。这些参数配置取决于具体的存储提供商和插件。 4. Provisioning(供应方式):StorageClass可以定义静态供应或者动态供应。静态供应需要手动创建PV,并将其绑定到PVC。而动态供应则会根据PVC的要求自动创建和绑定匹配的PV动态供应需要StorageClass与支持动态供应的存储插件结合使用。 通过定义不同的StorageClass,管理员可以为不同的应用程序和需求提供不同型和配置的存储资源。这样可以灵活地满足应用程序对存储的要求,并实现存储的抽象和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇的海马体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值