kubernetes多节点的pod挂载同一个cephfs目录
一、安装cephfs
方法一:
直接进入deploy目录,执行:
ceph-deploy --overwrite-conf mds create ceph01:mds-daemon-
上面的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_data
mount -t ceph 10.111.131.125::/ /root/mir2_data -o name=admin,secretfile=/etc/ceph/admin.secret
如果要挂载的目录在ceph的mon节点下,直接:
mkdir mir2_data
mount -t ceph 10.111.131.125::/ /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: /mnt -r /cfuse
方法一:直接用Linux命令创建
cd /root/mir2_data
mkdir 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.so
ln -s /usr/lib/jni/libcephfs_jni.so. /usr/lib/libcephfs_jni.so.
centos7 64位下面:
wget http://mirrors.sohu.com/centos/7/storage/x86_64/ceph-hammer/libcephfs1-0.94.9-0.el7.x86_64.rpm
wget 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.-.el7.x86_64.rpm libcephfs_jni1-0.94.-.el7.x86_64.rpm
ln -s /usr/lib64/libcephfs_jni.so.1.0. /usr/lib/libcephfs_jni.so. ln -s /usr/lib64/libcephfs_jni.so.1.0. /usr/lib/libcephfs_jni.so
2)新建maven工程,然后在pom.xml里面加入如下依赖,目录只找到以下版本
<dependency>
<groupId>com.ceph</groupId>
<artifactId>libcephfs</artifactId>
<version>0.80.</version>
</dependency>
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=="|base64
QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=
创建ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
key: QVFCbmdmaFlwSHZMS2hBQXRtVlpUeVIzTkp4eDFXT1ZlTG81cFE9PQo=
在k8s执行:kubectl create -f ceph-secret.yaml。
2)创建twotest-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: twotest-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 10.111.131.125:
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: PersistentVolumeClaim
apiVersion: v1
metadata:
name: twotest-pvc
spec:
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: v1
kind: Pod
metadata:
name: hzb-mongo1-ceph
spec:
containers:
- name: hzb-mongo1-c
image: 172.16.71.199/common/mongo:3.0.
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.
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: v1
kind: Pod
metadata:
name: hzb-mongo2-ceph
spec:
containers:
- name: hzb-mongo2-c
image: 172.16.71.199/common/mongo:3.0.
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.
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 pod
NAME READY STATUS RESTARTS AGE
hzb-mongo1-ceph / Running 1m
hzb-mongo2-ceph / Running 1m
发现两个都起来了
执行 kubectl exec -it hzb-mongo1-ceph bash,进入容器内部
cd /data/configdb/
touch .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
总用量
drwxr-xr-x root 7月 : ./
drwxr-xr-x 7月 : ../
-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.txt
drwxr-xr-x 7月 : journal/
-rw------- 7月 : local.
-rw------- 7月 : local.ns
-rw-r--r-- 7月 : mongod.lock
-rw-r--r-- 7月 : storage.bson
drwxr-xr-x 7月 : _tmp/
root@ceph01:~/mir2_data/mongonDB#
发现数据已经挂载到mongoDB这个目录里面了。
注意:pv和pvc设置的容量大小并不能限制cephfs某一个目录的大小,也就是说容器可以向cephfs目录写入超出1G的文件。
除了用pv和pvc挂载,pod也可以直接挂载cephfs,例如:
apiVersion: v1
kind: Pod
metadata:
name: cephfs2
spec:
containers:
- name: cephfs-rw
image: 172.16.71.199/common/mongo:3.0.
volumeMounts:
- mountPath: "/data/configdb"
name: cephfs
volumes:
- name: cephfs
cephfs:
monitors:
- 10.16.154.78:
- 10.16.154.82:
- 10.16.154.83:
user: admin
secretRef:
name: ceph-secret
readOnly: true
kubernetes多节点的pod挂载同一个cephfs目录的更多相关文章
- Kubernetes使用节点亲缘性将POD调度到特定节点上
		
节点污点可以用来让pod远离特定的节点,尽量在不修改已有pod信息的前提,通过在节点添加污点信息,来拒绝pod在某些节点上的部署. 而现在介绍一种叫做节点亲缘性,通过明确的在pod中添加的信息,来决定 ...
 - Kubernetes使用节点污点和pod容忍度阻止节点调度到特定节点
		
