storageclass

storageclass是一个存储类,通过创建storageclass可以动态生成一个存储卷供k8s用户使用。

[root@master ~]# kubectl explain storageclass

KIND:     StorageClass
VERSION:  storage.k8s.io/v1DESCRIPTION:StorageClass describes the parameters for a class of storage for whichPersistentVolumes can be dynamically provisioned.StorageClasses are non-namespaced; the name of the storage class accordingto etcd is in ObjectMeta.Name.FIELDS:allowVolumeExpansion <boolean>AllowVolumeExpansion shows whether the storage class allow volume expandallowedTopologies    <[]Object>Restrict the node topologies where volumes can be dynamically provisioned.Each volume plugin defines its own supported topology specifications. Anempty TopologySelectorTerm list means there is no topology restriction.This field is only honored by servers that enable the VolumeSchedulingfeature.apiVersion   <string>APIVersion defines the versioned schema of this representation of anobject. Servers should convert recognized schemas to the latest internalvalue, and may reject unrecognized values. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resourceskind <string>Kind is a string value representing the REST resource this objectrepresents. Servers may infer this from the endpoint the client submitsrequests to. Cannot be updated. In CamelCase. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsmetadata     <Object>Standard object's metadata. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadatamountOptions <[]string>Dynamically provisioned PersistentVolumes of this storage class are createdwith these mountOptions, e.g. ["ro", "soft"]. Not validated - mount of thePVs will simply fail if one is invalid.parameters   <map[string]string>Parameters holds the parameters for the provisioner that should createvolumes of this storage class.provisioner  <string> -required-Provisioner indicates the type of the provisioner.reclaimPolicy        <string>Dynamically provisioned PersistentVolumes of this storage class are createdwith this reclaimPolicy. Defaults to Delete.volumeBindingMode    <string>VolumeBindingMode indicates how PersistentVolumeClaims should beprovisioned and bound. When unset, VolumeBindingImmediate is used. Thisfield is only honored by servers that enable the VolumeScheduling feature.

官方亚马逊的创建举例

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: standard
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:- debug
volumeBindingMode: Immediate

Provisioner

storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv。provisioner既可以是内部供应程序,也可以由外部供应商提供,外部供应商需要额外的配置。

官网地址有详细的介绍
https://kubernetes.io/docs/concepts/storage/storage-classes/ 搜索Provisioner
如果是外部供应商可以参考https://github.com/kubernetes-incubator/external-storage/下提供的方法创建storageclass的provisioner

parameters

type: io1、gp2、sc1、 st1,默认值:gp2,详细见官网

reclaimPolicy(回收策略)

由存储类动态创建持久化存储卷(pv)时可以指定reclaimPolicy字段,这个字段中指定的回收策略可以是Delete或Retain。 如果在创建StorageClass对象时未指定reclaimPolicy,则默认为Delete。

Mount Options(挂载选项)

如果Volume Plugin不支持这个挂载选项,但是指定了,就会使provisioner创建失败

Volume Binding Mode(卷绑定模式)

这个字段用来说明什么时候进行卷绑定和动态配置;

默认情况下,立即模式Immediate表示一旦创建了PersistentVolumeClaim,就会发生卷绑定和动态配置。对于受拓扑约束且无法从群集中的所有节点全局访问的存储后端,将在不知道Pod的调度要求的情况下绑定或配置PersistentVolumes。这可能导致不可调度的Pod。

集群管理员可以通过指定WaitForFirstConsumer模式将延迟绑定和配置PersistentVolume,直到创建使用PersistentVolumeClaim的Pod。将根据Pod的调度约束指定的拓扑选择或配置PersistentVolumes。这些包括但不限于资源需求,节点选择器,pod亲和力和反亲和力,以及污点和容忍度。

允许卷扩展

PersistentVolume 可以配置为可扩展。将此功能设置为 true 时,允许用户通过编辑相应的 PVC 对象来调整卷大小。当基础存储类的 allowVolumeExpansion 字段设置为 true 时,卷支持卷扩展,种类见官网,此功能仅可用于扩容卷,不能用于缩小卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: standard
provisioner: kubernetes.io/gce-pd
parameters:type: pd-standard
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:- key: failure-domain.beta.kubernetes.io/zonevalues:- us-central1-a- us-central1-b

参数

Storage class 具有描述属于该存储类的卷的参数。可以接受的不同的参数取决于provisioner。 例如,参数 type 的值 io1 和参数 iopsPerGB 特定于 EBS PV。当参数被省略时,会使用默认值。一个 StorageClass 最多可以定义 512 个参数。这些参数对象的总长度不能超过 256 KiB, 包括参数的键和值。

