ceph-deploy 安裝 ceph


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM