k8s-storage-class

发布于 1970年 01月 01日 08:00

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: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs - name: NFS_SERVER # nfs server 地址 value: 192.168.0.201 - name: NFS_PATH # nfs 挂载点 value: /nfs/data volumes: - name: nfs-client-root nfs: # nfs server 地址 server: 192.168.0.201 # 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: rbac.authorization.k8s.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: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.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: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.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: rbac.authorization.k8s.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: rbac.authorization.k8s.io

2.3 storage-class

provisioner值可以自定义但需要和deployment的 template.spec.containers.env PROVISIONER_NAME 保持一致

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

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

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

https://github.com/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 名称 volume.beta.kubernetes.io/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

测试演示步骤如下:


__EOF__

本文作者张铁牛
本文链接https://www.cnblogs.com/ludangxin/p/15824672.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!