Kubernetes持久化存储Cephfs
女主宣言
上一篇 kubernetes持久化存储Ceph RBD 介绍了Ceph RBD在kubernetes中的使用,本篇将会介绍Cephfs在kubernetes中的使用。本文最先发布于 opsdev,转载已获取作者授权。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
Kubernetes volume
熟悉kubernetes volume的同学应该了解,kubernetes 对volume的提供支持“静态PV”和“动态PV”两种方式。
静态PV
集群管理员创建一些PV,之后便可用于PVC消费。
动态PV
相比静态PV而言,动态PV无需管理员手动创建PV,PV的操作是由一个叫StorageClass的控制器创建。对于Cephfs volume来说,截止到kubernetes 1.10版本并没有直接提供Cephfs的StorageClass。
虽然官方并没有直接提供对Cephfs StorageClass的支持,但是社区给出了类似的解决方案 external-storage/ cephfs,后面我们会使用到。
1
静态PV
Ceph RBD 和 secret 的创建详见此链接:
https://www.opsdev.cn/post/Ceph-RBD.html
编辑 Cephfs PV 对象文件 cephfs-pv.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 192.168.0.3:6789
user: kube
secretRef:
name: secret-for-cephfs
readOnly: false
persistentVolumeReclaimPolicy: Recycle
创建 PV:
$ kubectl create -f cephfs-pv.yaml -n cephfs
persistentvolume "cephfs-pv" created
$ kubectl get pv -n cephfs
创建PVC
$ vim cephfs-pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-pv-claim
namespace: cephfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
在 deployment 中使用 PV:
metadata:
name: cephfs-pvc
namespace: cephfs
spec:
replicas: 2
template:
metadata:
labels:
app: cephfs-pvc
spec:
containers:
- name: nginx
image: busybox:latest
volumeMounts:
- name: cephfs-pv
mountPath: /data/cephfs
readOnly: false
volumes:
- name: cephfs
persistentVolumeClaim:
claimName: cephfs-pv-claim
这样,在同一个deployment中的2个pod容器内都可以读写同一个cephfs volume了。
2
动态PV
对于规模不大的容器平台而言,静态PV方式就可以满足需求;但是当容器规模很大时,你不知道用户什么时候创建PV,因此动态PV方式就非常有用了。下面我们看下如何基于 external-storage/cephfs 来实现动态PV。
部署 cephfs-provisioner
cephfs-provisioner 是 kubernetes 官方社区提供的Cephfs的StorageClass支持。用于动态的调用后端存储Cephfs创建PV。
cephfs-provisoner 的实现机制如图所示:
它主要是包含两部分:
cephfs-provisoner.go
是cephfs-provisoner(cephfs的StorageClass)的核心,主要是 watch kubernetes中 PVC 资源的CURD事件,然后以命令行方式调用 cephfs_provisor.py脚本创建PV。
cephfs_provisoner.py
python 脚本实现的与cephfs交互的命令行工具。cephfs-provisoner 对cephfs端volume的创建都是通过该脚本实现。里面封装了volume的增删改查等功能。
创建 StorageClass
#kubectl create -f class.yaml
# kubectl get sc -n cephfsNAME PROVISIONER AGEcephfs ceph.com/cephfs 33d
基于RBAC授权方式启动cephfs-provisioner
# kubectl create -f *
# kubectl get deploy -n cephfs
这样动态创建PV的环境就准备好了。
动态PV方式,无需再手动创建PV,只需创建PVC,cephfs-provisoner会自动的为该PVC在后端cephfs存储上创建对应的PV。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-1
annotations:
volume.beta.kubernetes.io/storage-class: "cephfs"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
此时,我们创建PVC后,会看到同时会自动创建并绑定上一个PV。
至此,基于 cephfs 的动态PV方式就介绍完了。
cephfs-provisoner的坑
在使用 cephfs-provisoner 与公司 cephfs 对接的时候遇到了一些坑,在这里一并说一下。
路径问题
在 cephfs_provisioner/ cephfs_provisioner.py 的实现中,默认在cephfs中创建的根目录名是”kubernetes“,所有后续创建的卷都在cephfs端的 /kubernetes/ 一级目录下 ,代码实现中以VOlUME_GROUP="kubernetes"定义。 因此,如果你不想在 cephfs 中以该名字命名,需要修改VOLUME_GROUP值。
另外,它的二级目录也是固定的为/kubernetes/volumes,二级目录是python-cephfs模块中由DEFAULT_VOL_PREFIX变量定义:
POOL_PREFIX = "fsvolume_"
DEFAULT_VOL_PREFIX = "/volumes"
DEFAULT_NS_PREFIX = "fsvolumens_"
因此,要定制化在cephfs端的一级和二级目录,需要修改这两个地方。
权限问题
这里遇到两个权限问题:
挂载权限问题
默认python-cephfs模块在连接cephfs挂载时是mount的根目录”/“。
而根目录只有admin用户才有权限进行挂载,所以这个地方除了admin用户外,没办法使用其它用户。但是,我们在使用cephfs时,为了安全,管理员是不会给我们admin用户使用的,所以这个地方肯定是接受不了的。为此,我们定制修改了libcephfs2和python-cephfs的源码,增加了connect_with_path方法,允许指定挂载的目录,这样我们只要在挂载时不使用根目录即可。
2. 读写权限问题
在 cephfs_provisoner.py 的实现中,默认添加了对 cephfs namespace的支持,因此在对volume授权时会添加对namespace 相关的权限设置。因为,我们使用的ceph版本luminous没有对namespace进行支持,所以,在使用时产生了创建的volume挂载到pod内后没有读写权限"input/output error"的问题。 此时,你在cephfs端查看卷的读写权限时,你可以看到目录读写权限都是问号。于是我们修改了这部分逻辑,去掉了 namespace 相关的部分。
相关代码请点击文末原文链接查看。
HULK一线技术杂谈
由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
Kubernetes持久化存储Cephfs相关推荐
- Kubernetes 持久化存储 Cephfs
熟悉kubernetes volume的同学应该了解,kubernetes 对volume的提供支持"静态PV"和"动态PV"两种方式. 静态PV:集群管理员创 ...
- 干货 | 如何评估Kubernetes持久化存储方案
在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...
- 如何评估Kubernetes持久化存储方案
在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...
- 14、Kubernetes持久化存储
文章目录 前言 步骤 持久化服务器上操作 设置挂载路径 Node节点上操作 PV和PVC 实现流程 举例 前言 之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对 ...
- Kubernetes持久化存储PV、PVC和StorageClass介绍
PV和PVC Kubernetes Volume提供了非常好的数据持久化方案,不过对于大型Kubernetes集群来说管理上还有不方便之处.Volume方案需要创建Pod或者Deployment的管理 ...
- K8s 或 K3s 集群中持久化存储方案选型
存储架构 1 三个概念: pv , pvc ,storageclass pv - 持久化卷, 支持本地存储和网络存储, 例如hostpath,ceph rbd, nfs等,只支持两个属性, capac ...
- 四大开源分布式存储_Kubernetes持久化存储方案测试
在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...
- Kubernetes之持久化存储
转载自 https://blog.csdn.net/dkfajsldfsdfsd/article/details/81319735 ConfigMap.Secret.emptyDir.hostPath ...
- 使用Ceph集群作为Kubernetes的动态分配持久化存储
2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...
最新文章
- 读书笔记——javascript闭包
- java 8位随机数_JAVA中生成指定位数随机数的方法总结
- 【快乐水题】520. 检测大写字母
- python学习之路(九)
- Mono生命周期小实验
- ubuntu 下源码安装wireshark
- 让ubuntu开机快一点:记开机出现Waiting for network configuration...
- oracle 体系结构及内存管理 15_存储结构
- 极客公园创新大会 IF 2018,用科技主义和独立思维击退喧嚣
- 徐小明:这次我支持房产新政
- 一键刷入twrp_努比亚Z17-Z17S-Z17mini 刷入MIUI10系统刷机教程
- 知识笔记 - sekiro RPC框架的安装与简单使用
- 微信公众号--设备功能---添加产品----微信硬件授权
- 【资源】这款工具让SpringBoot不再需要Controller、Service、DAO、Mapper!
- 51 地图 PK Google 地图
- 史玉柱亲笔写的脑白金策划方案
- Mac Big Sur提示xxx文件已损坏
- 【转】PC机安装MAC虚拟机
- 淘宝店铺装修代码大全,淘宝页面设计代码.
- 微信公众号基本功能搭建
热门文章
- SQL语句inner join,left join ,right join连接的不同之处
- SQL:select case when(转)
- 删除以x为根节点的子树并释放☆
- js 用submit()方法提交表单,页面闪退问题以及解决方法
- 集成 Tomcat、 Servlet 的生命周期
- PowerDesigner生成数据库刷库脚本
- Kafka生产者源码解析
- python判断某年是否为闰年的程序_Python 学习--从0到1(4. 题3)
- cdn厂商 同兴万点_CDN进入牌照时代 工信部规范和清理CDN市场
- Java中选择排序,冒泡排序,插入排序,快速排序