飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

k8s-storage-class

时间:2022-01-20  作者:ludangxin  

1. 简介

StorageClass 为管理员提供了描述存储 "类" 的方法。

通过StorageClass的定义,管理员可以将存储资源定义为某种类别(Class),正如存储设备对于自身的配置描述(Profile),例如 "快速存储" "慢速存储" "有数据冗余" "无数据冗余"等。用户根据StorageClass的描述就能够直观得知各种存储资源的特性,就可以根据应用对存储资源的需求去申请存储资源了。

StorageClass作为对存储资源的抽象定义,对用户设置的PVC申请屏蔽后端的细节,一方面减轻用户对于存储资源细节的关注,另一方面也减轻了管理员手工管理PV的工作,由系统自动完成PV的创建和绑定,实现了动态的资源供应。

每个 StorageClass 都包含 provisionerparametersreclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

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

2. 创建Provisioner

如果需要使用StorageClass,我们就需要安装对应的自动配置程序,比如我们这里后端采用的是nfs,那么我们就需要使用到一个nfs-client的自动配置程序,我们也叫它Provisioner,这个程序使用我们已经配置好的nfs服务器,来自动创建持久卷,也就是自动帮我们创建PV

自动创建的PV以{namespace}-${pvcname}-${pvname}进行命名到服务器上

如果开启了archiveOnDelete功能,则当pv被回收后会以archieved-${namespace}-${pvcname}-${pvname}格式存在服务器上

2.1 创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: 域名/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: 域名/ifs
            - name: NFS_SERVER
              # nfs server 地址
              value: 192.域名
            - name: NFS_PATH
              # nfs 挂载点
              value: /nfs/data
      volumes:
        - name: nfs-client-root
          nfs:
            # nfs server 地址
            server: 192.域名
            # nfs 挂载点
            path: /nfs/data

2.2 rbac

接下来我们还需要创建一个serveraccount,用于将nfs-client-provisioner中的ServiceAccount绑定到一个nfs-client-provisioner-runner的ClusterRole。而该ClusterRole声明了一些权限,其中就包括了对persistentvolumes的增删改查,所以我们就可以利用ServiceAccount来自动创建PV

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
---
kind: ClusterRole
apiVersion: 域名.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["域名"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: 域名.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: 域名.io
---
kind: Role
apiVersion: 域名.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: 域名.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: 域名.io

2.3 storage-class

provisioner值可以自定义但需要和deployment的 域名域名 PROVISIONER_NAME 保持一致

这里我们声明了一个名为managed-nfs-storage的Storageclass对象

apiVersion: 域名/v1
kind: StorageClass
metadata:
  annotations:
    # 设置为default StorageClass,如果创建pvc时不指定StorageClass,则会使用当前的StorageClass
    域名/is-default-class: "true"
  name: managed-nfs-storage
provisioner: 域名/ifs # or choose another name, must match deployment\'s env PROVISIONER_NAME\'
parameters:
  # 删除PVC时不会保留数据
  archiveOnDelete: "false"
# 回收策略:删除
reclaimPolicy: Delete
#允许pvc创建后扩容
allowVolumeExpansion: true

这里也可以直接参考nfs-client的官方文档

https://域名/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

2.4 创建资源

创建信息如下

资源信息如下

3. 验证动态创建pv

首先创建个pvc,看下是否会动态的创建pv

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    #storageclass 名称
    域名域名/storage-class: "managed-nfs-storage"
spec:
  #访问模式
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      #请求数据大小
      storage: 1024Mi

从图中可以看出,我们不需要的手动创建pv,只需要创建一个pvc,storageclass会自动将pv给创建并且关联,就很nice

使用pvc

我们这里创建一个deployment,使用下刚创建的pvc: test-claim

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: test-claim

测试演示步骤如下:

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。