【kubernetes】持久化存储 —— 存储类storageclass

前言

PV和PVC模式都是需要先创建好PV,然后定义好PVC和PV进行一对一的Bond后,才可以创建Pod进行使用。

但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高。因此,Kubernetes提供一种自动创建PV的机制,叫StorageClass。它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷PV供k8s的PVC使用。

StorageClass 对象

每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段。
在 StorageClass 需要动态制备 PersistentVolume 以满足 PersistentVolumeClaim (PVC) 时使用到。

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数。

具体来说,StorageClass会定义以下两部分:
1、PV的属性 ,比如存储的大小、类型等;
2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等

有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

常用字段

# kubectl explain storageclass

allowVolumeExpansion	<boolean>           # 是否允许卷扩展,见下图
allowedTopologies	    <[]Object>
apiVersion	            <string>
kind	                <string>
metadata	            <Object>
mountOptions	        <[]string>
parameters	            <map[string]string>  # 定义相关参数
provisioner	            <string> -required-  # 供应商,指定使用哪种存储来创建pv,见下图
reclaimPolicy	        <string>             # pv的回收策略 默认是Delete
volumeBindingMode	    <string>
  • 每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。
    在这里插入图片描述

  • 当下层 StorageClass 的 allowVolumeExpansion 字段设置为 true 时,以下类型的卷支持卷扩展。
    在这里插入图片描述

案例操作

一,创建存储类storageclass

1,创建sa

sa的全称是serviceaccount。
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。

指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。

# cat serviceaccount.yaml 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
kubectl get sa[ServiceAccount]

2,对sa授权

对创建的账号:nfs-provisioner 进行RBAC授权。

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

3,安装nfs-provisioner程序

# 创建 /data/nfs_pro 成为nfs的共享目录
mkdir /data/nfs_pro -p

# 加入共享配置文件中最后
vim /etc/exports
/data/nfs_pro *(rw,no_root_squash)

# 加载配置文件
exportfs -arv

4,创建供应商 provisioner

下载导入镜像:nfs-subdir-external-provisioner:v4.0.0.tar.gz
并且安装ctr -n=k8s.io images import nfs-subdir-external-provisioner:v4.0.0.tar.gz

# vim nfs-deployment.yaml

apiVersion: apps/v1
kind: Deployment
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     # 卷名与volumes卷名一致
              mountPath: /persistentvolumes   # pod内部共享路径
          env:
            - name: PROVISIONER_NAME   # 供应商名
              value: example.com/nfs   # 供应商值
            - name: NFS_SERVER         # NFS服务器名
              value: 192.168.40.180    # NFS自己的宿主机ip
            - name: NFS_PATH           # NFS共享目录名
              value: /data/nfs_pro/    # NFS创建的共享目录
      volumes:
        - name: nfs-client-root        # 存储卷名 要与加载卷 相同
          nfs:
            server: 192.168.40.180     # NFS自己的宿主机ip
            path: /data/nfs_pro/       # NFS创建的共享目录

5,创建存储类storageclass

# cat nfs-storageclass.yaml 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs                    # 存储类的名字,下一步要用到
provisioner: example.com/nfs   # 供应商要与上一步创建的供应商相同
kubectl get sc[storageclass]

6,创建pvc,采用storageclass动态生成pv

创建pvc的同时,通过storageclass动态也生成了pv

# cat pvc-claim.yaml 

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim1         # pvc名称,下一步创建pod要用
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi
  storageClassName:  nfs    # 与上一步创建的存储类【nfs】名称一致

# 生成了pvc
kubectl get pvc[PersistentVolumeClaim]

# 生成了pv
kubectl get pv[PersistentVolume]

【步骤总结】:
1、供应商:创建一个nfs provisioner
2、创建storageclass,storageclass指定刚才创建的供应商
3、创建pvc,这个pvc指定storageclass

二,用存储类storageclass创建pod

1,创建pod

创建pod,挂载storageclass动态生成的pvc:test-claim1

# cat read-pod.yaml 

kind: Pod
apiVersion: v1
metadata:
  name: read-pod
spec:
  containers:
  - name: read-pod
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc                 # volumes名称相同
        mountPath: /usr/share/nginx/html
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc                   # 名称要与volumeMounts相同
      persistentVolumeClaim:
        claimName: test-claim1        # pvc名称,上一步已经创建    
kubectl apply -f read-pod.yaml 

2,验证存储共享目录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直奔跑在路上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值