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

一、StorageClass存储类理论

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

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

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

卷插件 内置制备器 配置示例
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
FlexVolume - -
GCEPersistentDisk GCE PD
iSCSI - -
NFS - NFS
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx 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

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/131158056