本章实现kubernetes各pod间能够挂载共享存储(cephfs)
系统: centos 7.2
搭建过程使用了2台机器分别定义为node1 node2
node1承担了mds节点、osd节点、monitor节点、admin节点
node2承担了mds节点、osd节点
$ hostnamectl set-hostname {name} //node1 node2
$ 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
$ 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
$ node1: yum install ceph-deploy -y
以下操作需要在所有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
$ yum -y install ntp ntpdate ntp-doc
$ ntpdate 0.us.pool.ntp.org
$ hwclock --systohc
$ systemctl enable ntpd.service
$ systemctl start ntpd.service
$ 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工具来安装各节点
$ su - cephd
$ mkdir my-cluster
$ cd ~/my-cluster
$ ceph-deploy new node1
#此时目录下会生成Ceph配置文件、一个monitor密钥环和一个日志文件
修改副本数
由于我们仅有两个OSD节点,设置Ceph配置文件的副本数为2
$ vim ceph.conf
#在[global]标签下,添加下面一行:
osd pool default size = 2
安装过程中遇到些错误可以参考:
http://blog.csdn.net/sinat_36023271/article/details/52402028
相当全面的错误处理方法
$ ceph-deploy install node1 node2
$ 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 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时会报权限问题
$ ceph-deploy osd prepare node1:/var/local/osd0 node2:/var/local/osd1
#prepare操作会在上述的两个osd0和osd1目录下创建一些后续activate激活以及osd运行时所需要的文件
$ ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1
$ ceph-deploy admin admin node1 node2
$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring
$ 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
$ ceph-deploy mds create node1 node2
$ ceph mds stat
e6: 1/1/1 up {0=node2=up:active}, 1 up:standby
$ 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将两个物理节点上的磁盘全部空间作为了自己的空间
注意:所有k8s节点上必须具备2个硬性条件(1.本地存在/etc/ceph/admin.secret文件,文件内容为上文提到的key值,并且如果使用secret形式挂载时,需要将其改为base64格式;2.每个k8s node上必须安装ceph-common cli tools用于调用;)
同时挂载形式也有两种,一种是通过读文件密码信息,一种是通过secret.yaml获取
在K8s中,至少可以通过两种方式挂载CephFS,一种是通过Pod直接挂载;另外一种则是通过pv和pvc挂载。我们分别来看。
$ 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
$ 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
$ 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
$ kubectl create -f ceph-pv.yaml
persistentvolume "foo-pv" created
$ kubectl create -f ceph-pvc.yaml
persistentvolumeclaim "foo-claim" created