前言
哈嘍大家好呀! 這次給大家帶來的Liunx軟件分享是鼎鼎大名的Ceph分佈式文件系統,筆者瞭解到Ceph也是遇到了一個問題就是在使用Kubeneters的時候在各個容器中都需要使用同一套文件,但是使用NAS盤的方式不管是更新還是讀取都要忍受2分鐘之久而且還會出現文件佔用失敗的問題,筆者找了找現有和Kuberneters結合比較好的文件系統才發現Ceph,那麼就開始進行Ceph的搭建和使用吧
附上:
喵了個咪的博客:w-blog.cn
Ceph官網 :https://ceph.com/
1. 環境準備
首先需要3臺服務器來做集羣,ceph默認會進行文件三份的冗餘來保障文件不易丟失,服務器IP地址如下:
PS:這裏使用的是Centos7的系統版本
192.168.3.101 ceph-1
192.168.3.102 ceph-2
192.168.3.103 ceph-3
這裏使用docker的方式進行安裝不會應爲安裝過程污染環境方便刪除重試:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
需要配置好國內docker源來提高速度並且配置好開啓自啓(需要使用自己的阿里雲賬號獲取加速地址)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
2. 集羣部署
在各個節點上拉取需要使用到的Docker鏡像
docker pull ceph/daemon
在node1節點上運行 mon
docker run -d \
--name=mon \
--net=host \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=192.168.3.101 \
-e CEPH_PUBLIC_NETWORK=192.168.3.0/24 \
ceph/daemon mon
查看docker運行狀態,並且執行命令查看ceph的集羣情況
[root@ceph-1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0c9d7680461 ceph/daemon "/entrypoint.sh mon" About a minute ago Up About a minute mon
[root@ceph-1 ~]# docker exec mon ceph -s
cluster:
id: da8f7f5b-b767-4420-a510-287f4ced25de
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph-1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
雖然我們沒有映射端口,Ceph容器會把後續需要使用到的端口映射出來
[root@ceph-1 ~]# yum install tcping
[root@ceph-1 ~]# tcping 192.168.3.101 6789
192.168.3.101 port 6789 open
Ceph有兩種方式在各個節點之間共享配置,一種是文件的方式需要吧第一個啓動起來的節點的文件CP到其他節點,另外一種是使用配置服務(比如etcd或者consul) 這裏使用的文件的方式存放公共配置問題複製配置文件 將 node1 上的配置文件複製到 node02 和 node03,複製的路徑包含/etc/ceph和/var/lib/ceph/bootstrap-*下的所有內容。
ssh [email protected] mkdir -p /var/lib/ceph
scp -r /etc/ceph [email protected]:/etc
scp -r /var/lib/ceph/bootstrap* [email protected]:/var/lib/ceph
ssh [email protected] mkdir -p /var/lib/ceph
scp -r /etc/ceph [email protected]:/etc
scp -r /var/lib/ceph/bootstrap* [email protected]:/var/lib/ceph
啓動第二個和第三個 mon 在 node02 上執行以下命令啓動 mon,注意修改 MON_IP
docker run -d \
--net=host \
--name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=192.168.3.102 \
-e CEPH_PUBLIC_NETWORK=192.168.3.0/24 \
ceph/daemon mon
在 node03 上執行以下命令啓動 mon,注意修改 MON_IP
docker run -d \
--net=host \
--name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=192.168.3.103 \
-e CEPH_PUBLIC_NETWORK=192.168.3.0/24 \
ceph/daemon mon
在任意節點上在查看ceph集羣狀態可以看到有三個mos上線了
[root@ceph-1 ~]# docker exec mon ceph -s
cluster:
id: da8f7f5b-b767-4420-a510-287f4ced25de
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
接着就需要運行osd服務把某個磁盤給ceph作爲文件共享系統的基礎存儲,所以我們需要爲三臺服務器掛載對應的磁盤(筆者這裏使用的是阿里雲的雲服務器,這裏掛載了100GB的SSD)
[root@ceph-1 ~]# fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d73a
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux
Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
三臺機器分別運行(如果需要掛載多塊可以運行多個osd即可)
docker run -d \
--net=host \
--name=osd \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /dev/:/dev/ \
--privileged=true \
-e OSD_FORCE_ZAP=1 \
-e OSD_DEVICE=/dev/vdb \
ceph/daemon osd_ceph_disk
我們再次查看發現osd3個節點已經上線了
[root@ceph-1 ~]# docker exec mon ceph -s
cluster:
id: da8f7f5b-b767-4420-a510-287f4ced25de
health: HEALTH_WARN
no active mgr
services:
mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
mgr: no daemons active
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
但是我們並看不到有存儲空間,主要是mgr沒有啓動,我們把mds和rgw也一起跑起來在node1節點上:
docker run -d \
--net=host \
--name=mgr \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
ceph/daemon mgr
docker run -d \
--net=host \
--name=mds \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e CEPHFS_CREATE=1 \
ceph/daemon mds
docker run -d \
--name=rgw \
-p 80:80 \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
ceph/daemon rgw
初始化完成
[root@ceph-1 ~]# docker exec mon ceph -s
cluster:
id: da8f7f5b-b767-4420-a510-287f4ced25de
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
mgr: ceph-1(active)
mds: cephfs-1/1/1 up {0=ceph-1=up:active}
osd: 3 osds: 3 up, 3 in
rgw: 1 daemon active
data:
pools: 6 pools, 48 pgs
objects: 209 objects, 3.4 KiB
usage: 6.0 GiB used, 292 GiB / 298 GiB avail
pgs: 48 active+clean
3. 簡單使用和性能
可以使用ceph掛載磁盤進行使用,但是ceph有很強的用戶校驗機制所以需要先拿到訪問key ,並且在使用過程中可以指定多個節點這就形成了負載均衡 用內核驅動掛載 Ceph 文件系統 — Ceph Documentation
mkdir /mnt/mycephfs
[root@ceph-1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQBXv0VbKtikExAAwHHp+F2HJSnYIIqaozjt3g==
auid = 0
caps mds = "allow"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
mount -t ceph 192.168.3.101,192.168.3.102,192.168.3.103:/ /mnt/mycephfs -o name=admin,secret=AQBhlz1bZBHcLxAAt6eIyBxnAxFoyA7PDTqAkQ==
umount /mnt/mycephfs
[root@ceph-1 ~]# lsof /mnt/mycephfs
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 10486 root cwd DIR 0,0 2 1099511627781 /mnt/mycephfs/data/dev/code
這樣只是最簡單的使用,還有關於rdb對象存儲以及Ceph還有快照功能
在搭建好整個集羣之後進行測試文件速度(這裏主要測試的是5000多個小文件拷貝速度)如下:
# NAS盤
/app # time cp -rf php/ general/test
real 2m 7.05s
user 0m 0.13s
sys 0m 1.80s
# CEPH
/app # time cp -rf php/ generalceph/test
real 0m 6.88s
user 0m 0.05s
sys 0m 0.39s
# 本地磁盤
/app # time cp -rf php/ php2
real 0m 1.16s
user 0m 0.02s
sys 0m 0.21s
大家可以看到CEPH的速度對於NAS盤提升不是一點兩點是質的提升,面對本地磁盤差距也沒有到不能接受的情況
4. Kubernetes使用
筆者的最終目的是在K8S中可以使用ceph作爲高速共享盤,那麼就需要藉助K8S支持的cephFS文件掛載,具體對應的編排如下
因爲使用ceph需要密碼所以我們先創建一個secret
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
namespace: dev
data:
key: QVFCMTZWMVZvRjVtRXhBQTVrQ1FzN2JCajhWVUxSdzI2Qzg0SEE9PQ==
最後創建我們需要的volume掛載卷就可以在POD中正常使用了
apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv
spec:
capacity:
storage: 200Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 192.168.3.101:6789
- 192.168.3.102:6789
- 192.168.3.103:6789
user: admin
secretRef:
name: ceph-secret
readOnly: false
storageClassName: ceph
persistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cephfs-pv-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
storageClassName: ceph
5. 小技巧
如果大家沒有搞定也可以先試試官方也提供整合好的demo 不需要開這麼多組件才能使用,只需要以下命令即可:
docker run -d \
--net=host \
-v /etc/ceph:/etc/ceph \
-e MON_IP=172.16.0.13 \
-e CEPH_PUBLIC_NETWORK=172.16.0.0/24 \
ceph/demo
被ceph佔用的磁盤會自己劃分分區,無法在被二次使用了,如果需要重新初始化可以使用命令對磁盤進行全盤格式
[root@ceph-1 ~]# fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d73a
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: 17E24D34-44A5-46BB-8753-A882133156FF
# Start End Size Type Name
1 2048 206847 100M unknown ceph data
2 3483648 209715166 98.3G unknown ceph block
3 206848 2303999 1G unknown ceph block.db
4 2304000 3483647 576M unknown ceph block.wal
如果需要重新部署需要先,清理磁盤可以通過以下命名進行格式化
docker run -d --privileged=true -v /dev/:/dev/ -e OSD_DEVICE=/dev/vdb ceph/daemon zap_device