ceph-deploy 安裝 ceph
該教程適用於 luminous(12) - Octopus(15) 版本
節點規划
主機 | 配置 | 角色 |
---|---|---|
192.168.223.151(ceph1) | 1核1G,20G系統盤,50G數據裸盤 | mon,osd,mgr,admin |
192.168.223.152(ceph2) | 1核1G,20G系統盤,50G數據裸盤 | mon,osd,mgr,mds |
192.168.223.153(ceph3) | 1核1G,20G系統盤,50G數據裸盤 | mon,osd,rgw |
- admin 為 ceph-deploy 節點
- mon 集群元數據奇數個
- osd 節點上添加了幾個磁盤,osd 進程就有幾個。集群中最少需要 3 個osd,osd 支持添加文件系統(目錄)或者裸盤(/dev/sdb等),一般推薦直接添加裸盤,因為文件系統性能比較低
- mgr 的主要功能是提供外部監測和管理系統的接口(dashboard界面與對外restful api),無狀態服務,是 12.x(Luminous)版本加入的新組件,啟用 mgr 之后集群狀態才會是HEALTH_OK。最少一個,建議部署多個做高可用
- mds 為 cephfs 基礎組件,如果不需要使用 cephfs 則可以不部署,生產環境成建議部署多個做高可用
- rgw 為對象存儲基礎組件,如果不需要使用對象存儲也可以不部署,生產環境也建議部署多個
- rbd 塊存儲在 ceph 底層 rados 集群部署完成就自帶,無需單獨開啟其他進程
- 生產環境中建議各組件單獨部署到獨立的服務器上面
- public 和 cluster 網絡都使用 192.168.223.0/24,生產環境中出於性能的考慮,建議使用不同的網絡
系統初始化
系統版本
系統 centos 7.9 mininal,7.9 默認內核是 3.x,建議升級內核
升級內核
# 載入公鑰
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安裝ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 載入elrepo-kernel元數據
yum --disablerepo=\* --enablerepo=elrepo-kernel repolist
# 查看可用的rpm包
yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel*
# 安裝長期支持版本的kernel
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64
# 刪除舊版本工具包
yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y
# 安裝新版本工具包
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64
#查看默認啟動順序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (5.4.137-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core) 151
CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core)
#默認啟動的順序是從0開始,新內核是從頭插入(目前位置在0,而4.4.4的是在1),所以需要選擇0。
grub2-set-default 0
#重啟並檢查
reboot
- 當前最新版本內核 5.4.137-1.el7
安裝基礎軟件
yum install -y epel-release lrzsz
設置主機名與 hosts
方法一
151
$ vi /etc/hostname
ceph1
$ vi /etc/hosts
127.0.0.1 ceph1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ceph1 localhost localhost.localdomain localhost6 localhost6.localdomain6
152,153 操作類似
三台主機 /etc/hosts 均添加以下內容:
192.168.223.151 ceph1
192.168.223.152 ceph2
192.168.223.153 ceph3
方法二
hostnamectl set-hostname hostname
- 這個命令不太熟悉,推薦第一種吧
設置時鍾同步
如果節點可訪問互聯網,可以直接啟動 chronyd 系統服務,並設置開機啟動。
yum install -y chrony
systemctl start chronyd.service
systemctl enable chronyd.service
不過一般生產環境中不會開放互聯網訪問權限的,這時候就需要修改節點 /etc/chrony.conf 配置文件,將時間服務器指向內外 ntp 服務器即可,配置格式如下:
server chrony-server-name-or-ip iburst
關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
關閉 selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
優化 ssh 登錄速度
sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config
systemctl restart sshd
優化最大文件句柄、進程等
略
優化內核參數
略
集群主機添加 ssh 密鑰信任
ceph1 主機上面操作即可
# 生成密鑰
ssh-keygen -t rsa -P ''
# 拷貝公鑰給本機
ssh-copy-id -i .ssh/id_rsa.pub root@localhost
# 拷貝 .ssh 目錄所有文件到集群其他節點
scp -rp .ssh/ root@ceph2:/root
scp -rp .ssh/ root@ceph3:/root
完成后,集群中所有主機可以互相免密登錄了
部署
配置 ceph 倉庫源 repo
所有節點操作:
rpm -ivh http://download.ceph.com/rpm-luminous/el7/noarch/ceph-release-1-1.el7.noarch.rpm
sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#g' /etc/yum.repos.d/ceph.repo
- 其他版本改變相應路徑即可
- 如果不修改為國內源,安裝慢如狗
手動安裝基礎軟件包
在所有節點上執行,非必須,ceph-deploy 安裝組件時會自動安裝相應軟件,我們這里提前安裝是為了讓后面安裝過程更快一點
yum install ceph ceph-radosgw -y
安裝 ceph-deploy
ceph1 節點操作:
yum install ceph-deploy python-setuptools python2-subprocess32 ceph-common -y
部署 mon 節點
ceph1 節點操作:
mkdir ceph-cluster
cd ceph-cluster
ceph-deploy new ceph1 --cluster-network 192.168.223.0/24 --public-network 192.168.223.0/24
# mon 節點可以寫第一個,也可以寫多個
操作完成后並沒有真正安裝,只是在當前目前生成相關配置文件以及keyring集群內部通信的認證文件
$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
- 這里就可以根據需求修改集群配置文件 ceph.conf 了
所有節點安裝 ceph 軟件包
ceph-deploy install --no-adjust-repos ceph1 ceph2 ceph3
- 前面在所有節點以及執行 yum install ceph ceph-radosgw -y 手動安裝,此步驟其實可以省略
初始化
ceph-deploy mon create-initial
- 初始化完成后會生成集群需要的 keyring 認證文件
- 注意觀察啟動組件的命令:systemctl start ceph-mon@ceph1,后面的各組件也類似
推送配置以及密鑰到集群主機
ceph-deploy admin ceph1 ceph2 ceph3
- 推送后配置和密鑰存放於 ceph 默認配置目錄 /etc/ceph 中
- 每次更改 ceph 的配置文件,都可以用這個命令推送到所有節點上
推送完成后可以在推送的節點上面使用 ceph 命令管理集群了
# 查看集群狀態
$ ceph -s
cluster:
id: dbeb7a50-c5f0-43c5-ac96-4ca1b7c764bb
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph1
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
添加 mon 節點
ceph1 節點操作:
ceph-deploy mon add ceph2
ceph-deploy mon add ceph3
查看mon的quorum狀態
$ ceph quorum_status --format json-pretty
{
"election_epoch": 12,
"quorum": [
0,
1,
2
],
"quorum_names": [
"ceph1",
"ceph2",
"ceph3"
],
"quorum_leader_name": "ceph1",
"monmap": {
"epoch": 3,
"fsid": "dbeb7a50-c5f0-43c5-ac96-4ca1b7c764bb",
"modified": "2021-07-30 11:59:12.745386",
"created": "2021-07-30 11:49:32.620344",
"features": {
"persistent": [
"kraken",
"luminous"
],
"optional": []
},
"mons": [
{
"rank": 0,
"name": "ceph1",
"addr": "192.168.223.151:6789/0",
"public_addr": "192.168.223.151:6789/0"
},
{
"rank": 1,
"name": "ceph2",
"addr": "192.168.223.152:6789/0",
"public_addr": "192.168.223.152:6789/0"
},
{
"rank": 2,
"name": "ceph3",
"addr": "192.168.223.153:6789/0",
"public_addr": "192.168.223.153:6789/0"
}
]
}
}
部署 mgr 節點
ceph1 節點操作:
$ ceph-deploy mgr create ceph1
$ ceph -s
cluster:
id: dbeb7a50-c5f0-43c5-ac96-4ca1b7c764bb
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
添加 mgr 節點
ceph1 節點操作:
$ ceph-deploy mgr create ceph2
$ ceph -s
cluster:
id: dbeb7a50-c5f0-43c5-ac96-4ca1b7c764bb
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
mgr 啟用 dashboard & prometheus
$ ceph mgr module ls # 查看所有支持 module
$ ceph mgr module enable dashboard
$ ceph mgr module enable prometheus
$ ceph mgr services
{
"dashboard": "http://localhost.localdomain:7000/",
"prometheus": "http://localhost.localdomain:9283/"
}
- 高於 luminous 版本開啟方式有點不一樣,具體查看官方文檔
在瀏覽器訪問:http://mgr-server-ip:7000/
提醒:目前 mgr 功能模塊可能還存在選舉問題,如果多mgr 節點都開啟,可能會出現web頁面取不到數據,建議只開啟一個mgr節點服務,然后關閉其他節點mgr服務。
設置dashboard 端口和IP
ceph config-key set mgr/dashboard/server_port 7000 # 指定集群dashboard的訪問端口。可以不用配置,默認7000端口
ceph config-key set mgr/dashboard/server_addr $IP # 指定集群 dashboard的訪問IP
服務重啟:
systemctl restart ceph-mgr@mon_mgr
添加 osd
ceph1 節點操作:
列出節點磁盤
ceph-deploy disk list ceph1 ceph2 ceph3
- 實際就是執行 fdisk -l
清空節點上面指定的磁盤
ceph-deploy disk zap ceph1 /dev/sdb
ceph-deploy disk zap ceph2 /dev/sdb
ceph-deploy disk zap ceph3 /dev/sdb
- 實際就是執行 dd 命令清空磁盤,生產環境敲錯盤符可能要跑路哦
- 如果一個節點上有多個盤,則后面一一列出,空格隔開即可
- 可以直接使用整個盤,也可以使用盤的一個分區,比如 /dev/sdb1,/dev/sdb2
正式添加磁盤到集群
ceph-deploy osd create ceph1 --data /dev/sdb
ceph-deploy osd create ceph2 --data /dev/sdb
ceph-deploy osd create ceph3 --data /dev/sdb
如果節點上面有更多的磁盤,可以使用更高級的方式:
ceph-deploy osd create {node} --data /dev/to/data --block-db /dev/to/db-device --block-wal /dev/to/wal-device
# bluestore(裸設備,文件系統方式為filestore)方式,ceph 會在 osd 里面使用 rocksdb 存放對象的元數據,這時候就會有三類數據Object Data Blobs(對象數據)、SST文件(rocksdb數據文件)、wal文件(rocksdb日志文件,類似redis的aof文件),這時候把 sst 或者 wal 文件放在更快的 ssd 或者 nvme 盤上,會提升 osd 儲存性能
# --data 選項指定的是Object Data存放的硬盤
# --block-db 選項指定的是SST文件
# --block-wal 選項指定的是wal文件
# 其中 block-db 大小應該不小於 4% data,也就是說如果 --data 盤 1T,--block-db 應該不小於40G
查看集群狀態,應該就正常了
$ ceph -s
cluster:
id: dbeb7a50-c5f0-43c5-ac96-4ca1b7c764bb
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 147GiB / 150GiB avail
pgs:
其中,osd 有四個狀態
up:啟動狀態
down:停止狀態
in:在RADOS集群里面
out:在RADOS集群外邊
ceph的客戶端是直接與osd進行通信的
ceph的客戶端,通過與mon節點進行通信,獲取完整的Cluster Map,然后在客戶端本地,用CRUSH算法,根據Cluster Map,以及對應存儲池的放置組規則,進行計算,獲得所需數據存儲於哪些osd上面,然后直接與osd建立通信進行讀寫。
移除 osd
查看 osd id
ceph osd tree
停用相關 osd
ceph osd out {osd-id}
停用相關進程
systemctl stop ceph-osd@{osd-id}
移除設備
ceph osd purge {osd-id} --yes-i-really-mean-it
如果類似如下的 osd 配置信息存在於 ceph.conf 中,需要在 osd 移除后將其刪除
[osd.1]
host = {hostname}
不過,對應 Luminous 之前的版本,刪除的 osd 方法不太一樣:
# 刪除 crush 運行圖相關數據
ceph osd crush remove {osd-name}
ceph auth del osd.{osd-id}
ceph osd rm {osd-id}
簡單測試集群功能
查看認證信息等
ceph auth list
查看集群狀態
ceph mon stat
# 檢查狀態:ceph quorum_status --format json-pretty
# 查看集群詳細配置:ceph daemon mon.{CEPH-NODE} config show | more
# 查看mon詳細狀態:ceph daemon mon.{CEPH-NODE} mon_status
# 查看ceph log所在目錄:ceph-conf --name mon.{CEPH-NODE} --show-config-value log_fil
# 查看mon節點的admin socket:ceph-conf --name mon.ceph01 --show-config-value admin_socket
查看osd狀態
ceph-deploy osd list compute01
在管理節點查看osd狀態等
ceph osd stat
ceph osd tree
在管理節點查看容量及使用情況
ceph df
創建存儲池 pool
要想使用ceph的存儲功能,必須先創建存儲池
$ ceph osd pool create mypool 64 64
pool 'mypool' created
- pool 支持設置 quota 限額(對象個數、容量),具體見官方文檔
- pool 默認使用 3 個副本,還支持糾刪碼方式的(類似 raid5),具體見官方文檔
查看存儲池狀態
ceph osd pool stats mypool
列出當前集群所有存儲池 pool
$ ceph osd pool ls
mypool
- rados lspools 也可以
上傳一個文件
rados put issue /etc/issue --pool=mypool
獲取一個文件
rados get issue my_issue -p mypool
# issue是對象的ID
# my_issue是outfile,即輸出文件叫啥名字
# -p指定存儲池
列出指定存儲池有哪些文件
rados ls --pool=mypool
查看指定文件在Ceph集群內是怎樣做映射的
ceph osd map mypool issue
osdmap e16 pool 'mypool' (1) object 'issue' -> pg 1.651f88da (1.1a) -> up ([1,0,2], p1) acting ([1,0,2], p1)
ceph map信息簡要說明
osdmap e16 pool 'mypool' (1) object 'issue' -> pg 1.651f88da (1.1a) -> up ([1,0,2], p1) acting ([1,0,2], p1)
# pg 1.651f88da (1.1a),表示第1號存儲池的1a號pg
# up Ceph的存儲池是三副本存儲的,后面的三個數字是存儲了此文件的三個osd的編號,p1表示1號osd是主osd
# acting同理
刪除一個文件
rados rm issue -p mypool
刪除一個存儲池 pool
$ ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
- 必須加 --yes-i-really-really-mean-it
- 報錯是由於沒有配置 mon 節點的 mon_allow_pool_delete 字段所致,解決辦法就是到mon節點進行相應的設置。
解決方法 2 種:
方法一
修改集群 ceph.conf 文件,添加:
[mon]
mon_allow_pool_delete = true
然后使用 ceph-deploy --overwrite-conf admin 推送配置文件到所有節點
最后在集群種所有 mon 節點重啟 mon 進程:systemctl restart ceph-mon@{主機名}
方法二
ceph 可以在運行時更改 ceph-osd 、 ceph-mon 、 ceph-mds 守護進程的配置,此功能在增加/降低日志輸出、啟用/禁用調試設置、甚至是運行時優化的時候非常有用的。
所以前面兩個步驟一樣的,只是最后一個步驟使用命令直接動態修改所有 mon 節點配置,無需重啟,具體命令查看官方文檔。
集群訪問接口
rbd 塊存儲
ceph 搭建好底層 rados 集群后,不需要再單獨啟動進程就可以直接使用 rdb 。
ceph支持一個非常好的特性,以COW(寫時復制)的方式從RBD快照創建克隆,在Ceph中被稱為快照分層。分層特性允許用戶創建多個CEPH RBD克隆實例。這些特性應用於OpenStack等雲平台中,使用快照形式保護ceph RBD 鏡像,快照是只讀的,但COW克隆是完全可以寫 ,可以多次來孵化實例,對雲平台來說是非常有用的。
ceph RBD鏡像有 format-1 和 format-2 兩種類型,RBD支持這兩種類型,但是分層特性COW克隆特性只支持format-2鏡像,默認RBD創建的鏡像是format-1。(這個在克隆的時候特別重要)
先看看自己的Linux內核支不支持rbd塊設備
modinfo rbd # 查看
modprobe rbd # 加載
如果有錯誤信息說明內核不支持,那你就先去升級一下內核吧~
創建一個 rdb 塊存儲
rbd create mypool/myrbd --size 102400
- rbd 命令也會調用 /etc/ceph/ceph.conf 配置文件以便連接 ceph 集群
- 格式:rbd create (pool_name)/rbd_name) --size xxxxxMB
- 在 mypool 上建立了一個叫 myrbd 的塊設備,如果沒有斜杠 / 則默認建立在 rbd 這個pool上創建
- 還有一個是這個size的大小,這個大小可以超過你實際pool的大小,這個叫做瘦分配,也叫超賣和按需分配。創建塊之后可以通過指令rbd resize test/myrbd1 --size 51200 --allow-shrink來動態的更改
映射 rbd 設備到本機
$ rbd map mypool/myrbd
/dev/rbd0
得到塊設備的映射/dev/rbd0,這個時候你就可以像操作本機的塊設備一樣操作該設備了。
mkfs.xfs /dev/rbd0
mkdir /rbd0
mount /dev/rbd0 /rbd0
創建 rbd 快照
rbd snap create --snap mysnap mypool/myrbd
回滾
umount /dev/rbd0
rbd unmap mypool/myrbd
rbd snap rollback mypool/myrbd@mysnap
rbd map mypool/myrbd
mount /dev/rbd0 /rbd0
- 必須 umount,unmap 后才能回滾
- 重新加載后發現回滾到做快照時的狀態了
模板與克隆
模板與克隆使用的是分層技術
先看看該塊設備支不支持創建快照模板,image-format 必須為2
$ rbd info mypool/myrbd
rbd image 'myrbd':
size 100GiB in 25600 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.853e6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Jul 30 17:48:39 2021
- 創建 rbd 設備時可以使用參數指定 1 或者 2 版本: --image-format 2
把該塊做成模板,首先要把做成模板的快照做成protect
rbd snap protect mypool/myrbd@mysnap
- 通過rbd snap unprotect mypool/myrbd@mysnap可以去掉這個保護,但是這樣的話就 不能克隆了
然后可以利用這個快照來當模板來克隆了,我們克隆一個叫myrbd2的塊出來試試
$ rbd clone mypool/myrbd@mysnap mypool/myrbd2
$ rbd -p mypool ls
myrbd
myrbd2
$ rbd info mypool/myrbd2
rbd image 'myrbd2':
size 100GiB in 25600 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.85656b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Jul 30 18:35:30 2021
parent: mypool/myrbd@mysnap
overlap: 100GiB
接下來我們看看這個myrbd2看看和myrbd1有什么不一樣。
先映射myrbd2
$ rbd map mypool/myrbd2
/dev/rbd1
因為是克隆myrbd的snap,myrbd上本來就有文件系統,所以myrbd2上也有文件系統,直接掛載就好了
mkdir /rbd1
mount /dev/rbd1 /rbd1
- 如果本機掛載了 /dev/rdb0 的話,必須先 umount /dev/rbd0,否則會 UUID 沖突報錯:XFS (rbd1): Filesystem has duplicate UUID a7679463-af36-43fb-949a-3ae94bc5c226 - can't mount
- myrbd2的內容上也是和myrbd是相同的,因為是克隆來的嘛
這個時候的myrbd2還是依賴myrbd的鏡像mysnap的,如果myrbd的mysnap被刪除或者怎么樣,myrbd2也不能夠使用了,要想獨立出去,就必須將父鏡像的信息合並flattern到子鏡像中,
$ rbd flatten mypool/myrbd2
Image flatten: 100% complete...done.
$ rbd info mypool/myrbd2
rbd image 'myrbd2':
size 100GiB in 25600 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.85656b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Jul 30 18:35:30 2021
這樣myrbd2就獨立於myrbd了
可以通過如下方法刪除鏡像模板了
$ rbd snap ls mypool/myrbd
SNAPID NAME SIZE TIMESTAMP
4 mysnap 100GiB Fri Jul 30 17:59:17 2021
$ rbd snap unprotect mypool/myrbd@mysnap
$ rbd snap rm mypool/myrbd@mysnap
Removing snap: 100% complete...done.
$ rbd snap ls mypool/myrbd
cephfs 文件系統
cephfs 是一個支持 POSIX 接口的文件系統,它使用 ceph 存儲集群來存儲數據。文件系統對於客戶端來說可以方便的掛載到本地使用。cephfs 構建在 RADOS 之上,繼承 RADOS 的容錯性和擴展性,支持冗余副本和數據高可靠性。
注意:當前,cephfs 還缺乏健壯得像 ‘fsck’ 這樣的檢查和修復功能。存儲重要數據時需小心使用,因為災難恢復工具還沒開發完。
准備 mds 元數據服務
cephfs 文件系統要求 ceph 存儲集群內至少有一個 mds 元數據服務。
新增 mds 服務:
ceph-deploy mds create ceph2
創建 cephfs 文件系統
一個 cephfs 文件系統需要至少兩個 RADOS 存儲池,一個用於數據、一個用於元數據。配置這些存儲池時需考慮:
- 為元數據存儲池設置較高的副本水平,因為此存儲池丟失任何數據都會導致整個文件系統失效。
- 為元數據存儲池分配低延時存儲器(像 SSD ),因為它會直接影響到客戶端的操作延時。
要用默認設置為文件系統創建兩個存儲池,你可以用下列命令:
比如我們使用 120 個 pg。cephfs_data 和 cephfs_metadata 是兩個存儲池的名稱。
ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128
創建好存儲池后,你就可以用 fs new 命令創建文件系統了:
ceph fs new cephfs cephfs_metadata cephfs_data
cephfs是文件系統的名稱。
使用下面的命令可以查看創建的CephFS
$ ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
文件系統創建完畢后, MDS 服務器就能達到 active 狀態了,比如在一個單 MDS 系統中,使用命令查看
$ ceph mds stat
cephfs-1/1/1 up {0=ceph2=up:active}
- ceph -s 集群管理也可以查看
服務器掛載 cephfs
要掛載 cephfs 文件系統,首先需要知道 ceph-mon 的地址,並且掛載的服務器需要安裝 ceph 客戶端:yum install ceph ceph-radosgw -y 或者 ceph-deploy install [server]。掛載命令如下:
mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /mycephfs
但是 ceph v0.55 及后續版本默認開啟了 cephx 認證。這樣掛載會報錯:
mount error 22 = Invalid argument
- mount error 5 = Input/output error 首先先查mds服務是正常,不存在則添加
- mount error 22 = Invalid argument 密鑰不正確,檢查密鑰
如果啟用了cephx認證的Ceph文件系統,掛載時我們必須指定用戶名、密鑰。
secret在/etc/ceph/ceph.client.admin.keyring可以查到。或者使用命令查詢:
ceph auth get-key client.admin
mkdir /mycephfs
mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /mycephfs -o name=admin,secret=AQDQdgNhzPjLFBAAgveHwiTVmWgQJ4EiKlZ98A==
上述方法會把密碼暴露在 bash history 里,建議將密碼單獨保存在一個文件,然后讀取:
mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /mycephfs -o name=admin,secretfile=./admin.key
啟動時掛載,vi /etc/fstab 添加:
ceph1:6789,ceph2:6789,ceph3:6789:/ /mycephfs ceph name=admin,secret=AQDQdgNhzPjLFBAAgveHwiTVmWgQJ4EiKlZ98A==,noatime 0 2
cephfs 用戶隔離
上一步已經實現了遠程掛載,和文件共享,但如果多個產品同時使用一個 cephfs,如果數據都互相可見,顯然是不夠安全的,那么就要做隔離,咱們接下來就來看看 cephfs 是如何做到這點的。
一個 ceph 集群只能創建一個 cephfs 文件系統,所以隔離是在用戶層面做的,具體的做法是:限定某個用戶只能訪問某個目錄。
下面這個命令創建了一個叫 bruce 的用戶,這個用戶只能寫訪問目錄 /bruce,數據存儲在 pool cephfs_data 中。
$ ceph auth get-or-create client.bruce mon 'allow r' mds 'allow r, allow rw path=/bruce' osd 'allow rw pool=cephfs_data'
[client.bruce]
key = AQAKugNheqsKOBAAPiuElV1oTGbB9QX1qwCAIg==
$ ceph auth get client.bruce
exported keyring for client.bruce
[client.bruce]
key = AQAKugNheqsKOBAAPiuElV1oTGbB9QX1qwCAIg==
caps mds = "allow r, allow rw path=/bruce"
caps mon = "allow r"
caps osd = "allow rw pool=cephfs_data"
如果要做進一步的隔離,想讓不通用戶的數據存儲在不同的 pool,可以用命令將 pool 加入的 cephfs 中,再用命令指定,加入 pool 的命令如下:
$ ceph mds add_data_pool bruce
$ ceph fs ls
.... data pools: [cephfs_data bruce ]
掛載方式和 admin 用戶掛載一樣:
mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /mycephfs -o name=bruce,secret=AQAKugNheqsKOBAAPiuElV1oTGbB9QX1qwCAIg==
- 注意:因為 bruce 對根目錄沒寫權限,故不能創建 bruce 目錄,需要使用 admin 賬號先掛載創建一個 bruce 目錄才行
- bruce 用戶對其他目錄以及文件只有讀權限,對 /bruce 目錄可讀可寫可刪除
cephfs 掛載為 NFS
利用 NFS-Ganesha 或 ceph-fuse 與 nfsd, 我們可以將 CephFS 通過 NFS 協議對外發布出去,用戶可以通過 NFS 客戶端掛載 CephFS 文件系統進行訪問。具體方法這里不贅述,有興趣的可以上網搜索。
rgw 對象存儲
介紹
通過對象存儲,將數據存儲為對象,每個對象除了包含數據,還包含數據自身的元數據
對象通過Object ID來檢索,無法通過普通文件系統操作來直接訪問對象,只能通過API來訪問,或者第三方客戶端(實際上也是對API的封裝)
對象存儲中的對象不整理到目錄樹中,而是存儲在扁平的命名空間中,Amazon S3將這個扁平命名空間稱為bucket。而swift則將其稱為容器
無論是bucket還是容器,都不能嵌套
bucket需要被授權才能訪問到,一個帳戶可以對多個bucket授權,而權限可以不同
對象存儲的優點:易擴展、快速檢索
rados 網關介紹
rados 網關也稱為ceph對象網關、radosgw、rgw,是一種服務,使客戶端能夠利用標准對象存儲api來訪問ceph集群。它支持S3和Swift API
rgw運行於librados之上,事實上就是一個稱之為 civetweb 的 web 服務器來響應 restfulapi 請求
客戶端使用標准 api 與 rgw 通信,而 rgw 則使用 librados 與 ceph 集群通信
rgw 客戶端通過 s3 或者 swift api 使用 rgw 用戶進行身份驗證。然后 rgw 網關代表用戶利用cephx 與 ceph 存儲進行身份驗證
雖然在設計與實現上有所區別,但大多數對象存儲系統對外呈現的核心資源類型大同小異
-
Amazon S3:提供了user、bucket和object分別表示用戶、存儲桶和對象,其中bucket隸屬於user,因此user名稱即可做為bucket的名稱空間,不同用戶允許使用相同名稱的bucket
-
OpenStack Swift:提供了user、container和object分別對應於用戶、存儲桶和對象,不過它還額外為user提供了父級組件account,用於表示一個項目或租戶,因此一個account中可包含一到多個user,它們可共享使用同一組container,並為container提供名稱空間
-
RadosGW:提供了user、subuser、bucket和object,其中的user對應於S3的user,而subuser則對應於Swift的user,不過user和subuser都不支持為bucket提供名稱空間,因此,不同用戶的存儲桶也不允許同名;不過,自Jewel版本起,RadosGW引入了tenant(租戶)用於為user和bucket提供名稱空間,但它是個可選組件
-
Jewel版本之前,radosgw的所有user位於同一名稱空間,它要求所有user的ID必須惟一,並且即便是不同user的bucket也不允許使用相同的bucket ID
S3和Swift使用了不同的認證機制
-
用戶賬號是認證(Authentication)、授權(Authorization)及存儲配額(Quota)功能的載體,RGW依賴它對RESTfulAPI進行請求認證、控制資源(存儲桶和對象等)的訪問權限並設定可用存儲空間上限
-
S3主要采用的是基於訪問密鑰(access key)和私有密鑰(secret key)進行認證,RGW兼容其V2和V4兩種認證機制,其中V2認證機制支持本地認證、LDAP認證和kerberos認證三種方式,所有未能通過認證的用戶統統被視為匿名用戶
-
Swift結合Swift私有密鑰(swift key)使用令牌(token)認證方式,它支持臨時URL認證、本地認證、OpenStack Keystone認證、第三方認證和匿名認證等方式
-
通過身份認證后,RGW針對用戶的每次資源操作請求都會進行授權檢查,僅那些能夠滿足授權定義(ACL)的請求會被允許執行
-
S3使用bucket acl和object acl分別來控制bucket和object的訪問控制權限,一般用於向bucket或object屬主之外的其它用戶進行授權
-
Swift API中的權限控制則分為user訪問控制列表和bucket訪問控制列表兩種,前一種針對user進行設定,而后一定則專用於bucket及內部的object,且只有read和write兩種權限
為了支持通用的雲存儲功能,Ceph在RADOS集群的基礎上提供了RGW(RADOS GateWay)數據抽象和管理層,它是原生兼容S3和SwiftAPI的對象存儲服務,支持數據壓縮和多站點(Multi-Site)多活機制,並支持NFS協議訪問接口等特性。RADOS網關也稱為Ceph對象網關、RADOSGW、RGW,是一種服務,使客戶端能夠利用標准對象存儲API來訪問Ceph集群。它支持S3和Swift API
-
radosgw的http/https服務由內建的Civeweb提供,它同時也能支持多種主流的Web服務程序以代理的形式接收用戶請求並轉發至ceph-radosgw進程,這些Web服務程序包括nginx和haproxy等
-
rgw客戶端通過s3或者swift api使用rgw用戶進行身份驗證,S3和Swift是RESTful風格的API,它們基於http/https協議完成通信和數據交換。然后rgw網關代表用戶利用cephx與ceph存儲進行身份驗證
RGW的功能依賴於Ceph對象網關守護進程(ceph-radosgw)實現,它負責向客戶端提供RESTAPI接口,並將數據操作請求轉換為底層RADOS存儲集群的相關操作
-
出於冗余及負載均衡的需要,一個Ceph集群上的ceph-radosgw守護進程通常不止一個,這些支撐同一對象存儲服務的守護進程聯合起來構成一個zone(區域)用於代表一個獨立的存儲服務和存儲空間
-
在容災設計的架構中,管理員會基於兩個或以上的Ceph集群定義出多個zone,這些zone之間通過同步機制實現冗余功能,並組成一個新的父級邏輯組件zonegroup
rgw 網關部署
添加 rgw 節點
ceph-deploy rgw create ceph3
- 使用 ceph-radosgw 經常中 Citeweb 提供服務,默認端口 7480,http ,可以配置為 https,但是沒有必要,因為生產環境一般在前面會加個負載均衡器實現 https
當創建RGW時候默認會創建對應的池信息,不需要人為創建
.rgw.root
default.rgw.control #控制器信息
default.rgw.meta #記錄元數據
default.rgw.log #日志信息
default.rgw.buckets.index #為rgw的bucket信息
default.rqw.buckets.data #是實際存儲的數據信息
- 本地測試時,如果集群 osd 資源太少,創建上面默認 pool 會失敗而導致啟動失敗,建議刪除無用 pool
- 可以使用 ceph df 查看集群中所有 pool 使用情況
修改 rgw 配置,admin 主機 ceph.conf 新增配置:
[client.rgw.ceph3]
rgw_host = ceph3
rgw_frontends = "civetweb port=80"
access_log_file = /tmp/rgw_access.log
error_log_file = /tmp/rgw_error.log
rgw_dns_name = rgw.local
rgw_swift_url = http://rgw.local
- 如果有多個 rgw,配置多段即可
- 然后使用 ceph-deploy --overwrite-conf admin 推送配置文件到所有節點
- ceph3 節點上重啟 rgw 服務:systemctl restart ceph-radosgw@rgw.ceph3
S3 方式訪問
什么是 S3 存儲
S3由Amazon於2006年推出,全稱為Simple Storage Service,S3定義了對象存儲,是對象存儲事實上的標准,從某種意義上說,S3就是對象存儲,對象存儲就是S3,它對象存儲市場的霸主,后續的對象存儲都是對S3的模仿
S3的特點
- 跨區域復制
- 事件通知
- 版本控制
- 安全加密
- 訪問管理切可編程
rgw 中 s3 的 API 支持
對象存儲在bucket中若要利用S3 API訪問對象,需要為RADOS網關配置用戶每個用戶具有一個access key和一個secret key。access key標識用戶,secret key驗證用戶身份
- S3服務的RESTAPI使用用戶賬號(user)、存儲桶(bucket)和對象(object)三個組件來組織存儲的數據對象,對象保存於存儲桶中,而存儲桶則支持授權給特定賬號進行讀寫及創建/刪除等操作
- Amazon S3 API授權和身份驗證模型具有單層設計。一個用戶可以有多個access key和secret key,用於在同一帳戶中提供不同類型的訪問
- radosgw-admin是用於管理radowgw服務的命令行接口,它有着眾多的分別用於不同管理功能的命令,例如user、subuser、key、bucket和object等
創建用戶
$ radosgw-admin user create --uid=john --display-name="John Doe" --email=iohn@example.com --access-key=leffss --secret=123456
{
"user_id": "john",
"display_name": "John Doe",
"email": "iohn@example.com",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "john",
"access_key": "leffss",
"secret_key": "123456"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}
- -uid 指定用戶名
- --display-name 指定備注名
- --email 指定郵箱
- --access-key 指定access key,如果不指定,會自動生成
- --secret 指定secret key如果不指定,會自動生成
用戶管理
#修改用戶:
radosgw-admin user modify --uid=uid --display-name="John E.Doe" --max-buckets=2000
#禁用用戶:
radosgw-admin user suspend --uid=uid
#啟用用戶:
radosgw-admin user enable --uid=uid
#刪除用戶:
radosgw-admin user rm --uid=uid [--purge-data] [--purge-keys]
管理用戶密鑰
#創建一個用戶的key
radosgw-admin key create --uid=uid --key-type=s3 [--access-key=key] [--secret=secret]
#刪除一個用戶的key
radosgw-admin key rm --uid=uid --access-key=key # 在創建密鑰時,可以通過--gen-access-key和--gen-secret來生成隨機的access key和secret key
設置配額數
#基於用戶的配額
radosgw-admin quota set --quota-scope=user --uid=uid [--max-objects=number] [--max-
size=sizeinbytes]
#基於bucket的配額
radosgw-admin quota set --quota-scope=bucket --uid=uid [--max-ob.jects=number] [--max-
size=sizeinbytes]
#啟用配額
radosgw-admin quota enable --quota-scope=[user|bucket] --uid=uid
#禁用配額
radosgw-admin quota disable --quota-scope=[user|bucket] --uid=uid
檢索用戶信息
#查看某個用戶信息
radosgw-admin user info --uid=user
#查看所有的用戶信息
radosgw-admin user list
統計數據
#用戶在具體的時間段寫入了多少的數據
radosgw-admin usage show --uid=uid --start-date=start --end-date=end
radosgw-admin usage trim --start-date=start --end-date=end
radosgw-admin usage show --show-log-entries=false
#時間的方式
data表示方式:YYYY-MM-DD hh:mm:ss
配置DNS實現數據傳輸(一)
配置泛域名解析
-
S3的存儲桶是用於存儲對象的容器,每個對象都必須儲存在一個特定的存儲桶中,且每個對象都要直接通過RESTfulAPI基於URL進行訪問,URL格式為http(s)://bucket-name.radowgw-host[:port]/key"
-
例如,對於存儲在rgw01.test.io上的S3API對象存儲系統上eshop存儲桶中的名為images/test.ipg的對象,可通過http://eshop.rgw01.test.io/images/test.jpg對其進行尋址
-
因此,radosgw的S3API接口的功能強依賴於DNS的泛域名解析服務,它必須能夠正常解析任何
. 格式的名稱至radosgw主機 -
另外,還需要配置每個radowgw守護進程的rgw dns name為其DNS名稱
#下面是一個在bind中用於泛域名解析的配置示例
IN NS ns
ns IN A 172.29.1.199
rgw01 IN A 172.29.0.11
rgw02 IN A 172.29.0.12
*.rgW01 IN CNAME rgw01
*.rgW02 IN CNAME rgw02
配置DNS實現數據傳輸(二)
創建bucket和訪問資源時需要用到范域名解析功能,能解析如 *.rgw.local 這樣的域名,所以需要namd服務,並使用該namd服務為客戶端提供解析。
配置named服務:
vim /etc/named.rfc1912.zones
zone "rgw.local" IN {
type master;
file "rgw.local.zone";
};
vim /var/named/rgw.local.zone
$TTL 1D
$ORIGIN rgw.local.
@ IN SOA ns.rgw.local. admin.rgw.local. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns
ns IN A 192.168.223.1
@ IN A 192.168.223.153
* IN A 192.168.223.153
檢查namd配置:如果無錯誤則重新加載配置。
named-checkconf
rndc reload
解析測試
$ dig -t A 111.rgw.local @192.168.223.1
192.168.223.153
S3 客戶端 s3cmd 使用
# 安裝
$ yum install -y s3cmd
# 配置
$ s3cmd --configure
Access Key []: leffss
Secret Key []: 123456
Default Region []: default # S3服務的訪問端點和默認的Region(Ceph的新版本中稱作zonegroup)
S3 Endpoint []: rgw.local # 前面安裝 rgw 設置的 dns 域名
DNS-style bucket+hostname:port template for accessing a bucket []: %(bucket)s.rgw.local
Encryption password []: 123456
Path to GPG program [/usr/bin/gpg]:
Use HTTPS protocol []: no
HTTP Proxy server name:
Test access with supplied credentials? [Y/n] y
Save settings? [y/N] y
- 配置文件保存 /root/.s3cfg
修改本機 hosts 文件,添加
192.168.223.153 rgw.local
192.168.223.153 demobucket.rgw.local
- demobucket 代表 bucket 名稱,rgw.local 代表 rgw 域名,實際生產中需要搭建 dns 服務使用泛解析,這里只是測試就直接添加 hosts 文件了
命令測試
#創建bucket,相當於訪問 http://demobucket.rgw.local
$ s3cmd mb s3://demobucket
Bucket 's3://demobucket/' created
#刪除bucket
$ s3cmd rb s3://demobucket
Bucket 's3://demobucket/' removed
#上傳文件至bucket
$ s3cmd put --acl-public /tmp/yum.log s3://demobucket/yum.log
upload: '/tmp/yum.log' -> 's3://demobucket/yum.log' [1 of 1]
6 of 6 100% in 0s 218.19 B/s done
Public URL of the object is: http://demobucket.rgw.local/yum.log
#獲取文件
$ s3cmd get s3://demobucket/demoobject ./demoobject
download: 's3://demobucket/yum.log' -> './yum.log' [1 of 1]
6 of 6 100% in 0s 468.79 B/s done
# curl 方式獲取
$ curl http://demobucket.rgw.local/yum.log
xxx11
# 或者,使用這種 url 指定 bucket 的方式相對於域名的方式最大的好處就是不需要 dns 泛解析了
$ curl http://rgw.local/demobucket/yum.log
xxx11
Swift 方式訪問
什么是 Swift
openstack swift是openstack開源雲計算項目開源的對象存儲,提供了強大的擴展性、冗余和持久性
Swift特性
- 極高的數據持久性
- 完全對稱的系統架構
- 無限的可擴展性
- 無單點故障
Swift-API 操作
Swift-API 的上下文中,存儲桶以container表示,而非S3中的bucket,但二者在功用上類同,都是對象數據的容器,且對象存儲在容器中。Openstack Swift API的用戶模型與Amazon S3 API稍有不同。若要使用swift api通過rados網關的身份驗證,需要為rados網關用戶帳戶配置子用戶。swift有租戶概念,rados網關用戶對應swift的租戶,而子帳號則對應swift的api用戶
Swift 的用戶賬號對應於 radosgw 中的 subuser(子用戶),它隸屬於某個事先存在的 user(用戶賬號)
#創建主賬戶
$ radosgw-admin user create --uid="swiftuser" --display-name="Swift Testing User"
{
"user_id": "swiftuser",
"display_name": "Swift Testing User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "swiftuser",
"access_key": "220DSCM8265NTLO21RCB",
"secret_key": "VPN0mvA9DNAIDxuehRIqc297vcoaHLcZWhpAAJev"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}
# 創建swift子用戶
$ radosgw-admin subuser create --uid="swiftuser" --subuser="swiftuser:swiftsubuser" --access="full"
# --uid 指定現有的 rgw 網關主用戶
# --subuser 指定子用戶,格式[主用戶:子用戶]
# --access 指定用戶權限
# - r 讀取
# - w 寫入
# - rw 讀寫
# - full 完全
{
"user_id": "swiftuser",
"display_name": "Swift Testing User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [
{
"id": "swiftuser:swiftsubuser",
"permissions": "full-control"
}
],
"keys": [
{
"user": "swiftuser",
"access_key": "220DSCM8265NTLO21RCB",
"secret_key": "VPN0mvA9DNAIDxuehRIqc297vcoaHLcZWhpAAJev"
}
],
"swift_keys": [
{
"user": "swiftuser:swiftsubuser",
"secret_key": "MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}
Swift 用戶管理
#修改子用戶
rados-admin subuser modify --subuser=uid:subuserid --access=full
#刪除子用戶
radosgw-admin subuser rm --subuser=uid:subuserid [--purge-data] [--purge-keys]
#修改子用戶密鑰
radosgw-admin key create --subuser=uid:subuserid --key-type=swift [--access-key=key] [--secret=secret]
#刪除子用戶密鑰
radosgw-admin key rm --subuser=uid:subuserid
Swift 客戶端
- swift 客戶端不像s3客戶端一樣有本地的配置信息文件,所以沒有次操作都要帶上賬號的認證信息
- RADOS 網關支持Swift v1.0以及OpenStack keystone v2.0身份驗證
# 安裝 swift 客戶端
yum install -y python3-pip
pip3 install python-swiftclient
# 創建一個容器
swift -V 1.0 -A http://rgw.local/auth -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC post testcontainer
# 向容器中上傳一個文件
$ swift -A http://rgw.local/auth/v1.0 -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC upload testcontainer /tmp/yum.log
tmp/yum.log
# 列出容器中的文件
$ swift -A http://rgw.local/auth/v1.0 -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC list testcontainer
tmp/yum.log
# 查看容器狀態
$ swift -A http://rgw.local/auth/v1.0 -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC stat testcontainer
Account: v1
Container: testcontainer
Objects: 1
Bytes: 6
Read ACL:
Write ACL:
Sync To:
Sync Key:
X-Timestamp: 1627709129.41056
X-Container-Bytes-Used-Actual: 4096
X-Storage-Policy: default-placement
X-Trans-Id: tx000000000000000000020-006104e01b-3747-default
X-Openstack-Request-Id: tx000000000000000000020-006104e01b-3747-default
Accept-Ranges: bytes
Content-Type: text/plain; charset=utf-8
# 列出全部容器
$ swift -A http://rgw.local/auth/v1.0 -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC list
testcontainer
# 查看swift狀態
$ swift -A http://rgw.local/auth/v1.0 -U swiftuser:swiftsubuser -K MLJzEgvLT2SrxusMSFjVB4s5PjdKwFPgNC9my3jC stat
Account: v1
Containers: 1
Objects: 1
Bytes: 6
Containers in policy "default-placement": 1
Objects in policy "default-placement": 1
Bytes in policy "default-placement": 6
Objects in policy "default-placement-bytes": 0
Bytes in policy "default-placement-bytes": 0
X-Timestamp: 1627709922.41707
X-Account-Bytes-Used-Actual: 4096
X-Trans-Id: tx000000000000000000027-006104e1e2-3747-default
X-Openstack-Request-Id: tx000000000000000000027-006104e1e2-3747-default
Accept-Ranges: bytes
Content-Type: text/plain; charset=utf-8
k8s 使用 ceph
cephfs pv 模式
集群必須開啟 cephfs。首先把 ceph 用戶的密鑰以 secret 形式存儲起來,獲取 admin 用戶的密鑰,如果使用其他用戶,可以把 admin 替換為要使用的用戶名即可。
$ ceph auth get-key client.admin | base64
QVFEMDFWVmFWdnp6TFJBQWFUVVJ5VVp3STlBZDN1WVlGUkwrVkE9PQ==
$ cat ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
key: QVFEMDFWVmFWdnp6TFJBQWFUVVJ5VVp3STlBZDN1WVlGUkwrVkE9PQ==
- k8s 集群 Secret 是保存的 base64 數據
接下來創建 pv:
$ cat cephfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- <monitor1-id>:6789
- <monitor2-id>:6789
- <monitor3-id>:6789
user: admin
secretRef:
name: ceph-secret
readOnly: false
persistentVolumeReclaimPolicy: Recycle
最后創建 pvc:
$ cat cephfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
pv 和 pvc 都有以后,使用方式和普通的 pv 和 pvc 無異了。
rbd pv 模式
rbd storageclass 模式
ceph 集群創建 pool
ceph osd pool create k8s 64