一、安装cephfs

方法一:

直接进入deploy目录,执行:

  1. ceph-deploy --overwrite-conf mds create ceph01:mds-daemon-

上面的ceph01是机器的hostname

方法二:

1、在需要安装的目标机器上创建mds目录

  1. mkdir -p /var/lib/ceph/mds/ceph-0

2、生成mds的keyring,并将其写入/var/lib/ceph/mds/ceph-0/keyring文件中

  1. ceph auth get-or-create mds.0 mon 'allow rwx' osd 'allow *' mds 'allow' -o /var/lib/ceph/mds/ceph-0/keyring

上面红色部分不能写成allow *,要不然会报错。

3、

  1. apt-get install ceph-mds
    ceph-mds --cluster ceph -i 0 -m 10.111.131.125:6789

二,创建cephfs文件系统

  1. ceph osd pool create cephfs_data 512
    ceph osd pool create cephfs_metadata 512
    ceph fs new cephfs cephfs_metadata cephfs_data

三,创建cephfs子目录(不是必选的)

为了别的地方能挂载cephfs,先创建一个secretfile

  1. cat /etc/ceph/ceph.client.admin.keyring |grep key|awk -F" " '{print $3}' > /etc/ceph/admin.secret

挂载cephfs的根目录到集群的mon节点下的一个目录,比如mir2_data,因为挂载后,我们就可以直接在mir2_data下面用Linux命令创建子目录了。

(注意:要挂载的机器上要安装ceph客户端:ubuntu上:apt-get install ceph-fs-common或ceph-fuse(apt-get install ceph-fuse))

  1. mkdir mir2_data
  2. mount -t ceph 10.111.131.125::/ /root/mir2_data -o name=admin,secretfile=/etc/ceph/admin.secret

如果要挂载的目录在ceph的mon节点下,直接:

  1. mkdir mir2_data
  2. mount -t ceph 10.111.131.125::/ /root/mir2_data

ceph-fuse挂载方法如下:

通过ceph-fuse挂载,还可以限制对挂载路径的访问权限,我们来创建用户cfuse,让其仅仅拥有对/hzb路径具有只读访问权限:

  1. ceph auth get-or-create client.cfuse mon 'allow *' mds 'allow r path=/cfuse' osd 'allow *'

然后客户端挂载:

  1. ceph-fuse -n client.cfuse -m 10.111.131.125: /mnt -r /cfuse

方法一:直接用Linux命令创建

  1. cd /root/mir2_data
  2. mkdir mongoDB
    chmod 0777 mongoDB

以上相当于在cephfs的根目录里面创建了一个子目录mongoDB,k8s以后就可以挂载这个目录,后续会介绍。

方法二:用java程序去创建子目录

1)必须在java程序所在客户端安装libcephfs

ubuntu下用:

  1. apt-get install libcephfs1

安装完后,可以在/usr/lib/jni里面看到libcephfs_jni.so,libcephfs_jni.so.1两个文件,但是这样java程序还是可能找不到这两个库(我实测过程中找不到),所以,我要把这2个库建立软链接到/usr/lib里面,这样java程序就可以找到了。

  1. ln -s /usr/lib/jni/libcephfs_jni.so /usr/lib/libcephfs_jni.so
  2. ln -s /usr/lib/jni/libcephfs_jni.so. /usr/lib/libcephfs_jni.so.

centos7 64位下面:

  1. wget http://mirrors.sohu.com/centos/7/storage/x86_64/ceph-hammer/libcephfs1-0.94.9-0.el7.x86_64.rpm
  2. wget http://mirrors.sohu.com/centos/7/storage/x86_64/ceph-hammer/libcephfs_jni1-0.94.9-0.el7.x86_64.rpm &&\
  3. yum install -y libcephfs1-0.94.-.el7.x86_64.rpm libcephfs_jni1-0.94.-.el7.x86_64.rpm
  1. ln -s /usr/lib64/libcephfs_jni.so.1.0. /usr/lib/libcephfs_jni.so.
  2.  
  3. ln -s /usr/lib64/libcephfs_jni.so.1.0. /usr/lib/libcephfs_jni.so

