每天一点基础K8S--K8S中的存储类storage Class

存储类storageClass

1、官网链接

https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/

2、storageClass资源

# 在前面持久卷的实验中看到,对于静态绑定的pv,完成流程是1、创建PV;2、创建PVC;3、POD进行volumeMounts。

# 如果每次手动创建PV有点麻烦,那么可以利用storageClass实现动态PV创建,就不用每次都手动创建PV了。

# 每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态制备 PersistentVolume 时会使用到。

# StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。
provisioner: AzureFile、AzureDisk、CephFS、Cinder、FC、NFS、GlusterFS、iSCSI、RBD、Local等等

parameters:对接不同存储时,使用到的参数不一样,可以根据官网查看示例。

3、使用storageClass的大致步骤

pod通过volume Mounts挂载一个数据库volume,该volume类型为PVC。但是PV并没有提前创建,而是通过storageClass完成PV的动态创建。storageClass中指定了提供者provisioner,provisioner可以关联相应类型的存储资源,如NFS。

4、利用storageClass动态创建存储卷

4.1、创建serviceaccount nfs-provisioner
[root@master-worker-node-1 storage]# kubectl create serviceaccount nfs-provisioner
serviceaccount/nfs-provisioner created
4.2、为sa nfs-provisioner授权
[root@master-worker-node-1 storage]# kubectl create clusterrolebinding nfs-provisioner-cluster-role-binding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-cluster-role-binding created
4.3、安装provisioner程序
# 此处以POD运行一个provisioner
[root@master-worker-node-1 storage]# cat nfs-provisioner.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      func: nfs-provisioner
  template:
    metadata:
      labels:
        func: nfs-provisioner
    spec:    
      serviceAccount: nfs-provisioner
      containers:
      - name: nfs-provisioner
        image: groundhog2k/nfs-subdir-external-provisioner:v3.2.0
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: nfs
          mountPath: /persistentvolumes
        env:
        - name: PROVISIONER_NAME
          value: test.com/nfs
        - name: NFS_SERVER
          value: 192.168.122.106
        - name: NFS_PATH
          value: /mnt/dir-6
      volumes:
      - name: nfs
        nfs: 
          server: 192.168.122.106
          path: /mnt/dir-6


[root@master-worker-node-1 storage]# kubectl apply -f nfs-provisioner.yaml 
deployment.apps/nfs-provisioner created

[root@master-worker-node-1 storage]# kubectl get pods -o wide 
NAME                              READY   STATUS    RESTARTS   AGE   IP             NODE                 NOMINATED NODE   READINESS GATES
nfs-provisioner-9f679b579-mxjrl   1/1     Running   0          86s   10.244.31.19   only-worker-node-3   <none>           <none>


[root@master-worker-node-1 storage]# kubectl exec -it nfs-provisioner-9f679b579-mxjrl  -- bash 
[root@nfs-provisioner-9f679b579-mxjrl /]# 
[root@nfs-provisioner-9f679b579-mxjrl /]# df -Th
Filesystem                 Type     Size  Used Avail Use% Mounted on
overlay                    overlay   20G  6.5G   14G  33% /
tmpfs                      tmpfs     64M     0   64M   0% /dev
tmpfs                      tmpfs    3.8G     0  3.8G   0% /sys/fs/cgroup
192.168.122.106:/mnt/dir-6 nfs4      20G  6.1G   14G  31% /persistentvolumes

4.4 创建storageClass以实现动态创建PV
# 创建storageClass
[root@master-worker-node-1 storage]# cat storageclass-1.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: from-nfs
volumeBindingMode: Immediate    # 默认immediate,表示创建PVC立即进行绑定。只有azuredisk和AWSelasticblockstore支持其他值,具体可以查看官网。
provisioner: test.com/nfs       # 此处与nfs-provisioner环境变量中的PROVISIONER_NAME保持一致。
#parameters:        # 在nfs-provisioner中指定了,这里就不写了。
#  server: 192.168.122.106
#  path: /mnt/dir-6
#  readOnly: "true"
# 查看创建的storageclass
[root@master-worker-node-1 storage]# kubectl apply -f storageClass-1.yaml 
storageclass.storage.k8s.io/from-nfs created

[root@master-worker-node-1 storage]# kubectl get storageclass
NAME       PROVISIONER    RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
from-nfs   test.com/nfs   Delete          Immediate           false                  8s
4.5 创建PVC,并通过storageClass自动创建PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-auto
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 300Mi
  storageClassName: from-nfs
# PVC创建成功,并完成了关联。
[root@master-worker-node-1 storage]# kubectl get pvc 
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-auto   Bound    pvc-42142c11-20e7-44ac-b210-0a520f2fc766   300Mi      RWO            from-nfs       5s
[root@master-worker-node-1 storage]# 

# 自动创建了一个PV
[root@master-worker-node-1 storage]# kubectl get pv 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pvc-42142c11-20e7-44ac-b210-0a520f2fc766   300Mi      RWO            Delete           Bound    default/test-auto   from-nfs                37s
4.6 Pod卷挂载(略)

5、小结

1、可以利用storageClass进行动态创建PV,而不是手动创建;

2、使用StorageClass动态创建PV的步骤:1、先完成provisioner配置;2、完成storageclass配置;3、创建PVC;4、Pod挂载数据卷

posted @ 2022-12-24 00:06  woshinidaye  阅读(2013)  评论(0编辑  收藏  举报