StorageClass & PV & PVC关系图

  • Volumes是最基础的存储抽象,其支持多种类型,包括本地存储、NFS、FC以及众多的云存储,我们也可以编写自己的存储插件来支持特定的存储系统。Volume可以被Pod直接使用,也可以被PV使用。普通的Volume和Pod之间是一种静态的绑定关系,在定义Pod的同时,通过volume属性来定义存储的类型,通过volumeMount来定义容器内的挂载点。

  • PersistentVolume。与普通的Volume不同,PV是Kubernetes中的一个资源对象,创建一个PV相当于创建了一个存储资源对象,这个资源的使用要通过PVC来请求。

  • PersistentVolumeClaim。PVC是用户对存储资源PV的请求,根据PVC中指定的条件Kubernetes动态的寻找系统中的PV资源并进行绑定。目前PVC与PV匹配可以通过StorageClassName、matchLabels或者matchExpressions三种方式。

  • StorageClass。存储类,目前kubernetes支持很多存储,例如ceph,nfs,glusterfs等等。。。

接下来,本文使用前文《手把手教你使用rpm部署ceph集群》创建好的ceph集群来为kubernetes提供存储。

创建存储类

1、获取admin key

  1. grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF }'|base64
  2. QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==

2、写入 ceph-secret-admin.yaml

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: ceph-secret-admin
  5. type: "kubernetes.io/rbd"
  6. data:
  7. key: QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==

3、创建secret

  1. kubectl apply -f ceph-secret-admin.yaml
  2. kubectl get secret
  3. NAME TYPE DATA AGE
  4. ceph-secret-admin kubernetes.io/rbd 1 6m

4、 修改 rbd-storage-class.yaml

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: rbd
  5. provisioner: kubernetes.io/rbd
  6. parameters:
  7. monitors: 192.168.100.100:6789,192.168.100.101:6789,192.168.100.102:6789
  8. adminId: admin
  9. adminSecretName: ceph-secret-admin
  10. adminSecretNamespace: default
  11. pool: k8s
  12. userId: admin
  13. userSecretName: ceph-secret-admin
  14. userSecretNamespace: default
  15. fsType: ext4
  16. imageFormat: "2"
  17. imageFeatures: "layering"

5、创建storage class

  1. kubectl apply -f rbd-storage-class.yaml
  2. [root@qd01-stop-cloud001 rbd]# kubectl get sc
  3. NAME PROVISIONER AGE
  4. rbd kubernetes.io/rbd 4m

创建PVC & PV

6、创建pvc.yaml

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: claim
  5. namespace: default
  6. spec:
  7. accessModes:
  8. - ReadWriteOnce
  9. storageClassName: rbd
  10. resources:
  11. requests:
  12. storage: 1Gi

7、查看pvc,显示状态为Bound表示成功

  1. kubectl apply -f pvc.yaml
  2. kubectl get pvc
  3. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  4. claim Bound pvc-130c2445-b4a5-11e8-9d27-782bcb3bb379 1Gi RWO slow 13m

测试验证

8、创建pod.yaml

  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: server
  5. spec:
  6. replicas: 1
  7. selector:
  8. role: server
  9. template:
  10. metadata:
  11. labels:
  12. role: server
  13. spec:
  14. containers:
  15. - name: server
  16. image: nginx
  17. volumeMounts:
  18. - mountPath: /var/lib/www/html
  19. name: mypvc
  20. volumes:
  21. - name: mypvc
  22. persistentVolumeClaim:
  23. claimName: claim

9、查看挂载存储

  1. /dev/rbd0 1G 9.1M 0.98G 1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/k8s-image-kubernetes-dynamic-pvc-198f56b3-b4a5-11e8-97eb-782bcb3bb379

错误处理

如果出错failed to create rbd image: executable file not found in $PATH

参考https://blog.csdn.net/aixiaoyang168/article/details/79120095

可以使用下面的项目来创建存储类

