kubernetes跨节点共享存储cephfs

来源:互联网 发布:淘宝海纳百川手机壁纸 编辑:程序博客网 时间:2024/06/05 08:52

本章实现kubernetes各pod间能够挂载共享存储(cephfs)

ceph集群部署环境

系统: centos 7.2
搭建过程使用了2台机器分别定义为node1 node2
node1承担了mds节点、osd节点、monitor节点、admin节点
node2承担了mds节点、osd节点

集群安装前的准备工作

  • 规范主机名名称:
$ hostnamectl set-hostname {name} //node1 node2
  • 添加hosts文件实现集群主机名与主机名之间相互能够解析
$ node1: cat  /etc/hosts10.1.0.13 admin10.1.0.13 node110.1.0.14 node2$ node2: cat  /etc/hosts10.1.0.13 node110.1.0.14 node2
  • 配置安装ceph-deploy集群安装工具的yum源
$ node1: cat /etc/yum.repos.d/ceph.repo[ceph-noarch]name=Ceph noarch packagesbaseurl=http://download.ceph.com/rpm-infernalis/el7/noarchenabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc
  • 安装ceph-deploy
$ node1: yum install ceph-deploy -y
  • 创建用户具具有root权限

以下操作需要在所有node上执行

$ node1: useradd -d /home/cephd -m cephd$ node1: passwd cephd#添加sudo权限$ vim /etc/sudoersroot    ALL=(ALL)       ALLcephd   ALL=(ALL)       ALL  增加此行信息
  • 设置集群间的免密登录
$  su - cephd$  ssh-keygen //一路回车$  ssh-copy-id cephd@node1$  ssh-copy-id cephd@node2
  • 在Deploy node上创建并编辑~/.ssh/config

    这是Ceph官方doc推荐的步骤,这样做的目的是可以避免每次执行ceph-deploy时都要去指定 –username {username} 参数。

$ cat ~/.ssh/configHost node1   Hostname node1   User cephdHost node2   Hostname node2   User cephd
  • 配置ntp服务保证时间一致
$ yum -y install ntp ntpdate ntp-doc  $ ntpdate 0.us.pool.ntp.org  $ hwclock --systohc  $ systemctl enable ntpd.service  $ systemctl start ntpd.service  
  • 关闭防火墙或者开放 6789/6800~6900端口、关闭SELINUX
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  $ setenforce 0  $ yum -y install firewalld  $ firewall-cmd --zone=public --add-port=6789/tcp --permanent  $ firewall-cmd --zone=public --add-port=6800-7100/tcp --permanent  $ firewall-cmd --reload  

以上工作就完成了cpeh集群的准备工作,接下来使用ceph-deploy工具来安装各节点

安装ceph monitor

  • 切换到事先新建具备root权限的用户(cephd)
$ su - cephd
  • 创建工作目录用于存放生成的必要文件
$ mkdir my-cluster$ cd ~/my-cluster
  • 创建monitor节点
$ ceph-deploy new node1#此时目录下会生成Ceph配置文件、一个monitor密钥环和一个日志文件
  • 修改副本数

    由于我们仅有两个OSD节点,设置Ceph配置文件的副本数为2

$ vim ceph.conf#在[global]标签下,添加下面一行:osd pool default size = 2
  • 在所有节点安装ceph

安装过程中遇到些错误可以参考:
http://blog.csdn.net/sinat_36023271/article/details/52402028
相当全面的错误处理方法

$ ceph-deploy install node1 node2
  • 初始化ceph monitor
$ ceph-deploy mon create-initial#在当前目录下,出现了若干*.keyring,这是Ceph组件间进行安全访问时所需要的

在node1(monitor node)上,我们看到ceph-mon已经运行起来了

$ ps -ef | grep cephceph      5941     1  0 12月20 ?      00:01:06 /usr/bin/ceph-mon -f --cluster ceph --id node1 --setuser ceph --setgroup ceph#如果要手工停止ceph-mon,可以使用stop ceph-mon-all 命令

安装OSD

OSD node分为两步:prepare 和 activate。OSD node是真正存储数据的节点,我们需要为ceph-osd提供独立存储空间,一般是一个独立的disk。但我们环境不具备这个条件,于是在本地盘上创建了个目录,提供给OSD,在deploy node上执行:

$ ssh node1$ sudo mkdir /var/local/osd0$ sudo chown -R ceph. /var/local/osd0$ exit$ ssh node2$ sudo mkdir /var/local/osd1$ sudo chown -R ceph. /var/local/osd1$ exit#注意一定要修改此目录的属主为"ceph",否则后面激活osd时会报权限问题
  • prepare操作
