近期進行公司業務容器化改造,在爲kubernetes提供存儲選型方面,在選型中本地存儲不可跨node,NFS共享存儲很差作高可用,所以選型Ceph來爲k8s提供存儲類。特此筆記以備後用。html
Ceph是一種爲優秀的性能、可靠性和可擴展性而設計的統一的、分佈式文件系統。Ceph是一個開源的分佈式文件系統。由於它還支持塊存儲、對象存儲,因此很天然的被用作雲計算框架openstack或cloudstack整個存儲後端。固然也能夠單獨做爲存儲,例如部署一套集羣做爲對象存儲、SAN存儲、NAS存儲等。能夠做爲k8s的存儲類,來方便容器持久化存儲。node
對象存儲:即radosgw,兼容S3接口。經過rest api上傳、下載文件。shell
文件系統:posix接口。能夠將ceph集羣看作一個共享文件系統掛載到本地。bootstrap
塊存儲:即rbd。有kernel rbd和librbd兩種使用方式。支持快照、克隆。至關於一塊硬盤掛到本地,用法和用途和硬盤同樣。好比在OpenStack項目裏,Ceph的塊設備存儲能夠對接OpenStack的後端存儲vim
統一存儲:雖然ceph底層是一個分佈式文件系統,但因爲在上層開發了支持對象和塊的接口後端
高擴展性:擴容方便、容量大。可以管理上千臺服務器、EB級的容量。api
高可靠性:支持多份強一致性副本,EC。副本可以垮主機、機架、機房、數據中心存放。因此安全可靠。存儲節點能夠自管理、自動修復。無單點故障,容錯性強。安全
高性能:由於是多個副本,所以在讀寫操做時候可以作到高度並行化。理論上,節點越多,整個集羣的IOPS和吞吐量越高。另一點ceph客戶端讀寫數據直接與存儲設備(osd) 交互。bash
Ceph OSDs:Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的複製、恢復、回填、再均衡,並經過檢查其餘OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集羣設定爲有2個副本時,至少須要2個 OSD 守護進程,集羣才能達到 active+clean 狀態( Ceph 默認有3個副本,但你能夠調整副本數)。服務器
Monitors: Ceph Monitor維護着展現集羣狀態的各類圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存着發生在Monitors 、 OSD 和 PG上的每一次狀態變動的歷史信息(稱爲 epoch )。
MDSs: Ceph 元數據服務器( MDS )爲 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,能夠在不對 Ceph 存儲集羣形成負擔的前提下,執行諸如 ls、find 等基本命令。
主機名 | 操做系統 | 配置 | K8S組件 | CEPH組件 | 私網IP | SSH端口 | 用戶名密碼 |
---|---|---|---|---|---|---|---|
master | CentOS 7.4 64bit | 4C8G + 500G硬盤 | admin,osd, mon | 172.16.60.2 | 2001/22 | root/uWWKxxxxxxcuh | |
node01 | CentOS 7.4 64bit | 4C8G + 500G硬盤 | osd, mon | 172.16.60.3 | 2002/22 | root/IZ5lxxxxxxxQOkLh | |
node02 | CentOS 7.4 64bit | 4C8G + 500G硬盤 | osd, mon | 172.16.60.4 | 2003/22 | root/nUMFxxxxxxzDMcE |
須要在三臺主機建立磁盤,並掛載到主機的/var/local/osd{0,1,2}
[root@master ~]# mkfs.xfs /dev/vdc
[root@master ~]# mkdir -p /var/local/osd0
[root@master ~]# mount /dev/vdc /var/local/osd0/
[root@node01 ~]# mkfs.xfs /dev/vdc
[root@node01 ~]# mkdir -p /var/local/osd1
[root@node01 ~]# mount /dev/vdc /var/local/osd1/
[root@node02 ~]# mkfs.xfs /dev/vdc
[root@node02 ~]# mkdir -p /var/local/osd2
[root@node02 ~]# mount /dev/vdc /var/local/osd2/
將磁盤添加進入fstab中,確保開機自動掛載
複製代碼
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.60.2 master
172.16.60.3 node01
172.16.60.4 node02
複製代碼
[root@master ~]# ssh-keygen -t rsa
[root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@node01
[root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@node02
複製代碼
# 各節點均更新ceph的yum源
vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority =1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority =1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS
gpgcheck=0
priority=1
# 安裝ceph-deploy工具
yum clean all && yum makecache
yum -y install ceph-deploy
複製代碼
建立monitor服務,指定master節點的hostname
[root@master ~]# mkdir /etc/ceph && cd /etc/ceph
[root@master ceph]# ceph-deploy new master
[root@master ceph]# ll
total 12
-rw-r--r-- 1 root root 195 Sep 3 10:56 ceph.conf
-rw-r--r-- 1 root root 2915 Sep 3 10:56 ceph-deploy-ceph.log
-rw------- 1 root root 73 Sep 3 10:56 ceph.mon.keyring
[root@master ceph]# cat ceph.conf
[global]
fsid = 5b9eb8d2-1c12-4f6d-ae9c-85078795794b
mon_initial_members = master
mon_host = 172.16.60.2
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2
配置文件的默認副本數從3改爲2,這樣只有兩個osd也能達到active+clean狀態,把下面這行加入到[global]段(可選配置)
複製代碼
# 各節點安裝軟件包
yum -y install yum-plugin-priorities epel-release
# master節點利用ceph-deply 部署ceph
[root@master ceph]# ceph-deploy install master node01 node02
[root@master ceph]# ceph --version
ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)
複製代碼
# 安裝ceph monitor
[root@master ceph]# ceph-deploy mon create master
# 收集節點的keyring文件
[root@master ceph]# ceph-deploy gatherkeys master
# 建立osd
[root@master ceph]# ceph-deploy osd prepare master:/var/local/osd0 node01:/var/local/osd1 node02:/var/local/osd2
# 權限修改
[root@master ceph]# chmod 777 -R /var/local/osd{0..2}
[root@master ceph]# chmod 777 -R /var/local/osd{0..2}/*
# 激活osd
[root@master ceph]# ceph-deploy osd activate master:/var/local/osd0 node01:/var/local/osd1 node02:/var/local/osd2
# 查看狀態
[root@master ceph]# ceph-deploy osd list master node01 node02
複製代碼
用ceph-deploy把配置文件和admin密鑰拷貝到全部節點,這樣每次執行Ceph命令行時就無需指定monitor地址和ceph.client.admin.keyring了
[root@master ceph]# ceph-deploy admin master node01 node02
# 各節點修改ceph.client.admin.keyring權限:
[root@master ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
# 查看狀態
[root@master ceph]# ceph health
HEALTH_OK
[root@master ceph]# ceph -s
cluster 5b9eb8d2-1c12-4f6d-ae9c-85078795794b
health HEALTH_OK
monmap e1: 1 mons at {master=172.16.60.2:6789/0}
election epoch 3, quorum 0 master
osdmap e15: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds
pgmap v27: 64 pgs, 1 pools, 0 bytes data, 0 objects
15681 MB used, 1483 GB / 1499 GB avail
64 active+clean
複製代碼
咱們在node01/node02上安裝部署MDS服務
[root@master ceph]# ceph-deploy mds create node01 node02
# 查看狀態
[root@master ceph]# ceph mds stat
e3:, 2 up:standby
[root@master ~]# ceph mon stat
e1: 1 mons at {master=172.16.60.2:6789/0}, election epoch 4, quorum 0 master
# 查看服務
[root@master ceph]# systemctl list-unit-files |grep ceph
ceph-create-keys@.service static
ceph-disk@.service static
ceph-mds@.service disabled
ceph-mon@.service enabled
ceph-osd@.service enabled
ceph-radosgw@.service disabled
ceph-mds.target enabled
ceph-mon.target enabled
ceph-osd.target enabled
ceph-radosgw.target enabled
ceph.target enabled
複製代碼
至此,基本上完成了ceph存儲集羣的搭建。
關於建立存儲池 肯定 pg_num 取值是強制性的,由於不能自動計算。下面是幾個經常使用的值:
[root@master ceph]# ceph osd pool create cephfs_data <pg_num>
[root@master ceph]# ceph osd pool create cephfs_metadata <pg_num>
[root@master ~]# ceph osd pool ls
rbd
[root@master ~]# ceph osd pool create kube 128
pool 'kube' created
[root@master ~]# ceph osd pool ls
rbd
kube
# 查看證書
[root@master ~]# ceph auth list
installed auth entries:
mds.node01
key: AQB56m1dE42rOBAA0yRhsmQb3QMEaTsQ71jHdg==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
mds.node02
key: AQB66m1dWuhWKhAAtbiZN7amGcjUh6Rj/HNFkg==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
osd.0
key: AQA46W1daFx3IxAAE1esQW+t1fWJDfEQd+167w==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQBA6W1daJG9IxAAQwETgrVc3awkEZejDSaaow==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.2
key: AQBI6W1dot4/GxAAle3Ii3/D38RmwNC4yTCoPg==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQBu4W1d90dZKxAAH/kta03cP5znnCcWeOngzQ==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQBv4W1djJ1uHhAACzBcXjVoZFgLg3lN+KEv8Q==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
key: AQCS4W1dna9COBAAiWPu7uk3ItJxisVIwn2duA==
caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
key: AQBu4W1dxappOhAA5FanGhQhAOUlizqa5uMG3A==
caps: [mon] allow profile bootstrap-osd
client.bootstrap-rgw
key: AQBv4W1dpwvsDhAAyp58v08XttJWzLoHWVHZow==
caps: [mon] allow profile bootstrap-rgw
複製代碼
# 建立keyring
[root@master ~]# ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube' -o /etc/ceph/ceph.client.kube.keyring
[root@master ~]# ceph auth list
# 將密鑰拷貝到node1和node2
[root@master ceph]# scp ceph.client.kube.keyring root@node01:/etc/ceph/
複製代碼
清理機器上的ceph相關配置:
中止全部進程: stop ceph-all
卸載全部ceph程序:ceph-deploy uninstall [{ceph-node}]
刪除ceph相關的安裝包:ceph-deploy purge {ceph-node} [{ceph-data}]
刪除ceph相關的配置:ceph-deploy purgedata {ceph-node} [{ceph-data}]
刪除key:ceph-deploy forgetkeys
卸載ceph-deploy管理:yum -y remove ceph-deploy
複製代碼