博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kubernetes多节点的pod挂载同一个cephfs目录
阅读量:5878 次
发布时间:2019-06-19

本文共 7445 字,大约阅读时间需要 24 分钟。

一、安装cephfs

方法一:

直接进入deploy目录,执行:

 

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

 

上面的ceph01是机器的hostname

方法二:

 

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

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

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

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

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

3、

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

二,创建cephfs文件系统

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

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))

mkdir mir2_datamount -t ceph 10.111.131.125:6789:/ /root/mir2_data -o name=admin,secretfile=/etc/ceph/admin.secret

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

mkdir mir2_datamount -t ceph 10.111.131.125:6789:/ /root/mir2_data

 

ceph-fuse挂载方法如下:

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

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

然后客户端挂载:

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

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

cd /root/mir2_datamkdir mongoDB chmod 0777 mongoDB

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

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

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

ubuntu下用:

apt-get install libcephfs1

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

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

centos7 64位下面:

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

 

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

com.ceph
libcephfs
0.80.5

3)编写程序

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

 

四,用k8s的pod挂载cephfs

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

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

root@ceph01:~/mir2_data/mysqlDB# echo "AQBngfhYpHvLKhAAtmVZTyR3NJxx1WOVeLo5pQ=="|base64QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=

创建ceph-secret.yaml

apiVersion: v1kind: Secretmetadata:  name: ceph-secretdata:  key: QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=

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

2)创建twotest-pv.yaml

apiVersion: v1kind: PersistentVolumemetadata:  name: twotest-pvspec:  capacity:    storage: 1Gi  accessModes:    - ReadWriteMany  cephfs:    monitors:      - 10.111.131.125:6789    path: /mongoDB    user: admin    readOnly: false    secretRef:        name: ceph-secret  persistentVolumeReclaimPolicy: Recycle

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

 

 3)创建twotest-pvc.yaml

kind: PersistentVolumeClaimapiVersion: v1metadata:  name: twotest-pvcspec:  accessModes:    - ReadWriteMany  volumeName: twotest-pv  resources:    requests:      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

apiVersion: v1kind: Podmetadata:  name: hzb-mongo1-cephspec:  containers:  - name: hzb-mongo1-c    image: 172.16.71.199/common/mongo:3.0.9    imagePullPolicy: IfNotPresent    env:    - name: PATH      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin    - name: GOSU_VERSION      value: "1.7"    - name: MONGO_MAJOR      value: "3.0"    - name: MONGO_VERSION      value: 3.0.9    volumeMounts:    - name: twotest-vl      mountPath: /data/configdb      readOnly: false  volumes:  - name: twotest-vl    persistentVolumeClaim:      claimName: twotest-pvc

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

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

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

apiVersion: v1kind: Podmetadata:  name: hzb-mongo2-cephspec:  containers:  - name: hzb-mongo2-c    image: 172.16.71.199/common/mongo:3.0.9    imagePullPolicy: IfNotPresent    env:    - name: PATH      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin    - name: GOSU_VERSION      value: "1.7"    - name: MONGO_MAJOR      value: "3.0"    - name: MONGO_VERSION      value: 3.0.9    volumeMounts:    - name: twotest-vl2      mountPath: /data/db      readOnly: false  volumes:  - name: twotest-vl2    persistentVolumeClaim:      claimName: twotest-pvc

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

6)验证是否挂载成功

执行kubectl get pod

[root@dev-master hzb]# kubectl get podNAME              READY     STATUS    RESTARTS   AGEhzb-mongo1-ceph   1/1       Running   0          1mhzb-mongo2-ceph   1/1       Running   0          1m

发现两个都起来了

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

cd /data/configdb/touch 001.txt

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

cd /data/db/touch 002.txt

 然后我们到cephfs里面去看

root@ceph01:~# cd /root/mir2_data/mongonDB/root@ceph01:~/mir2_data/mongonDB# ll总用量 81921drwxr-xr-x 1  999 root        8 7月  20 17:32 ./drwxr-xr-x 1  999  999       12 7月  21 09:03 ../-rw-r--r-- 1 root root        0 7月  20 17:32 001.txt-rw-r--r-- 1 root root        0 7月  20 17:32 002.txtdrwxr-xr-x 1  999  999        0 7月  21 08:52 journal/-rw------- 1  999  999 67108864 7月  20 17:30 local.0-rw------- 1  999  999 16777216 7月  20 17:30 local.ns-rw-r--r-- 1  999  999        0 7月  21 08:52 mongod.lock-rw-r--r-- 1  999  999       69 7月  20 17:30 storage.bsondrwxr-xr-x 1  999  999        0 7月  20 17:30 _tmp/root@ceph01:~/mir2_data/mongonDB#

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

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

 

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

apiVersion: v1kind: Podmetadata:  name: cephfs2spec:  containers:  - name: cephfs-rw    image: 172.16.71.199/common/mongo:3.0.9    volumeMounts:    - mountPath: "/data/configdb"      name: cephfs  volumes:  - name: cephfs    cephfs:      monitors:      - 10.16.154.78:6789      - 10.16.154.82:6789      - 10.16.154.83:6789      user: admin      secretRef:        name: ceph-secret      readOnly: true

 

转载地址:http://ahdix.baihongyu.com/

你可能感兴趣的文章
Java到底能干嘛?
查看>>
Android4.4 及以下TextView,Button等控件使用矢量图报错
查看>>
CODING 最佳实践:快课网研发效能提升之路
查看>>
记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案
查看>>
vue-router 源码阅读 - 文件结构与注册机制
查看>>
网页视频流m3u8/ts视频下载
查看>>
【Leetcode】75.颜色分类
查看>>
刷前端面经笔记(十一)
查看>>
几款常见的视频格式转换器
查看>>
使用Data URI Scheme优雅的实现前端导出csv
查看>>
第十七天-企业应用架构模式-会话状态模式
查看>>
Bytom BIP-32协议和BIP-44协议
查看>>
Docker入门(二)在docker使用MongoDB
查看>>
如何抓住下一波零售风口?看RPA玩转零售自动化
查看>>
记一次mpvue开发完整小程序相关笔记
查看>>
三个月可更改用户昵称两次
查看>>
【极简壁纸】简单高效美观的壁纸网站
查看>>
前嗅ForeSpider教程:采集需要登陆的网页内容
查看>>
从现在开始,试着学会用官方文档去学习一个技术框架
查看>>
一篇文章玩转全网音乐信息库MusicBrainz API
查看>>