Kubernetes允许你去影响pod被调度到哪个节点.起初,只能通过在pod规范里指定节点选择器来实现,后面其他的机制逐渐加入来扩容这项功能,本章将包括这些内容. 现在要介绍的高级调度的两个特性是节 ...
 - 六、Kubernetes节点与 Pod 亲和性
		
Kubernetes节点与 Pod 亲和性 一.节点亲和性策略介绍 pod.spec.nodeAffinity preferredDuringSchedulingIgnoredDuringExecu ...
 - 三、Kubernetes之深入了解Pod
		
1.yaml格式的Pod配置文件内容及注解 深入Pod之前,首先我们来了解下Pod的yaml整体文件内容及功能注解. 如下: # yaml格式的pod定义文件完整内容: apiVersion: v ...
 - Kubernetes — 为什么我们需要Pod?
		
不过,我相信你在学习和使用 Kubernetes 项目的过程中,已经不止一次地想要问这样一个问题:为什么我们会需要 Pod? 是啊,我们在前面已经花了很多精力去解读 Linux 容器的原理.分析了 D ...
 - kubernetes之多容器pod以及通信
		
系列目录 容器经常是为了解决单一的,窄范围的问题,比如说微服务.然而现实中,一些复杂问题的完成往往需要多个容器.这里我们讨论一下如何把多个容器放在同一个pod里以及容器间的通信 什么是pod pod是 ...
 - kubernetes进阶之三:Pod
		
一:Pod 是什么 Pod是Kubernetes的最重要最基本的概念.它是能够被创建,调度和管理的最小部署单元.一个Pod代表集群中一个运行的进程. 二:Pod的组成 一个Pod由一个特殊的根容器Pa ...
 - kubernetes和docker----2.学习Pod资源
		
Pod--k8s最基础的资源 我们想要的是单个容器只运行一个进程 然而有时我们需要多个进程协同工作,所以我们需要另外一种更加高级的结构将容器组合在一起---pod Pod 我们来看一个最基本的pod ...
 - 三、安装并配置Kubernetes Node节点
		
1. 安装并配置Kubernetes Node节点 1.1 安装Kubernetes Node节点所需服务 yum -y install kubernetes 通过yum安装kubernetes服 ...
 
随机推荐
- visual studio内置“iis”组件提取及二次开发
			
简介 visual studio安装后会自带小型的“iis”服务器,本文就简单提取一下这个组件,自己做一个小型“iis”服务器吧.先来说用途吧(废话可绕过),比如在服务器上没有安装iis,或者给客户演 ...
 - Chrome 上传时打开对话框非常慢
			
Chrome 上传时打开对话框非常慢 先说解决方法,将 Chrome 中这个选项关闭,打开会飞快. 如果只是图片之类是不会的,但是有 zip apk 之类的就会慢. 主要原因还是 Chrome 太安全 ...
 - linux pwd命令查看当前路径命令
			
命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory执行权限 :All User指令所在路径:/usr/bin/pwd 或 /bin/pwd 命令语法: ...
 - zipkin对于dubbo的支持
			
对于Web端: 1. 需要在applicationContext的头部添加中添加prefix引用: xmlns:dubbo="http://code.alibabatech.com/sche ...
 - bzoj 2007 [Noi2010]海拔——最小割转最短路
			
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...
 - moodle搭建相关的笔记
			
关于moodle内网外网访问问题的解决方案(转) http://blog.chinaunix.net/uid-656828-id-3106027.html
 - HDU 4586 Play the Dice(数学期望)
			
Play the Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
 - android自动化之MonkeyRunner测试环境配置(一)
			
Android自动化测试之MonkeyRunner 一.Android自动化测试之环境搭建 1.1 Android-sdk介绍 ¢ SDK(Software development kit)软件开发 ...
 - Rhythmk 学习 Hibernate 04 - Hibernate  辅助工具 之  JBoos Tool
			
1.安装JBoos Tool Help -> Install new Software 然后添加: http://download.jboss.org/jbosstools/updates/de ...
 - leetcode563
			
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...