设为首页 收藏本站
查看: 1691|回复: 0

[经验分享] kubernetes多节点的pod挂载同一个cephfs目录

[复制链接]

尚未签到

发表于 2018-1-5 12:58:38 | 显示全部楼层 |阅读模式
  一、安装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_data  
mount
-t ceph 10.111.131.125:6789:/ /root/mir2_data -o name=admin,secretfile=/etc/ceph/admin.secret  

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

mkdir mir2_data  
mount
-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_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.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.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.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.1  

  
ln
-s /usr/lib64/libcephfs_jni.so.1.0.0 /usr/lib/libcephfs_jni.so  

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

        <dependency>  <groupId>com.ceph</groupId>
  <artifactId>libcephfs</artifactId>
  <version>0.80.5</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>  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: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: 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.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: v1  
kind: Pod
  
metadata:
  name: hzb
-mongo2-ceph  
spec:
  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
  

[iyunv@dev-master hzb]# kubectl get pod  
NAME              READY     STATUS    RESTARTS   AGE
  
hzb
-mongo1-ceph   1/1       Running   0          1m  
hzb
-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  
总用量
81921  
drwxr
-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.txt
  
drwxr-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.bson
  
drwxr-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: v1  
kind: Pod
  
metadata:
  name: cephfs2
  
spec:
  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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431873-1-1.html 上篇帖子: kubernetes使用ceph 下篇帖子: [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表