2)新建maven工程,然后在pom.xml里面加入如下依赖,目录只找到以下版本

  1. <dependency>
  2. <groupId>com.ceph</groupId>
  3. <artifactId>libcephfs</artifactId>
  4. <version>0.80.</version>
  5. </dependency>

3)编写程序

  1. package cn.com.chinacloud.paas.mir2.storage.service.impl;
  2.  
  3. import com.ceph.fs.CephMount;
  4.  
  5. import java.io.FileNotFoundException;
  6.  
  7. import static com.ceph.fs.CephMount.O_RDWR;
  8.  
  9. /**
  10. * Created by root on 17-7-17.
  11. */
  12. public class TestCephFs {
  13. public static void main(String[] args){
  14. testCreateMount();
  15. }
  16.  
  17. public static void testCreateMount(){
  18. //admin是ceph的admin用户 
  19. CephMount mount = new CephMount("admin");
  20. //10.111.131.125是ceph集群的mon节点,有多少个写多少个
  21. mount.conf_set("mon_host", "10.111.131.125");
  22. //以下的key来自于ceph环境的/etc/ceph/ceph.client.admin.keyring里面的key
  23. mount.conf_set("key","AQBngfhYpHvLKhAAtmVZTyR3NJxx1WOVeLo5pQ==");
  24. //在创建目录之前必须先mount到根目录
  25. mount.mount("/");
  26. //在根目录下面创建子目录 mysqlDB,0777是对目录的权限控制,这个可以改成别的,不过最好要让目录具有读写权限
  27. mount.mkdir("/mongoDB",0777);
  28. //创建完后断掉mount
  29. mount.unmount();
  30. }
  31. }

四,用k8s的pod挂载cephfs

1)创建k8s连接ceph使用的secret

将/etc/ceph/ceph.client.admin.keyring里面的key的值转换为base64,实测,不转的话,pod启动的时候看到secret会是乱码

  1. root@ceph01:~/mir2_data/mysqlDB# echo "AQBngfhYpHvLKhAAtmVZTyR3NJxx1WOVeLo5pQ=="|base64
  2. QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=

创建ceph-secret.yaml

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: ceph-secret
  5. data:
  6. key: QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=

在k8s执行:kubectl create -f ceph-secret.yaml。

2)创建twotest-pv.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: twotest-pv
  5. spec:
  6. capacity:
  7. storage: 1Gi
  8. accessModes:
  9. - ReadWriteMany
  10. cephfs:
  11. monitors:
  12. - 10.111.131.125:
  13. path: /mongoDB
  14. user: admin
  15. readOnly: false
  16. secretRef:
  17. name: ceph-secret
  18. persistentVolumeReclaimPolicy: Recycle

在k8s执行:kubectl create -f twotest-pv.yaml。然后用kubectl get pv如看到status为Available则pv创建成功,可以继续下一步。

3)创建twotest-pvc.yaml

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: twotest-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. volumeName: twotest-pv
  9. resources:
  10. requests:
  11. storage: 1Gi

在k8s执行:kubectl create -f twotest-pvc.yaml。然后用kubectl get pvc如看到status由Pending转到Bound的时候则pvc创建成功

4)创建第一个pod,hzb-mongo1-ceph.yaml

将该pod的/data/configdb目录挂载到cephfs的/mongoDB

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hzb-mongo1-ceph
  5. spec:
  6. containers:
  7. - name: hzb-mongo1-c
  8. image: 172.16.71.199/common/mongo:3.0.
  9. imagePullPolicy: IfNotPresent
  10. env:
  11. - name: PATH
  12. value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  13. - name: GOSU_VERSION
  14. value: "1.7"
  15. - name: MONGO_MAJOR
  16. value: "3.0"
  17. - name: MONGO_VERSION
  18. value: 3.0.
  19. volumeMounts:
  20. - name: twotest-vl
  21. mountPath: /data/configdb
  22. readOnly: false
  23. volumes:
  24. - name: twotest-vl
  25. persistentVolumeClaim:
  26. claimName: twotest-pvc

