• kubernetes多节点的pod挂载同一个cephfs目录


    一、安装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 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: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

    [root@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
  • 相关阅读:
    Ceph对象主本损坏的修复方法
    mds的cpu占用问题分析以及解决办法
    CentOS GRUB损坏修复方法
    掉电后osdmap丢失无法启动osd的解决方案
    怎样禁止Ceph OSD的自动挂载
    Silverlight 预定义颜色速查表
    Silverlight中Image控件Stretch属性的四种值比较
    Silverlight中图片显示
    Silverlight中关于ComboBox的各种使用
    Silverlight样式定义
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/7216422.html
Copyright © 2020-2023  润新知