2020.1.5更新

建议使用cephfs storageClass,而非本文中手动指定pv/pvc的方式,否则容易引发cephfs性能问题,详情参考:
kubernetes挂载cephfs带来的mds卡顿问题及引入cephfs storageClass

本文仅作对pv/pvc的了解学习。


前言

在前篇部署测试完cephfs的基础上:
Ceph集群生产环境安装部署
cephfs调优 & 性能测试 & 常用命令
本篇介绍k8s使用 pv/pvc的方式使用cephfs分布式文件系统

使用

首先解释一下pv/pvc的相关概念:
PV:
PersistentVolumes,是k8s抽象化的存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息.PV是k8s实际对接存储后端的真正入口
[Access Mode] (接入模式):
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
ReadWriteMany(RWX):读写权限,可以被多个节点挂载

[persistentVolumeReclaimPolicy](回收策略:
Retain(保留)- 保留数据,不会再分配给pvc,需要管理员手工清理数据
Recycle(回收)- 清除 PV 中的数据,保留pv资源,可以留供其他pvc使用
Delete(删除)- 删除整个pv资源及内部的数据。

PVC:
PersistentVolumeClaims,是对PV资源的一种声明,pvc绑定实体资源pv后,pod通过绑定pvc来使用pv资源.PVC是k8s的一种抽象化的声明式绑定存储资源的管理模式的中间层,pod无法直接通过pv使用存储资源,必须经过pvc,而pvc必须要绑定pv实体后,才可被pod使用.

依赖安装:
每个node需要安装ceph-common包,才能正常使用cephfs:

yum -y install ceph-common

创建secret:
在创建pv前,由于ceph是开启了cephx认证的,于是首先需要创建secret资源,k8s的secret资源采用的是base64加密
在ceph monitor上提取key:

# ceph auth get-key client.admin |base64
QVFCL3E1ZGIvWFdxS1JBQTUyV0ZCUkxldnRjQzNidTFHZXlVYnc9PQ==# cat ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: ceph-secret
data:key: QVFCL3E1ZGIvWFdxS1JBQTUyV0ZCUkxldnRjQzNidTFHZXlVYnc9PQ==~/ceph# kubectl apply -f ceph-secret.yaml 

创建测试pv:

# cat cephfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: cephfs-pvlabels:pv: cephfs-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteManycephfs:monitors:- 192.168.20.112:6789- 192.168.20.113:6789- 192.168.20.114:6789user: adminsecretRef:name: ceph-secretreadOnly: falsepersistentVolumeReclaimPolicy: Delete

查看:

# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
cephfs-pv   1Gi        RWX            Delete           Available                                      6s

现在pvc是空闲Available状态

创建测试pvc:

# cat cephfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: cephfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Giselector:matchLabels:pv: cephfs-pv

查看:

# kubectl get pvc
NAME         STATUS    VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc   Bound     cephfs-pv   1Gi        RWX                           24s# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                STORAGECLASS   REASON    AGE
cephfs-pv   1Gi        RWX            Delete           Bound     default/cephfs-pvc                            8m

可以看到pv和pvc都已经自动变为Bound状态,但是我们这里没有使用任何关联标签,使它们两者进行关联,pvc是怎么自动绑定到pv的呢?其实pvc在创建伊始就会主动去寻找符合requets条件的pv资源,如果寻找到了,便会自动进行绑定,无需做标签匹配.

小Tips:
1.当pv的容量大于pvc的需求时,pvc可以成功自动绑定pv;
2.当pv的容量小于pvc的需求时,pvc无法绑定该pv;
3.pv和pvc的绑定关系是一一对应的.
4.pv/pvc的创建顺序是:pv -> pvc -> pod
5.pv/pvc的销毁顺序是:pod -> pvc -> pv,顺序一定不要错
例如:
2G的pv可以被1G的pvc绑定,并且绑定成功后,pvc的实际空间也是2G而不是1G;
1G的pv无法被2G的pvc绑定

创建pod实例
将pod调度到某一个node上,挂载pvc

root@h009027:~/ceph# cat testpod1-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:labels:app: testpod1name: testpod1namespace: default
spec:replicas: 1selector:matchLabels:app: testpod1template:metadata:labels:app: testpod1spec:containers:- args:- /bin/bash- -c- /run.shimage: nginximagePullPolicy: Alwaysname: testpod1ports:- containerPort: 80protocol: TCPterminationMessagePath: /dev/termination-logvolumeMounts:- mountPath: /var/wwwname: cephfs-testpod1dnsPolicy: ClusterFirstnodeSelector:DEVNODE: ""restartPolicy: AlwayssecurityContext: {}terminationGracePeriodSeconds: 30volumes:- name: cephfs-testpod1persistentVolumeClaim:claimName: cephfs-pvc

查看pod:

~# kubectl get pods  | grep testpod1
testpod1-7847858587-2rbsq                         1/1       Running            0          10s

进入pod并给nginx添加一个主页index.html:

~# kubectl exec -it testpod1-7847858587-2rbsq bash
~# echo "Just for pv/pvc test"  > /var/www/index.html

获取pod ip打开浏览器测试:
(本篇测试场景外部与集群内部网段路由都已互通,如果pod内部路由未通,需要使用svc的方式暴露服务,可查看此前文章,这里不再赘述):

到这里,文件系统挂载已经测试完毕,但选用cephfs作k8s分布式文件系统的最大优势是因为其支持ReadWriteMany多节点挂载的灵活性,非常符合k8s像管理牲口一样管理你的容器的理念,下面开始跨节点测试

跨节点测试

再创建一个部署文件,让其在另外的node上运行,与上方pod共用一个pvc:

~/ceph# cat testpod2-deploy.yaml apiVersion: extensions/v1beta1
kind: Deployment
metadata:labels:app: testpod2name: testpod2namespace: default
spec:replicas: 1selector:matchLabels:app: testpod2template:metadata:labels:app: testpod2spec:containers:- args:- /bin/bash- -c- /run.shimage: registry.youkeshu.com:5000/nginx:php7.1v1imagePullPolicy: Alwaysname: testpod2ports:- containerPort: 80protocol: TCPterminationMessagePath: /dev/termination-logvolumeMounts:- mountPath: /var/wwwname: cephfs-testpod2dnsPolicy: ClusterFirstnodeSelector:PRODNODE: ""restartPolicy: AlwayssecurityContext: {}terminationGracePeriodSeconds: 30volumes:- name: cephfs-testpod2persistentVolumeClaim:claimName: cephfs-pvc

查看pod:

~/ceph# kubectl get pods -o wide | grep testpod
testpod1-7847858587-2rbsq                         1/1       Running            0          17m       172.26.2.172   h009029
testpod2-6d4b8d5db9-wkpx6                         1/1       Running            0          9s        172.26.0.52    h009028

浏览器打开testpod2主页:

结论:
cephfs可以很好的实现k8s多节点调度容器时对持久化文件的挂载支持

注意

以上方式使用时,会将容器内的指定路径直接挂载到cephfs的根目录下,前往上篇文章中挂载mount cephfs的节点挂载目录就可以发现此问题:

[root@h020112 cephfs]# ls
index.html  testfile
[root@h020112 cephfs]# cat index.html
Just for pv/pvc test

如果所有的文件都这样直接放在整个cephfs文件系统的根目录里,无疑是极不好管理的,这个时候我们可以在 Pod 中使用一个新的属性: subPath,该属性可以来解决这个问题,我们只需要更改上面的 Pod 的 YAML 文件即可

修改后的yaml文件:

root@h009027:~/ceph# cat testpod1-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:labels:app: testpod1name: testpod1namespace: defaultselfLink: /apis/extensions/v1beta1/namespaces/default/deployments/amazondev
spec:replicas: 1selector:matchLabels:app: testpod1template:metadata:labels:app: testpod1spec:containers:- args:- /bin/bash- -c- /run.shimage: registry.youkeshu.com:5000/nginx:php7.1v1imagePullPolicy: Alwaysname: testpod1ports:- containerPort: 80protocol: TCPterminationMessagePath: /dev/termination-logvolumeMounts:- mountPath: /var/wwwname: cephfs-testpod1# 仅添加这一行即可subPath: testpod1dnsPolicy: ClusterFirstnodeSelector:DEVNODE: ""restartPolicy: AlwayssecurityContext: {}terminationGracePeriodSeconds: 30volumes:- name: cephfs-testpod1persistentVolumeClaim:claimName: cephfs-pvc

重新部署后,再回到挂载点查看:

[root@h020112 cephfs]# ls
index.html  testfile  testpod1
[root@h020112 cephfs]# ls testpod1/
[root@h020112 cephfs]#
[root@h020112 cephfs]# ll testpod1/
total 0

可以看到,这里创建了一个subPath名的目录,但是目录里面是空的,也即是说,通过k8s的抽象层pvc,容器对cephfs的根目录拥有了指定容量的使用权限,subPath仅仅是在cephfs根目录下创建了一个子目录,无论是否创建子目录,容器对cephfs的根目录都拥有使用权限,因此,为了避免多个容器同名文件冲突,便于管理维护,请在实际使用中一定不要忘记在部署文件中添加subPath项

k8s(十一)、分布式存储Cephfs使用相关推荐

  1. k8s(十二)、分布式存储Ceph RBD使用

    前言 上篇文章介绍了k8s使用pv/pvc 的方式使用cephfs, k8s(十一).分布式存储Cephfs使用 Ceph存储有三种存储接口,分别是: 对象存储 Ceph Object Gateway ...

  2. k8s和harbor的集成_在Kubernetes集群上部署高可用Harbor镜像仓库

    在Kubernetes集群上部署高可用Harbor镜像仓库 一.Kubernetes上的高可用Harbor方案 首先,我可以肯定给出一个回答:Harbor支持在Kubernetes部署.只不过Harb ...

  3. K8s上使用rook搭建Ceph集群

    目录 准备工作 一.安装kubectl 二:win10 安装Docker Desktop for Windows(非必须) 三.Harbor 知识补充: 1.Ceph mgr和mon 2:Ceph 中 ...

  4. Ceph存储搭建及在k8s中的使用

    一.基础环境准备 主机IP 主机名 部署服务 备注 192.168.0.91 admin-node ceph.ceph-deploy.mon mon节点又称为master节点 192.168.0.92 ...

  5. linux启动程序镜像构建_启动人员分析功能3个构建块

    linux启动程序镜像构建 A solid foundation to building a scalable People Analytics function. You've got to sta ...

  6. 在Kubernetes集群上部署高可用Harbor镜像仓库

    这里主要介绍使用kubectl部署Harbor镜像仓库到Kubernetes集群中. 使用Helm部署,参考: https://my.oschina.net/u/2306127/blog/181969 ...

  7. kubernetes一次生产故障日记

    test## 1. 一次K8S测试环境故障处理过程: ## 1. 故障描述:    51放假期间公司停电,关掉所有k8s测试机器,包括3台k8s master,5台k8s node,3台ceph机器. ...

  8. 行业elasticsearch容器化存储分离调研报告

    一.行业es容器化&存储分离架构行业调研 1.1 行业es容器化调研概述 目前通过联系各个公司的同学&前同事.结合网上公开资料&官方云服务使用文档,共统计10家公司,基本覆盖头 ...

  9. 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践

    优化一个分布式系统的吞吐能力,除了应用本身代码外,很大程度上是在优化它所依赖的中间件集群处理能力.如:kafka/redis/rabbitmq/postgresql/分布式存储(CephFS,Juic ...

最新文章

  1. 30个Python常用极简代码,拿走就用
  2. python教程笔记(详细)
  3. javaScript原生定义的函数
  4. iic裸机与linux通信,基于IIC协议的Linux操作系统与裸机通信的方法
  5. HDU4809 Wow! Such City! Dijkstra算法
  6. 五个 .NET 性能小贴士
  7. 20151208_使用windows2012配置weblogic节点管理器
  8. 学生时代的神操作,你了解吗?
  9. Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002
  10. [转]企业网站首页设计常见的6种布局方式
  11. Seoer,牵起用户与搜索引擎双手的魔术师
  12. 传说中人生必去的50个地方
  13. Delphi视频教程
  14. 51单片机连接ESP8266串口WiFi模块
  15. 计算机电路基础答案刘怀望,计算机电路基础
  16. 如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列
  17. linux释放cpu命令,linux内存清理和释放命令
  18. python缺失值处理 fillna_python 处理缺失值
  19. windows源码编译PHP7.1
  20. TempDB 收缩方法

热门文章

  1. .NET Core 用 Blazor 做 jmeter 系列视频
  2. ES6中的字符串API.md
  3. 1631 小鲨鱼在51nod小学(线段树区间修改+单点查询:不用下传lazy的区间修改)
  4. 经济基础知识(初级)【15】
  5. 【Pytorch with fastai】第 14 章 :ResNet
  6. 《三体》-- 刘慈欣
  7. C++ 身份证设定(复合类+拷贝构造)
  8. OC-oc语言简介,类和对象
  9. 【DS with Python】 re模块与正则表达式
  10. 当当吃海货,不算不会过