1 StorageClass

一般情况下,我们不会去手动管理PV,我们会采用自动创建的方式来实现,先来了解一下StorageClass。

官网:https://kubernetes.io/docs/concepts/storage/storage-classes/

nfs githubgithub:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs

A StorageClass provides a way for administrators to describe the “classes” of storage they offer. Different classes might map to quality-of-service levels, or to backup policies, or to arbitrary policies determined by the cluster administrators. Kubernetes itself is unopinionated about what classes represent. This concept is sometimes called “profiles” in other storage systems.
Each StorageClass contains the fields provisioner, parameters, and reclaimPolicy, which are used when a PersistentVolume belonging to the class needs to be dynamically provisioned.The name of a StorageClass object is significant, and is how users can request a particular class. Administrators set the name and other parameters of a class when first creating StorageClass objects, and the objects cannot be updated once they are created.

StorageClass声明存储插件,用于自动创建PV。通俗点说,StorageClass就是创建PV的模板,其中包含有两个重要部分:PV属性和创建此PV所需要的插件。

这样PVC就可以按“Class”来匹配PV。

可以为PV指定storageClassName属性,标识PV归属于哪一个Class。

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
01 对于PV或者StorageClass只能对应一种后端存储
02 对于手动的情况,一般我们会创建很多的PV,等有PVC需要使用的时候就可以直接使用了
03 对于自动的情况,那么就由StorageClass来自动管理创建
04 如果Pod想要使用共享存储,一般会在创建PVC,PVC中描述了想要什么类型的后端存储、空间等,K8s从而会匹配对应的PV,如果没有匹配成功,Pod就会处于Pending状态。Pod中使用只需要像使用volumes一样,指定名字就可以使用了
05 一个Pod可以使用多个PVC,一个PVC也可以给多个Pod使用
06 一个PVC只能绑定一个PV,一个PV只能对应一种后端存储

有了StorageClass之后的PVC可以变成如下的形式:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1
spec:
accessModes:- ReadWriteMany
resources:requests:storage: 1MistorageClassName: nfs

StorageClass之所以能够动态供给PV,是因为Provisioner,也就是Dynamic Provisioning,通过Provisioner插件可以根据不同服务器的类型进行创建不同类型的PV。

但是NFS这种类型,K8s中默认是没有Provisioner插件的,需要自己创建。

下面我们就来看一个storageClass的一个实战。

2 StorageClass实战

上面提到的nfs的Provisioner可以到GitHub上查到,github:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs

下面开始使用StorageClass创建pv:

(1)使用前面安装好的NFS服务器,创建目录;

mkdir -p /nfs/data/henry

(2)在k8s的master节点上,根据rbac.yaml文件创建资源

执行rabc.yaml文件的原因是创建StorageClass的资源,需要有访问api-server的权限。

#到 https://github.com/kubernetes-incubator/external-storage/blob/master/nfs/deploy/kubernetes/rbac.yaml下载下载rbac.yaml文件#执行yaml文件创建资源
[root@henry001 storage]# kubectl apply -f rbac.yaml
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created

(3)根据deployment.yaml文件创建资源

创建访问nfs服务器的插件nfs-provisioner,注意此时并不是创建应用的pod

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: nfs-provisioner
spec:replicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisionervolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 39.105.208.211  - name: NFS_PATHvalue: /nfs/data/henryvolumes:- name: nfs-client-rootnfs:server: 39.105.208.211 path: /nfs/data/henry
[root@henry001 storage]# kubectl apply -f deployment.yaml
serviceaccount/nfs-provisioner created
deployment.extensions/nfs-provisioner created
[root@henry001 storage]# kubectl get deployment
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
nfs-provisioner   1/1     1            1           16s

(4)根据class.yaml创建资源

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: example-nfs
provisioner: example.com/nfs
#创建storageClass
[root@henry001 storage]# kubectl apply -f class.yaml
storageclass.storage.k8s.io/example-nfs create