使用external-storage创建存储类

  1. $ git clone https://github.com/kubernetes-incubator/external-storage.git
  2. $ tree external-storage/ceph/rbd/deploy/
  3. ├── README.md
  4. ├── non-rbac
  5. └── deployment.yaml
  6. └── rbac
  7. ├── clusterrole.yaml
  8. ├── clusterrolebinding.yaml
  9. ├── deployment.yaml
  10. └── serviceaccount.yaml
  11. Install without RBAC roles:
  12. cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
  13. kubectl apply -f ./non-rbac
  14. Install with RBAC roles:
  15. cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
  16. NAMESPACE=default # change this if you want to deploy it in another namespace
  17. sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml
  18. kubectl -n $NAMESPACE apply -f ./rbac

如果secret和provisioner不在同一个namespace中的话,获取secret权限不够。

解决方法:

以下文件添加secrets的权限

external-storage/ceph/rbd/deploy/rbac/clusterrole.yaml

  1. - apiGroups: [""]
  2. resources: ["secrets"]
  3. verbs: ["get", "create", "delete"]

kubernetes存储类与PV与PVC关系及实践的更多相关文章

  1. kubernetes 存储volume,pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  2. K8s存储卷、pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  3. Kubernetes 存储卷管理 PV&PVC(十)

    目录 一.emptyDir 二.hostPath 三.PV & PVC 1.NFS PersistentVolume 2.创建 PVC 3.创建 Pod 进行挂载 为了持久化保存容器的数据,可 ...

  4. 09 . Kubernetes之pv、pvc及使用nfs网络存储应用

    PV,PVC概述 PV的全称是: PersistentVolume (持久化卷),是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如Ceph.G ...

  5. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  6. Kubernetes集群PV和PVC详解

    Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...

  7. Kubernetes 学习12 kubernetes 存储卷

    一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...

  8. PV、PVC和Storeclass等官方内容翻译

    k8s1.13版本 PV apiVersion: v1 kind: PersistentVolume metadata: name: filesystem-pvc spec: capacity: #未 ...

  9. 详解Kubernetes存储体系

    Volume.PV.PVC.StorageClass由来 先思考一个问题,为什么会引入Volume这样一个概念? " 答案很简单,为了实现数据持久化,数据的生命周期不随着容器的消亡而消亡. ...

随机推荐

  1. Jenkins+pytest+Allure搭建自动化测试

    持续集成(CONTINUOUS INTEGRATION) 在CI环境中,开发人员将会频繁地向主干提交代码.这些新提交的代码在最终合并到主干前,需要经过编译和自动化测试流进行验证. 持续交付(CONTI ...

  2. EfCore3的OwnedType会导致Sql效率问题

    最近主导了旗下某核心项目升级到EfCore3 由于之前Core2升级时候也踩过不少的坑很多东西都有规划和准备,整体上还是没出太大问题 但是最近突然发现efcore对于使用了ownedType的生成语句 ...

  3. beego log

    package main import ( "github.com/astaxie/beego/logs" _ "xcms/routers" _ "x ...

  4. 跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)

    前言 对于Redis而言,很多小伙伴只关注其关键的五大基础类型:string.hash.list.set.sorted set(有序集合),其实还有三种特殊类型在很多应用场景也比较适合使用,分别是:b ...

  5. Nacos注册中心使用

    创建两个工程,一个是nacos-provider, 另一个是naocos-consumer: 添加nacos-provider的依赖 <parent> <groupId>org ...

  6. 在Linux上成功启动Jenkins却无法访问的问题

    本鸟最近打算学习Jenkins,正准备在Linux上面鼓捣一番,,却没想被入门级别问题当头一棒 下载完jenkins.war,使用java -jar命令在8088端口开启服务:java -jar je ...

  7. 关于linux epoll的了解

    使用select/poll模型假设一台服务器需要支持100w的并发连接,在_FD_SETSIZE为1024时,则至少需要1k个进程 除了进程间的上下文切换的时间消耗外,从内核/用户空间,大量的无脑内存 ...

  8. Redis 五种数据结构详解(string,hash,list,set,zset)

    一.五种数据结构: 1. String--字符串 String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候e ...

  9. 一些免费API接口

    转载自:https://www.cnblogs.com/haimishasha/p/6351403.html 天气接口 聚合数据: http://op.juhe.cn/onebox/weather/q ...

  10. APP后台架构20191205

    1.架构,架构与业务紧密相关,是有业务驱动的. 2.APP后台演进原则. App后台的架构是由业务规模驱动而演进的,App后台是为业务服务的,App后台的价值在于能为业务提供其所需要的功能,不应过度设 ...