provisioner种类比较多,具体需要看官方网站,这里简单介绍几个

Glusterfs

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: slow
provisioner: kubernetes.io/glusterfs
parameters:resturl: "http://127.0.0.1:8081"clusterid: "630372ccdc720a92c681fb928f27b53f"restauthenabled: "true"restuser: "admin"secretNamespace: "default"secretName: "heketi-secret"gidMin: "40000"gidMax: "50000"volumetype: "replicate:3"

resturl:分配 gluster 卷的需求的 Gluster REST 服务/Heketi服务url。Heketi可用于管理glusterfs。 通用格式应该是 IPaddress:Port,这是 GlusterFS 动态分配器的必需参数。 如果 Heketi 服务在 openshift/kubernetes 中安装并暴露为可路由服务,则可以使用类似于 http://heketi-storage-project.cloudapps.mystorage.com 的格式,其中 fqdn 是可解析的 heketi 服务网址。

restauthenabled:Gluster REST 服务身份验证布尔值,用于启用对 REST 服务器的身份验证。如果此值为 ‘true’,则必须填写 restuser 和 restuserkey 或 secretNamespace + secretName。此选项已弃用,当在指定 restuser,restuserkey,secretName 或 secretNamespace 时,身份验证被启用。

restuser:在 Gluster 可信池中有权创建卷的 Gluster REST服务/Heketi 用户。

restuserkey:Gluster REST服务/Heketi用户的密码将被用于对 REST 服务器进行身份验证。此参数已弃用,取而代之的是secretNamespace+secretName。

secretNamespace,secretName:Secret 实例的标识,包含与 Gluster REST 服务交互时使用的用户密码。 这些参数是可选的,secretNamespace和secretName都省略时使用空密码。所提供的 Secret 必须将类型设置为“kubernetes.io/glusterfs”,例如以这种方式创建:

kubectl create secret generic heketi-secret  --type="kubernetes.io/glusterfs"  --from-literal=key='opensesame'   --namespace=default

secret 的例子可以在 glusterfs-provisioning-secret.yaml 中找到。

clusterid:630372ccdc720a92c681fb928f27b53f是集群的ID,当分配卷时,Heketi 将会使用这个文件。它也可以是一个 clusterid 列表,例如: “8452344e2becec931ece4e33c4674e4e,42982310d
e6c63381718ccfa6d8cf397”。这个是可选参数。

gidMin,gidMax:storage class GID 范围的最小值和最大值。在此范围(gidMin-gidMax)内的唯一值(GID)将用于动态分配卷。这些是可选的值。如果不指定,卷将被分配一个 2000-2147483647 之间的值,这是 gidMin 和 gidMax 的默认值。

volumetype:卷的类型及其参数可以用这个可选值进行配置。如果未声明卷类型,则由分配器决定卷的类型。例如:volumetype: replicate:3 其中 ‘3’ 是 replica 数量. ‘Disperse/EC volume’: volumetype: disperse:4:2 其中 ‘4’ 是数据,‘2’ 是冗余数量,也可以把volumetype设置成none,volumetype: none有关可用的卷类型和管理选项,请参阅管理指南。更多相关的参考信息,请参阅如何配置 Heketi。

当动态分配持久卷时,Gluster插件自动创建名为gluster-dynamic- 的端点和 headless service。在 PVC 被删除时动态端点和 headless service 会自动被删除。

Ceph RBD

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast
provisioner: kubernetes.io/rbd
parameters:monitors: 10.16.153.105:6789adminId: kubeadminSecretName: ceph-secretadminSecretNamespace: kube-systempool: kubeuserId: kubeuserSecretName: ceph-secret-useruserSecretNamespace: defaultfsType: ext4imageFormat: "2"imageFeatures: "layering"

monitors:Ceph monitor,逗号分隔。该参数是必需的。
adminId:Ceph 客户端 ID,用于在池 ceph 池中创建映像。默认是 “admin”。
adminSecret:adminId 的 Secret 名称。该参数是必需的。 提供的 secret 必须有值为 “kubernetes.io/rbd” 的 type 参数。
adminSecretNamespace:adminSecret 的命名空间。默认是 “default”。
pool: Ceph RBD 池. 默认是 “rbd”。
userId:Ceph 客户端 ID,用于映射 RBD 镜像。默认与 adminId 相同。
userSecretName:用于映射 RBD 镜像的 userId 的Ceph Secret的名字。 它必须与PVC存在于相同的namespace 中。该参数是必需的。提供的 secret必须具有值为 “kubernetes.io/rbd” 的 type参数,例如以这样的方式创建:

kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \--from-literal=key='QVFEQ1pMdFhPUnQrSmhBQUFYaERWNHJsZ3BsMmNjcDR6RFZST0E9PQ==' \ --namespace=kube-system

userSecretNamespace:userSecretName 的命名空间。
fsType:Kubernetes支持的fsType。默认:“ext4”。
imageFormat:Ceph RBD镜像格式,“1” 或者 “2”。默认值是 “1”。
imageFeatures:这个参数是可选的,只能在你将 imageFormat 设置为 “2” 才使用。目前支持的功能只是 layering。默认是 “",没有功能打开。

NFS (外部供应)

参考https://jimmysong.io/kubernetes-handbook/practice/using-nfs-for-persistent-storage.html

(1)创建运行nfs-provisioner的sa账号

[root@master ~]# vim serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
[root@master ~]# kubectl apply -f serviceaccount.yaml
[root@master ~]# kubectl get serviceaccount
NAME              SECRETS   AGE
default           1         17d
nfs-provisioner   1         27s

(2)对sa账号做rbac授权

[root@master ~]# vim rbac.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-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"]- apiGroups: [""]resources: ["services", "endpoints"]verbs: ["get"]- apiGroups: ["extensions"]resources: ["podsecuritypolicies"]resourceNames: ["nfs-provisioner"]verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-provisioner
subjects:- kind: ServiceAccountname: nfs-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-provisioner
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-provisioner
subjects:- kind: ServiceAccountname: nfs-provisionernamespace: default
roleRef:kind: Rolename: leader-locking-nfs-provisionerapiGroup: rbac.authorization.k8s.io
[root@master ~]# kubectl apply -f rbac.yaml