(5)根据my-pvc.yaml创建资源

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: my-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Mi# 这个名字要和上面创建的storageclass名称一致storageClassName: example-nfs
`创建pvc资源`
[root@henry001 storage]# kubectl apply -f my-pvc.yaml
persistentvolumeclaim/my-pvc created`查看pvc已处于Bound状态,使用的storageClass是example-nfs`
[root@henry001 storage]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc      Bound    pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9   1Mi        RWX            example-nfs    14s`查看pv已处于Bound状态,使用的storageClass是example-nfs`
[root@henry001 storage]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9   1Mi        RWX            Delete           Bound    default/my-pvc      example-nfs             27s

(6)根据nginx-pod创建资源

vim nginx-pod.yaml
kind: Pod
apiVersion: v1
metadata:name: nginx
spec:containers:- name: nginximage: nginxvolumeMounts:- name: my-pvcmountPath: "/usr/henry"restartPolicy: "Never"volumes:- name: my-pvcpersistentVolumeClaim:claimName: my-pvc
`创建pod`
[root@henry001 storage]# kubectl apply -f nginx-pod.yaml
pod/nginx created
[root@henry001 storage]# kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS   AGE   IP                NODE       NOMINATED NODE   READINESS GATES
nfs-provisioner-7484889c75-8grtp   1/1     Running   0          20h   192.168.254.224   henry003   <none>           <none>
nginx                              1/1     Running   0          50s   192.168.254.225   henry003   <none>           <none>
nginx-c4998fd44-gwwxb              1/1     Running   0          28h   192.168.217.23    henry002   <none>           <none>-----------------`下面做一些同步的测试`-------------------------
`01 进入容器,此时/usr/henry下无文件`
[root@henry001 storage]# kubectl exec -it nginx bash
root@nginx:/# cd /usr/henry
root@nginx:/usr/henry# ls`02 进入nfs共享路径下/nfs/data/henry,发现有一个文件夹,文件夹下内容为空`
[root@henry001 ~]# cd /nfs/data/henry
[root@henry001 henry]# ls
default-my-pvc-pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9
[root@henry001 henry]# cd default-my-pvc-pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9/
[root@henry001 default-my-pvc-pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9]# ls`03在共享文件夹下新建一个文件henry.html`
[root@henry001 default-my-pvc-pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9]# echo 'hello henry' >henry.html
[root@henry001 default-my-pvc-pvc-3c920a3a-2fc2-11ea-8e59-00163e2c61c9]# cat henry.html
hello henry`04 进入容器的/usr/henry文件下查看`
root@nginx:/usr/henry# ls /usr/henry
henry.html
root@nginx:/usr/henry# cat /usr/henry/henry.html
hello henry

总结: 通过上面的例子我们可以看到使用storageClass来动态创建pv,这样就大大节省了先创建pv闲置造成的资源浪费。

3 PV的状态和回收策略

  • PV的状态

Available:表示当前的pv没有被绑定

Bound:表示已经被pvc挂载

Released:pvc没有在使用pv, 需要管理员手工释放pv

Failed:资源回收失败

  • PV回收策略

Retain:表示删除PVC的时候,PV不会一起删除,而是变成Released状态等待管理员手动清理

Recycle:在Kubernetes新版本就不用了,采用动态PV供给来替代

Delete:表示删除PVC的时候,PV也会一起删除,同时也删除PV所指向的实际存储空间

注意:目前只有NFS和HostPath支持Recycle策略。AWS EBS、GCE PD、Azure Disk和Cinder支持Delete策略

