kubernetes跨节点共享存储cephfs

本章实现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/hosts
10.1.0.13 admin
10.1.0.13 node1
10.1.0.14 node2

$ node2: cat  /etc/hosts
10.1.0.13 node1
10.1.0.14 node2
  • 配置安装ceph-deploy集群安装工具的yum源
$ node1: cat /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-infernalis/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=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/sudoers
root    ALL=(ALL)       ALL
cephd   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/config
Host node1
   Hostname node1
   User cephd
Host 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 ceph
ceph      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 tree
ID 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 stat
e6: 1/1/1 up {0=node2=up:active}, 1 up:standby
  • 创建fs并测试挂载:需要在monitor节点上
$ ceph osd pool create cephfs_data 128
pool 'cephfs_data' created

$ ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created

$ ceph fs new test_fs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

$ ceph fs ls
name: 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% /dev
10.1.0.13:6789:/         100G   45G   56G   45% /mnt

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

Kubernetes跨节点挂载CephFS

注意:所有k8s节点上必须具备2个硬性条件(1.本地存在/etc/ceph/admin.secret文件,文件内容为上文提到的key值,并且如果使用secret形式挂载时,需要将其改为base64格式;2.每个k8s node上必须安装ceph-common cli tools用于调用;)
同时挂载形式也有两种,一种是通过读文件密码信息,一种是通过secret.yaml获取

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

  • Pod直接挂载CephFS
$ cat ceph-pod2-with-secret.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod2-with-secret
spec:
  containers:
 - name: ceph-ubuntu2
    image: ubuntu:16.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-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFBdlZnWmJoQ3NhRWhBQU95SlZGWWJadVJESnBRR3BKRERhc3c9PQo=
  #此处的key是通过cat /etc/ceph/admin.secret|base64获取
$ cat ceph-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: foo-pv
spec:
  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.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: foo-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 512Mi
  • 使用pvc的pod
$ cat ceph-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod2
spec:
  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.yaml
persistentvolume "foo-pv" created
$ kubectl create -f ceph-pvc.yaml
persistentvolumeclaim "foo-claim" created

你可能感兴趣的:(kubernetes)