(3)通过deployment创建pod用来运行nfs-provisioner程序(用来划分pv的程序

[root@master ~]# mkdir -p /data/nfs_pro
[root@master ~]# vim /etc/exports
/data/nfs_pro 192.168.1.11/24(rw,no_root_squash)
[root@master ~]# systemctl restart nfs
[root@master ~]# vim nfs-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccountName: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 192.168.1.11- name: NFS_PATHvalue: /data/nfs_provolumes:- name: nfs-client-rootnfs:server: 192.168.1.11path: /data/nfs_pro
[root@master ~]# kubectl apply -f nfs-deployment.yaml
[root@master ~]# kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
nfs-provisioner-fd5f59b5f-qsnhx   1/1     Running   0          4s

(4)创建storageclass

[root@master ~]# vim nfs-deployment.yaml
[root@master ~]# vim nfs-storageclass.yaml
[root@master ~]# cat nfs-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: nfs
provisioner: example.com/nfs     #deployment里面ENV字段里的对应
[root@master ~]# kubectl apply -f nfs-storageclass.yaml
[root@master ~]# kubectl get sc
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    example.com/nfs   Delete          Immediate     false          17s

(5)创建pvc

[root@master ~]# vim claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:accessModes:  [“ReadWriteMany”]resources:requests:storage: 1GistorageClassName:  nfs
此时查看pv和pvc,发现都没有创建
[root@master ~]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM
[root@master ~]# kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
[root@master ~]# kubectl apply -f claim.yaml
此时查看pv和pvc,发现被动态的创建了
[root@master ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                 STORAGECLASS   REASON   AGE
pvc-97141599-5dec-463c-8abe-c2ad12fe687d   1Gi        RWX            Delete           Bound       default/test-claim1   nfs                     115s
[root@master ~]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim1   Bound    pvc-97141599-5dec-463c-8abe-c2ad12fe687d   1Gi        RWX            nfs            119s

(6)创建pod,使用storageclass动态生成pv

[root@master ~]# vim read-pod.yaml
kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-podimage: nginxvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
[root@master ~]# kubectl apply -f read-pod.yaml
[root@master ~]# kubectl get pod -owide
read-pod        1/1     Running   0          10s   10.244.1.95   node1
[root@master ~]# kubectl describe pod read-pod
Volumes:nfs-pvc:Type:       PersistentVolumeClaim ClaimName:  test-claim1

创建statefulset,动态生成存储

需要上面的第(1)、(2)、(3)、(4)都部署成功才可以使用下面的volumeClaimTemplate

[root@master ~]# vim statefulset-storage.yaml
apiVersion: v1
kind: Service
metadata:name: storagelabels:app: storage
spec:ports:- port: 80name: webclusterIP: Noneselector:app: storage
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: storage
spec:selector:matchLabels:app: storageserviceName: "storage"replicas: 2template:metadata:labels:app: storagespec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwannotations:volume.beta.kubernetes.io/storage-class: "nfs"spec:accessModes: [ "ReadWriteMany" ]resources:requests:storage: 2Gi
[root@master ~]# kubectl apply -f statefulset-storage.yaml
[root@master ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)
storage       ClusterIP   None            <none>        80/TCP
[root@master ~]# kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
storage-0                         1/1     Running   0          29s
storage-1                         1/1     Running   0          27s
[root@master ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pvc-ab21661f-6c0e-42cd-9895-d82c511595df   2Gi        RWX            Delete           Bound       default/www-storage-1   nfs                     6m49s
pvc-e9de3930-288c-46e3-9c22-378777e2cf30   2Gi        RWX            Delete           Bound       default/www-storage-0   nfs
[root@master ~]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-storage-0   Bound    pvc-e9de3930-288c-46e3-9c22-378777e2cf30   2Gi        RWX            nfs            10m
www-storage-1   Bound    pvc-ab21661f-6c0e-42cd-9895-d82c511595df   2Gi        RWX            nfs            8m1s

K8S学习之storageclass相关推荐

  1. K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程

    K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...

  2. 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

    .NET Core on K8s学习之旅 更新记录: -- 20200511 增加Ingress & Nginx Ingress介绍 -- 20200515 增加Ocelot API网关集成示 ...

  3. ASP.NET Core on K8s学习之旅(14)Ingress灰度发布

    [云原生]| 作者/Edison Zhou 这是恰童鞋骚年的第236篇原创文章 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,然后我还录了一个快速分享小视频介绍了一 ...

  4. ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

    [云原生]| 作者/Edison Zhou 这是恰童鞋骚年的第232篇原创文章 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,考虑到很多团队都在使用Ocelot作为 ...

  5. .NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

    更新记录: -- 2019-11-26 增加Docker容器日志系列文章 近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个flag:完成这个<.NET ...

  6. .NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

    更新记录: -- 2019-11-16 增加Docker容器监控系列文章 // 此外,今天是11月17日,我又老了一岁,祝我自己生日快乐! 近期在学习Kubernetes,基于之前做笔记的习惯,已经写 ...

  7. .NET Core on K8S学习实践系列文章索引(持续更新)

    近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个2019年的flag:完成这个<.NET Core on K8S学习实践>系列文章!这个系列会持续 ...

  8. ASP.NET Core on K8S学习初探(1)

    " [LOG] ASP.NET Core on K8S Starting..." 01 - 写在之前 当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务 ...

  9. K8s学习进阶月刊第一期:Kubernetes and Cloud Native Meetup (北京站)...

    欢迎订阅K8s学习进阶月刊 干货资料尽情下载 线上直播: 直播主题内容 第一部分:混沌工程的背景和原理 第二部分:结合容器场景,介绍混沌工程的一些实践方法和常见工具 分享嘉宾:中亭 阿里巴巴高级技术专 ...

最新文章

  1. css中 media的用法,如何在css中正确使用@media
  2. flink source 同步_为什么说 Flink + AI 值得期待?
  3. oracle job 定时执行参数
  4. (需求实战_03) SpringBoot整合RabbitMQ 关键代码、策略、模式讲解
  5. codesys com库_CoDeSys官方系统库在线下载,替换国内下载服务器教程
  6. java爬虫隐藏表单提交_java爬虫--jsoup简单的表单抓取案例
  7. PowerDesigner 15生成数据字典
  8. JS日期比较大小 给定时间和持续时间计算最终时间
  9. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration的解决
  10. c#窗体编辑个人简历_C#个人简历完整代码
  11. mac触控板 鼠标中键_如何使用触控板,鼠标或键盘在任何Mac上单击鼠标右键
  12. 算法入门篇:排序算法(一)
  13. java摇两个色子代码_摇个骰子 - mokuang - 博客园
  14. Python将npy文件转换为mat文件
  15. python神经网络预测股票组合_神经网络预测股票市场
  16. D. 1.绿纹龙的森林游记
  17. java下载压缩包文件zip
  18. 二叉树的前序、中序、后序
  19. 自然语言中corpora.Dictionary的理解
  20. 有效的沟通,如忍者的最后一击!

热门文章

  1. 利用sql profile固定执行计划加快OGG同步
  2. 涅槃?高效报表开发人员的五件武器
  3. Mac使用数据线连接安卓手机传输文件
  4. 计算机硬件知识硬盘,DIY硬件知识:小白必看的硬盘基础知识大全
  5. 转自于四火的唠叨(工程师的生活)
  6. 全景krpano相关问题解答
  7. Windows10系统内置的emoji表情
  8. PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
  9. sql的null对求和的影响
  10. elasticsearch 数据类型