在k8s执行:kubectl create -f hzb-mongo1-ceph.yaml

5)创建第二个pod,hzb-mongo2-ceph.yaml

将该pod的/data/db目录挂载到cephfs的/mongoDB

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hzb-mongo2-ceph
  5. spec:
  6. containers:
  7. - name: hzb-mongo2-c
  8. image: 172.16.71.199/common/mongo:3.0.
  9. imagePullPolicy: IfNotPresent
  10. env:
  11. - name: PATH
  12. value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  13. - name: GOSU_VERSION
  14. value: "1.7"
  15. - name: MONGO_MAJOR
  16. value: "3.0"
  17. - name: MONGO_VERSION
  18. value: 3.0.
  19. volumeMounts:
  20. - name: twotest-vl2
  21. mountPath: /data/db
  22. readOnly: false
  23. volumes:
  24. - name: twotest-vl2
  25. persistentVolumeClaim:
  26. claimName: twotest-pvc

在k8s执行:kubectl create -f hzb-mongo2-ceph.yaml

6)验证是否挂载成功

执行kubectl get pod

  1. [root@dev-master hzb]# kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. hzb-mongo1-ceph / Running 1m
  4. hzb-mongo2-ceph / Running 1m

发现两个都起来了

执行 kubectl exec -it hzb-mongo1-ceph bash,进入容器内部

  1. cd /data/configdb/
  2. touch .txt

执行 kubectl exec -it hzb-mongo2-ceph bash,进入容器内部

  1. cd /data/db/
  2. touch 002.txt

然后我们到cephfs里面去看

  1. root@ceph01:~# cd /root/mir2_data/mongonDB/
  2. root@ceph01:~/mir2_data/mongonDB# ll
  3. 总用量
  4. drwxr-xr-x root 7 : ./
  5. drwxr-xr-x 7 : ../
  6. -rw-r--r-- 1 root root 0 7 20 17:32 001.txt
  7. -rw-r--r-- 1 root root 0 7 20 17:32 002.txt
  8. drwxr-xr-x 7 : journal/
  9. -rw------- 7 : local.
  10. -rw------- 7 : local.ns
  11. -rw-r--r-- 7 : mongod.lock
  12. -rw-r--r-- 7 : storage.bson
  13. drwxr-xr-x 7 : _tmp/
  14. root@ceph01:~/mir2_data/mongonDB#

发现数据已经挂载到mongoDB这个目录里面了。

注意:pv和pvc设置的容量大小并不能限制cephfs某一个目录的大小,也就是说容器可以向cephfs目录写入超出1G的文件。

除了用pv和pvc挂载,pod也可以直接挂载cephfs,例如:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: cephfs2
  5. spec:
  6. containers:
  7. - name: cephfs-rw
  8. image: 172.16.71.199/common/mongo:3.0.
  9. volumeMounts:
  10. - mountPath: "/data/configdb"
  11. name: cephfs
  12. volumes:
  13. - name: cephfs
  14. cephfs:
  15. monitors:
  16. - 10.16.154.78:
  17. - 10.16.154.82:
  18. - 10.16.154.83:
  19. user: admin
  20. secretRef:
  21. name: ceph-secret
  22. readOnly: true