$ ceph-deploy osd prepare node1:/var/local/osd0 node2:/var/local/osd1#prepare操作会在上述的两个osd0和osd1目录下创建一些后续activate激活以及osd运行时所需要的文件
  • activate操作激活osd
$ ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1
  • 将各个.keyring同步到各个Node上
$ ceph-deploy admin admin node1 node2$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring
  • 查看一下ceph集群中的OSD节点状态
$ ceph osd treeID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY-1 0.09760 root default-2 0.04880     host node1 0 0.04880         osd.0       up  1.00000          1.00000-3 0.04880     host node2 1 0.04880         osd.1       up  1.00000          1.00000

部署mds

$ ceph-deploy mds create node1 node2
  • 验证mds节点
$ ceph mds state6: 1/1/1 up {0=node2=up:active}, 1 up:standby
  • 创建fs并测试挂载:需要在monitor节点上
$ ceph osd pool create cephfs_data 128pool 'cephfs_data' created$ ceph osd pool create cephfs_metadata 128pool 'cephfs_metadata' created$ ceph fs new test_fs cephfs_metadata cephfs_datanew fs with metadata pool 2 and data pool 1$ ceph fs lsname: test_fs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]# ceph当前正式版功能中仅支持一个fs

磁盘挂载

在物理机上挂载cephfs可以使用mount命令、mount.ceph(apt-get install ceph-fs-common)或ceph-fuse(apt-get install ceph-fuse),我们先用mount命令挂载

$ sudo mount -t ceph 10.1.0.13:6789:/ /mnt -o name=admin,secretfile=admin.secret#admin.secret为/etc/ceph/ceph.client.admin.keyring中的key$cat /etc/ceph/ceph.client.admin.keyring[client.admin]    key = AQAxGDpaI9Y+SRAAfDNdF7ptkcbK0crGXYYeDA==
  • 查看挂载情况
$ df -h文件系统                 容量  已用  可用 已用% 挂载点/dev/mapper/centos-root   50G   25G   26G   50% /devtmpfs                 7.6G     0  7.6G    0% /dev10.1.0.13:6789:/         100G   45G   56G   45% /mnt

可以看出:cephfs将两个物理节点上的磁盘全部空间作为了自己的空间

Kubernetes跨节点挂载CephFS

注意:所有k8s节点上必须具备2个硬性条件(1.本地存在/etc/ceph/admin.secret文件,文件内容为上文提到的key值;2.每个k8s node上必须安装ceph-common cli tools用于调用;)

在K8s中,至少可以通过两种方式挂载CephFS,一种是通过Pod直接挂载;另外一种则是通过pv和pvc挂载。我们分别来看。

  • Pod直接挂载CephFS
$ cat ceph-pod2-with-secret.yamlapiVersion: v1kind: Podmetadata:  name: ceph-pod2-with-secretspec:  containers: - name: ceph-ubuntu2    image: ubuntu:14.04    command: ["tail", "-f", "/var/log/bootstrap.log"]    volumeMounts:    - name: ceph-vol2      mountPath: /mnt/cephfs/data      readOnly: false  volumes: - name: ceph-vol2    cephfs:      monitors:      - 10.1.0.13:6789      user: admin      secretFile: "/etc/ceph/admin.secret"      readOnly: false
  • 通过PV和PVC挂载CephFS
$ cat ceph-pv.yamlapiVersion: v1kind: PersistentVolumemetadata:  name: foo-pvspec:  capacity:    storage: 512Mi  accessModes:    - ReadWriteMany  cephfs:    monitors:      - 10.1.0.13:6789    path: /    user: admin    secretRef:      name: ceph-secret    readOnly: false  persistentVolumeReclaimPolicy: Recycle$ cat ceph-pvc.yamlkind: PersistentVolumeClaimapiVersion: v1metadata:  name: foo-claimspec:  accessModes:    - ReadWriteMany  resources:    requests:      storage: 512Mi
  • 使用pvc的pod
$ cat ceph-pod2.yamlapiVersion: v1kind: Podmetadata:  name: ceph-pod2spec:  containers: - name: ceph-ubuntu2    image: ubuntu:14.04    command: ["tail", "-f", "/var/log/bootstrap.log"]    volumeMounts:    - name: ceph-vol2      mountPath: /mnt/cephfs/data      readOnly: false  volumes: - name: ceph-vol2    persistentVolumeClaim:      claimName: foo-claim
  • 创建pv\pvc
$ kubectl create -f ceph-pv.yamlpersistentvolume "foo-pv" created$ kubectl create -f ceph-pvc.yamlpersistentvolumeclaim "foo-claim" created