kubernetes进阶之路(十六)~~~Storage系列之StorageClass相关推荐

  1. Python 进阶之路 (十二) 尾声即是开始

    Python进阶之路总结 大家好,我的<< Python进阶之路>>到这一期就到此为止了,和 <<Python 基础起步>>不同,在掌握了一些基础知识后 ...

  2. Redis进阶实践之十六 Redis大批量增加数据

    原文:Redis进阶实践之十六 Redis大批量增加数据 一.介绍 有时候,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档 ...

  3. 六级考研单词之路-十六

    title: 六级考研单词之路-十六 date: 2020-12-03 07:17:03 tags: 六级考研单词之路 Day16 1.accident[n.意外,事故,意外事件] eg: The d ...

  4. 【Python】【进阶篇】十六、Python爬虫的浏览器实现抓包

    目录 十六.Python爬虫的浏览器实现抓包 16.1 控制台界面 16.1.1 NetWork 16.1.2 Sources 16.1.3 Console 16.1.4 Application 16 ...

  5. JAVA架构师之路十六:设计模式之责任链模式

    JAVA架构师之路十五:设计模式之策略模式 责任链模式 1. 责任链模式 2. 登陆案例 3. 登陆案例优化 人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得 ...

  6. 我的编程之路(十六) 兄弟 恋人 朋友 同学

    近三个星期,同学.朋友不断地光临,自己没有时间好好学习.写博客,实在惭愧,回顾这三个星期,有很多纠结.矛盾的心理历程: 1.失败的东道主: 关系最好的四个人,约定好,以后都要在彼此的城市旅游一次:广州 ...

  7. Python 进阶之路 (十) 再立Flag, 社区最全的itertools深度解析(中)

    前情回顾 大家好,我又回来了.今天我会继续和大家分享itertools这个神奇的自带库,首先,让我们回顾一下上一期结尾的时候我们讲到的3个方法: combinations() combinations ...

  8. python flagin flagout_Python 进阶之路 (十) 再立Flag, 社区最全的itertools深度解析(中)...

    前情回顾 大家好,我又回来了.今天我会继续和大家分享itertools这个神奇的自带库,首先,让我们回顾一下上一期结尾的时候我们讲到的3个方法: combinations() combinations ...

  9. c# 对象json互相转换_Go语言进阶之路(六):内置JSON库和开源库gjson

    Go语言内置了部分JSON函数,可以方便地在Go语言结构体实例和JSON字符串之间互相转换.这可比Java强多了. 不过Go语言内置的json库功能比较鸡肋,只能在结构体和JSON之间相互转换,没办法 ...

最新文章

  1. 【亲测有效】如何安装屏幕录制工具ScreenPresso
  2. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
  3. Window 消息大全使用详解(无聊没事做)
  4. 【webservice】JAX-WS独立服务使用
  5. python基础(一)简单入门
  6. ORA-01114: 将块写入文件 35 时出现 IO 错误
  7. 【Chrome浏览器】常用快捷键整理
  8. linux中用户识别码,C语言中设置用户识别码的相关函数的简单讲解
  9. linux-权限案例-文件与目录权限
  10. verilog存小数_FPGA定点小数计算(Verilog版)第二篇——乘法运算
  11. webservice小坑
  12. 中国水性胶粘剂行业市场供需与战略研究报告
  13. linux curl 命令(转)
  14. matplotlib中ion()和ioff()的使用
  15. jQuery的几个例子流程讲解
  16. 和秋叶一起学PPT:又快又好打造说服力幻灯片
  17. Xcode打包ipa
  18. WinRar DOS命令大全带详细参数rar/zip/7z压缩文件解密
  19. MOOC《基础和声》笔记
  20. 不会侧方停车?看看这6张图简单学会!

热门文章

  1. csv文件用excel打开乱码问题
  2. Java,第一次作业——六边形面积
  3. 程序猿怎么利用技术挣钱?——python量化实践
  4. 超文本标记语言--Html
  5. 直播APP制作时即时聊天功能实现
  6. vulnhub刷题记录(The Planets: Earth)
  7. WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信...
  8. 如何用深度学习进行语音识别
  9. 数据库实体联系模型与关系模型
  10. 【Demo】idea搭建SpringBoot和AJAX前后端数据交互