kubernetes多节点的pod挂载同一个cephfs目录的更多相关文章

  1. Kubernetes使用节点亲缘性将POD调度到特定节点上

    节点污点可以用来让pod远离特定的节点,尽量在不修改已有pod信息的前提,通过在节点添加污点信息,来拒绝pod在某些节点上的部署. 而现在介绍一种叫做节点亲缘性,通过明确的在pod中添加的信息,来决定 ...

  2. Kubernetes使用节点污点和pod容忍度阻止节点调度到特定节点

    Kubernetes允许你去影响pod被调度到哪个节点.起初,只能通过在pod规范里指定节点选择器来实现,后面其他的机制逐渐加入来扩容这项功能,本章将包括这些内容. 现在要介绍的高级调度的两个特性是节 ...

  3. 六、Kubernetes节点与 Pod 亲和性

    Kubernetes节点与 Pod 亲和性 一.节点亲和性策略介绍 ​pod.spec.nodeAffinity preferredDuringSchedulingIgnoredDuringExecu ...

  4. 三、Kubernetes之深入了解Pod

      1.yaml格式的Pod配置文件内容及注解 深入Pod之前,首先我们来了解下Pod的yaml整体文件内容及功能注解. 如下: # yaml格式的pod定义文件完整内容: apiVersion: v ...

  5. Kubernetes — 为什么我们需要Pod?

    不过,我相信你在学习和使用 Kubernetes 项目的过程中,已经不止一次地想要问这样一个问题:为什么我们会需要 Pod? 是啊,我们在前面已经花了很多精力去解读 Linux 容器的原理.分析了 D ...

  6. kubernetes之多容器pod以及通信

    系列目录 容器经常是为了解决单一的,窄范围的问题,比如说微服务.然而现实中,一些复杂问题的完成往往需要多个容器.这里我们讨论一下如何把多个容器放在同一个pod里以及容器间的通信 什么是pod pod是 ...

  7. kubernetes进阶之三:Pod

    一:Pod 是什么 Pod是Kubernetes的最重要最基本的概念.它是能够被创建,调度和管理的最小部署单元.一个Pod代表集群中一个运行的进程. 二:Pod的组成 一个Pod由一个特殊的根容器Pa ...

  8. kubernetes和docker----2.学习Pod资源

    Pod--k8s最基础的资源 我们想要的是单个容器只运行一个进程 然而有时我们需要多个进程协同工作,所以我们需要另外一种更加高级的结构将容器组合在一起---pod Pod 我们来看一个最基本的pod ...

  9. 三、安装并配置Kubernetes Node节点

    1. 安装并配置Kubernetes Node节点 1.1 安装Kubernetes Node节点所需服务 yum -y install kubernetes   通过yum安装kubernetes服 ...

随机推荐

  1. eclipse adt logcat过滤用法

    点击Save Filters的加号,by Log Tag如下就可以只看2dx程序出来的debug信息了

  2. bzoj 3059: 归途与征程

    Description 给出一个长度为N的由小写字母’a’~’z’和’*’组成的字符串A,一个长度为M的仅由小写字母’a’~’z’组成的字符串B.一个’*’可以匹配任意多个字符(包括0个).求在B的所 ...

  3. UI“三重天”之appium(一)

    官方介绍: Appium is an open-source tool for automating native, mobile web, and hybrid applications on iO ...

  4. 实时计算CEP

    实时计算怎么实现: 流计算.....

  5. solr学习之六--------Analyzer(分析器)、Tokenizer(分词器)

    首先,不知道大家在前面的例子中没有试着搜索文本串,就是在第二节,我们添加了很多文档.如果字段值是一个文本.你如果只搜索这个字段的某个单词,是不是发现搜不到? 这就是因为我们没有配置Analyzer,因 ...

  6. 并发包学习(一)-Atomic包小记

    此篇是J.U.C学习的第一篇Atomic包相关的内容,希望此篇总结能对自己的基础有所提升.本文总结来源自<Java并发编程的艺术>第七章并配以自己的实践理解.如有错误还请指正. 一.案例分 ...

  7. canvas高级动画示例

    canvas高级动画示例 演示地址 https://qzruncode.github.io/example/index.html <!DOCTYPE html> <html lang ...

  8. 一线工程师带你深入学习和使用Kubernetes

    http://page.factj.com/tor/xoxaHR0cDovL2RvY2tvbmUuaW8vYXJ0aWNsZS8yMzM0 Kubernetes是Google开源的容器集群管理系统,它 ...

  9. 在ubuntu14.04上搭建OpenVPN服务

    简介 在连接了不可信的网络环境后,让手机或者计算机安全的访问互联网,使用虚拟专用网络(Virtual Private Network,VPN)是一个解决办法.OpenVPN是一个SSL VPN完整解决 ...

  10. jQuery load() 判断 iframe 是否加载完毕

    判断 iframe 是否加载完毕  方法.jQuery load() var frm = document.getElementById('myiframe'); $(frm).load(functi ...