Centos7下使用Ceph-deploy快速部署Ceph分佈式存儲

#Centos7下使用Ceph-deploy快速部署Ceph分佈式存儲

CEPH 簡介
 不管你是想爲雲平臺提供Ceph 對象存儲和/或 Ceph 塊設備,還是想部署一個 Ceph 文件系統或者把 Ceph 作爲他用,所有 Ceph 存儲集羣的部署都始於部署一個個 Ceph 節點、網絡和 Ceph 存儲集羣。
 Ceph 存儲集羣至少需要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必須要有元數據服務器( Metadata Server )。
 
•    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 等基本命令。Ceph 把客戶端數據保存爲存儲池內的對象。通過使用 CRUSH 算法, Ceph 可以計算出哪個歸置組(PG)應該持有指定的對象(Object),然後進一步計算出哪個 OSD 守護進程持有該歸置組。
    CRUSH 算法使得 Ceph 存儲集羣能夠動態地伸縮、再均衡和修復。

 Ceph 把客戶端數據保存爲存儲池內的對象。通過使用 CRUSH 算法, Ceph 可以計算出哪個歸置組(PG)應該持有指定的對象(Object),然後進一步計算出哪個 OSD 守護進程持有該歸置組。
 CRUSH 算法使得 Ceph 存儲集羣能夠動態地伸縮、再均衡和修復。
 
###Centos7使用Ceph-deploy快速部署Ceph環境:
----
###1)基本環境

    172.16.1.205    ceph-001(ceph-deploy)   mds、mon、osd1(元數據服務,MDS;監視器,MON;也可以將mon、mds節點另放一臺機器)RGW(Ceph對象網關)
    172.16.1.206    ceph-002                  osd2  
    172.16.1.207    ceph-003                  osd3
    172.16.1.208    ceph-client               client(CEPH客戶端)                      

####初始化
yum -y install wget net-tools lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel iftop htop iotop sysstat lsof telnet traceroute tree man yum-plugin-priorities
yum -y install epel-release    
----
####每個節點修改主機名
    hostnamectl set-hostname ceph-001
    hostnamectl set-hostname ceph-002
    hostnamectl set-hostname ceph-003    
    hostnamectl set-hostname ceph-client
----

####每個節點綁定主機名映射
cat /etc/hosts
172.16.1.205    ceph-001
172.16.1.206    ceph-002
172.16.1.207    ceph-003
172.16.1.208    ceph-client
----
####每個節點確認連通性
    ping -c 3 ceph-001
    ping -c 3 ceph-002
    ping -c 3 ceph-003
    ping -c 3 ceph-client
####賬戶密碼
172.16.1.205
root/123456
ceph/ceph

----
####每個節點關閉防火牆和selinux
    systemctl stop firewalld
    systemctl disable firewalld
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    setenforce 0
----
####每個節點安裝和配置NTP(官方推薦的是集羣的所有節點全部安裝並配置 NTP,需要保證各節點的系統時間一致。沒有自己部署ntp服務器,就在線同步NTP)
    sudo yum install ntp ntpdate ntp-doc -y
    sudo systemctl restart ntpd
    sudo systemctl status ntpd
    sudo systemctl enable ntpd
-------------------------------------------------
####每個節點準備yum源
    刪除默認的源,國外的比較慢
    yum clean all
    mkdir -p /etc/yum.repos.d/bak
    mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
     
    下載阿里雲的base源和epel源
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all && yum makecache
    sudo yum -y install yum-plugin-priorities
    
####添加ceph源

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  

#MIMIC版V13.2.6 阿里源
# sudo vim /etc/yum.repos.d/ceph.repo  
                                                
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
priority=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
priority=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
priority=1
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc


####官方源
[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

####每個節點創建ceph用戶,設置sudo權限
    useradd -d /home/ceph -m ceph
    echo "ceph"|passwd --stdin ceph
    echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
    chmod 0440 /etc/sudoers.d/ceph
    sed -i s'/Defaults requiretty/Defaults requiretty'/g /etc/sudoers
 
####測試ceph的sudo權限
    su - ceph
    $ sudo su -

----

####配置相互間的ssh信任關係
    現在ceph-admin節點上產生公私鑰文件,然後將ceph-admin節點的.ssh目錄拷貝給其他節點
    [root@ceph-001 ~]su ceph
    [ceph@ceph-001 ~]$ ssh-keygen -t rsa    一路回車
    [ceph@ceph-001 ~]$ cd .ssh/
    [ceph@ceph-001 .ssh]$ ls
    id_rsa  id_rsa.pub
    [ceph@ceph-001 .ssh]$ cp id_rsa.pub authorized_keys 
    [ceph@ceph-001 .ssh]$ scp -r /home/ceph/.ssh ceph-001:/home/ceph/
    [ceph@ceph-001 .ssh]$ scp -r /home/ceph/.ssh ceph-002:/home/ceph/
    [ceph@ceph-001 .ssh]$ scp -r /home/ceph/.ssh ceph-003:/home/ceph/
     
    然後在各節點直接驗證ceph用戶下的ssh相互信任關係
    $ ssh -p22 ceph@ceph-001
    $ ssh -p22 ceph@ceph-002
    $ ssh -p22 ceph@ceph-003

###2)準備磁盤(ceph-001、ceph-002、ceph-003三個節點)

    測試時使用的磁盤不要太小,否則後面添加磁盤時會報錯,建議磁盤大小爲20G及以上。
    
    如下分別在三個節點掛載了一塊100G的裸盤
     
    檢查磁盤
    $ sudo fdisk -l /dev/sdb
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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
     
    格式化磁盤
    $ sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
    $ sudo mkfs.xfs /dev/sdb -f
     
    查看磁盤格式(xfs格式)
    $ sudo blkid -o value -s TYPE /dev/sdb
    
    今天在centos下用xfs格式化磁盤出現如下錯誤
    mkfs.xfs -f /dev/sdb
    時出現:
    mkfs.xfs: cannot open /dev/sdb: Device or resource busy
    重啓服務器後再格式化也一樣,也就是重啓服務器沒什麼用。
    用lsof查看是誰在佔用,也沒什麼效果。

    解決方法:
    [root@ceph-001 ~]# dmsetup ls
    ceph--b06e3709--9991--4ab9--94a6--cbf88d3b20e1-osd--block--a62a976e--764f--48ba--bf27--fb467f8cd608    (253:0)
    然後我們移除這個佔用
    [root@xiaohuai]# dmsetup remove ceph--b06e3709--9991--4ab9--94a6--cbf88d3b20e1-osd--block--a62a976e--764f--48ba--bf27--fb467f8cd608
    
###3)部署階段(ceph-admin節點上使用ceph-deploy快速部署)

[root@ceph-001 ~]su - ceph
      
####安裝ceph-deploy
[ceph@ceph-001 ~]$ sudo yum update -y && sudo yum install ceph-deploy -y
      
####創建cluster目錄
[ceph@ceph-001 ~]$ mkdir cluster
[ceph@ceph-001 ~]$ cd cluster/

[ceph@ceph-001 ~]$ sudo yum install python2-pip* -y
      
####創建集羣(後面填寫monit節點的主機名,這裏monit節點和管理節點是同一臺機器,即ceph-admin)
    [ceph@ceph-001 cluster]$ ceph-deploy new ceph-001 ceph-002 ceph-003
    
    [ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
    [ceph_deploy.cli][INFO  ] Invoked (1.5.39): /bin/ceph-deploy new ceph-001
    [ceph_deploy.cli][INFO  ] ceph-deploy options:
    [ceph_deploy.cli][INFO  ]  username                      : None
    [ceph_deploy.cli][INFO  ]  func                          : <function new at 0x7fe090f625f0>
    [ceph_deploy.cli][INFO  ]  verbose                       : False
    [ceph_deploy.cli][INFO  ]  overwrite_conf                : False
    [ceph_deploy.cli][INFO  ]  quiet                         : False
    [ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fe0906d7d88>
    [ceph_deploy.cli][INFO  ]  cluster                       : ceph
    [ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
    [ceph_deploy.cli][INFO  ]  mon                           : ['ceph-001']
    [ceph_deploy.cli][INFO  ]  public_network                : None
    [ceph_deploy.cli][INFO  ]  ceph_conf                     : None
    [ceph_deploy.cli][INFO  ]  cluster_network               : None
    [ceph_deploy.cli][INFO  ]  default_release               : False
    [ceph_deploy.cli][INFO  ]  fsid                          : None
    [ceph_deploy.new][DEBUG ] Creating new cluster named ceph
    [ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
    [ceph-001][DEBUG ] connection detected need for sudo
    [ceph-001][DEBUG ] connected to host: ceph-001 
    [ceph-001][DEBUG ] detect platform information from remote host
    [ceph-001][DEBUG ] detect machine type
    [ceph-001][DEBUG ] find the location of an executable
    [ceph-001][INFO  ] Running command: sudo /usr/sbin/ip link show
    [ceph-001][INFO  ] Running command: sudo /usr/sbin/ip addr show
    [ceph-001][DEBUG ] IP addresses found: [u'172.16.1.205']
    [ceph_deploy.new][DEBUG ] Resolving host ceph-001
    [ceph_deploy.new][DEBUG ] Monitor ceph-001 at 172.16.1.205
    [ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-001']
    [ceph_deploy.new][DEBUG ] Monitor addrs are ['172.16.1.205']
    [ceph_deploy.new][DEBUG ] Creating a random mon key...
    [ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
    [ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

####修改ceph.conf文件(注意:mon_host必須和public network 網絡是同網段內!)

[ceph@ceph-001 cluster]$ vim ceph.conf     #添加下面兩行配置內容

public network = 172.16.1.0/24
osd pool default size = 2                 #副本數(默認3個)
osd pool default min size = 1
osd pool default pg num = 32
osd pool default pgp num = 32
      
####安裝ceph(過程有點長,需要等待一段時間....)
[ceph@ceph-001 cluster]$ ceph-deploy install ceph-001 ceph-002 ceph-003
 或
 sudo yum -y install ceph ceph-radosgw
 
####配置初始monitor、並收集所有密鑰 
####初始化Monitor監視器節點,並收集所有密鑰
    [ceph@ceph-001 cluster]$ ceph-deploy mon create-initial
///    [ceph@ceph-001 cluster]$ ceph-deploy gatherkeys ceph-001

    [ceph@ceph-001 cluster]$sudo systemctl enable ceph-mon@ceph-001
    [ceph@ceph-001 cluster]$sudo systemctl start ceph-mon@ceph-001
    
####分發配置文件     
####用ceph-deploy把配置文件和admin密鑰拷貝到管理節點和Ceph節點(這樣你每次執行Ceph命令行時就無需指定monit節點地址和ceph.client.admin.keyring了)
    [ceph@ceph-001 cluster]$ ceph-deploy admin ceph-001 ceph-002 ceph-003
               
####配置mgr    
####自從ceph 12版本開始,manager是必須的,應該爲每個運行monitor的機器添加一個mgr,否則集羣處於WARN狀態。
####mimic 版 dashboard 安裝
1、添加mgr 功能
[ceph@ceph-001 cluster]$ ceph-deploy mgr create ceph-001 ceph-002 ceph-003

2、開啓dashboard 功能
[ceph@ceph-001 cluster]$ ceph mgr module enable dashboard

3、創建證書
[ceph@ceph-001 cluster]$ ceph dashboard create-self-signed-cert

$ openssl req -new -nodes -x509 \
  -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 \
  -keyout dashboard.key -out dashboard.crt -extensions v3_ca

$ ceph dashboard set-ssl-certificate -i dashboard.crt
$ ceph dashboard set-ssl-certificate-key -i dashboard.key
設置禁用SSL
$ ceph config set mgr mgr/dashboard/ssl false

$ ceph mgr module disable dashboard
$ ceph mgr module enable dashboard

4、創建 web 登錄用戶密碼(設置登錄憑證)
[ceph@ceph-001 cluster]$ ceph dashboard set-login-credentials guiji 123456

創建具有管理員角色的用戶:

$ ceph dashboard ac-user-create <username> <password> administrator

5、查看服務訪問方式
[ceph@ceph-001 cluster]$ ceph mgr services
6、在/etc/ceph/ceph.conf中添加
[mgr]
mgr modules = dashboard

7、設置dashboard的ip和端口
$ ceph config set mgr mgr/dashboard/server_addr 172.16.1.205
$ ceph config set mgr mgr/dashboard/server_port 7000
$ ceph config set mgr mgr/dashboard/ssl_server_port 8443
或者
$ ceph config-key set mgr/dashboard/server_addr 172.16.1.205
$ ceph config-key set mgr/dashboard/server_port 7000


####可以通過ceph mgr dump查看當前集羣在使用那幾個模塊(12的版本支持挺多的模塊,比如:dashboard,prometheus,restful,status,zabbix")
[ceph@ceph-001 cluster]$ ceph mgr dump
https://ceph-001:8443/

####也可以通過這個查看當前集羣是否支持dashboard
[root@ceph-1 ~]# ceph mgr module ls

####設置dashboard訪問地址和端口
ceph config-key set mgr/dashboard/server_addr 172.16.1.205          ////// server_addr爲有ceph-mgr進程的那臺機器的ip地址
ceph config-key set mgr/dashboard/server_port 7000                  /////server_port可以隨意設。這裏也7000爲例
 
####查看配置的狀態和參數和怎麼刪除上面設置
[root@ceph-1 ceph-ceph-1]# ceph config-key dump                     /////查看配置的狀態      
{
    "mgr/dashboard/server_addr": "172.16.1.205",
    "mgr/dashboard/server_port": "7000"
}
[root@ceph-1 ceph-ceph-1]# ceph config-key del mgr/dashboard/server_addr    ////刪除配置的參數

###查看端口是否設置成功

[root@ceph-1 ~]# netstat -tunlp|grep ceph-mgr|grep LISTEN
tcp        0      0 0.0.0.0:6804            0.0.0.0:*               LISTEN      9128/ceph-mgr       
tcp        0      0 172.16.1.205:7000        0.0.0.0:*               LISTEN      9128/ceph-mgr   

已經成功設置

設置完之後就重啓mgr服務

systemctl restart ceph-mgr@ceph-001

訪問dashboard
8、登錄:
https://172.16.1.205:7000       /////具體訪問地址根據自己的設定地址進行訪問

# 提示:當ceph-mgr發生故障,相當於整個ceph集羣都會出現嚴重問題,
# 建議在每個mon中都創建獨立的ceph-mgr(至少3個ceph mon節點),只需要在每個mon節點參考上面的方法進行創建即可(每個mgr需要不同的獨立命名)。 

# 關閉ceph-mgr的方式
shell> systemctl stop ceph-mgr@ceph-001

###配置osd節點 
###添加OSD到集羣
####檢查OSD節點上所有可用的磁盤
[ceph@ceph-001 cluster]$ ceph-deploy disk list ceph-001 ceph-002 ceph-003

ceph-deploy osd create --data /dev/sdb ceph-001
ceph-deploy osd create --data /dev/sdb ceph-002
ceph-deploy osd create --data /dev/sdb ceph-003
      
####使用zap選項刪除所有osd節點上的分區
ceph-deploy disk zap {osd-server-name}:{disk-name}
ceph-deploy disk zap osdserver1:sdb
[ceph@ceph-001 cluster]$ ceph-deploy disk zap ceph-001:/dev/sdb
[ceph@ceph-001 cluster]$ ceph-deploy disk zap ceph-002:/dev/sdb
[ceph@ceph-001 cluster]$ ceph-deploy disk zap ceph-003:/dev/sdb
   
####準備OSD(使用prepare命令)
[ceph@ceph-001 cluster]$ ceph-deploy osd prepare ceph-001:/dev/sdb ceph-002:/dev/sdb ceph-003:/dev/sdb
      
####激活OSD(注意由於ceph對磁盤進行了分區,/dev/sdb磁盤分區爲/dev/sdb1)
ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]
ceph-deploy osd activate osdserver1:/dev/sdb1:/dev/ssd1
ceph-deploy osd activate osdserver1:/dev/sdc1:/dev/ssd2
[ceph@ceph-001 cluster]$ ceph-deploy osd activate ceph-001:/dev/sdb1
[ceph@ceph-001 cluster]$ ceph-deploy osd activate ceph-002:/dev/sdb1
[ceph@ceph-001 cluster]$ ceph-deploy osd activate ceph-003:/dev/sdb1

####可能出現下面的報錯:(副本數大於OSD節點數導致)
    [ceph-node1][WARNIN] ceph_disk.main.Error: Error: /dev/sdb1 is not a directory or block device
    [ceph-node1][ERROR ] RuntimeError: command returned non-zero exit status: 1
    [ceph_deploy][ERROR ] RuntimeError: Failed to execute command: /usr/sbin/ceph-disk -v activate --mark-init systemd --mount /dev/sdb1

####在三個osd節點上通過命令已顯示磁盤已成功mount:
[ceph@ceph-node01 ~]$ lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0              11:0    1  4.2G  0 rom
    vda             252:0    0   70G  0 disk
    ├─vda1          252:1    0    1G  0 part /boot
    └─vda2          252:2    0   69G  0 part
      ├─centos-root 253:0    0 43.8G  0 lvm  /
      ├─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
      └─centos-home 253:2    0 21.4G  0 lvm  /home
    vdb             252:16   0   20G  0 disk
    ├─vdb1          252:17   0   15G  0 part /var/lib/ceph/osd/ceph-0       掛載成功
    └─vdb2          252:18   0    5G  0 part
         
    [ceph@ceph-node02 ~]$ lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0              11:0    1  4.2G  0 rom
    vda             252:0    0   70G  0 disk
    ├─vda1          252:1    0    1G  0 part /boot
    └─vda2          252:2    0   69G  0 part
      ├─centos-root 253:0    0 43.8G  0 lvm  /
      ├─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
      └─centos-home 253:2    0 21.4G  0 lvm  /home
    vdb             252:16   0   20G  0 disk
    ├─vdb1          252:17   0   15G  0 part /var/lib/ceph/osd/ceph-1        掛載成功
    └─vdb2          252:18   0    5G  0 part
         
    [ceph@ceph-node03 ~]$ lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0              11:0    1  4.2G  0 rom
    vda             252:0    0   70G  0 disk
    ├─vda1          252:1    0    1G  0 part /boot
    └─vda2          252:2    0   69G  0 part
      ├─centos-root 253:0    0 43.8G  0 lvm  /
      ├─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
      └─centos-home 253:2    0 21.4G  0 lvm  /home
    vdb             252:16   0   20G  0 disk
    ├─vdb1          252:17   0   15G  0 part /var/lib/ceph/osd/ceph-2       掛載成功
    └─vdb2          252:18   0    5G  0 part
     
####查看OSD:
    [ceph@ceph-001 cluster]$ ceph-deploy disk list ceph-001 ceph-002 ceph-003
    ........
    [ceph-node1][DEBUG ]  /dev/sdb2 ceph journal, for /dev/sdb1      如下顯示這兩個分區,則表示成功了
    [ceph-node1][DEBUG ]  /dev/sdb1 ceph data, active, cluster ceph, osd.0, journal /dev/sdb2
    ........
    [ceph-node3][DEBUG ]  /dev/sdb2 ceph journal, for /dev/sdb1       
    [ceph-node3][DEBUG ]  /dev/sdb1 ceph data, active, cluster ceph, osd.1, journal /dev/sdb2
    .......
    [ceph-node3][DEBUG ]  /dev/sdb2 ceph journal, for /dev/sdb1
    [ceph-node3][DEBUG ]  /dev/sdb1 ceph data, active, cluster ceph, osd.2, journal /dev/sdb2
         
     
####用ceph-deploy把配置文件和admin密鑰拷貝到管理節點和Ceph節點(這樣你每次執行Ceph命令行時就無需指定monit節點地址和ceph.client.admin.keyring了)
    [ceph@ceph-001 cluster]$ ceph-deploy admin ceph-001 ceph-002 ceph-003
         
    修改密鑰權限
    [ceph@ceph-001 cluster]$ sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
         
    檢查ceph狀態
    [ceph@ceph-001 cluster]$ sudo ceph health
    HEALTH_OK
    [ceph@ceph-001 cluster]$ sudo ceph -s
    cluster 33bfa421-8a3b-40fa-9f14-791efca9eb96
    health HEALTH_OK
    monmap e1: 1 mons at {ceph-001=172.16.1.205:6789/0}
          election epoch 3, quorum 0 ceph-001
    osdmap e14: 3 osds: 3 up, 3 in
           flags sortbitwise,require_jewel_osds
    pgmap v29: 64 pgs, 1 pools, 0 bytes data, 0 objects
         100 MB used, 45946 MB / 46046 MB avail
         64 active+clean
    
####查看ceph osd運行狀態
[ceph@ceph-001 ~]$ sudo ceph osd stat
     osdmap e19: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds
   
####查看osd的目錄樹
    [ceph@ceph-001 ~]$ sudo ceph osd tree
    ID WEIGHT  TYPE NAME           UP/DOWN REWEIGHT PRIMARY-AFFINITY
    -1 0.04376 root default                                       
    -2 0.01459     host ceph-node1                                
     0 0.01459         osd.0            up  1.00000          1.00000
    -3 0.01459     host ceph-node2                                
     1 0.01459         osd.1            up  1.00000          1.00000
    -4 0.01459     host ceph-node3                                
     2 0.01459         osd.2            up  1.00000          1.00000
   
####查看monit監控節點的服務情況
    [ceph@ceph-001 cluster]$ sudo systemctl status ceph-mon@ceph-001
    [ceph@ceph-001 cluster]$ ps -ef|grep ceph|grep 'cluster'
    ceph     28190     1  0 11:44 ?        00:00:01 /usr/bin/ceph-mon -f --cluster ceph --id ceph-001 --setuser ceph --setgroup ceph
        
    分別查看下ceph-node1、ceph-node2、ceph-node3三個節點的osd服務情況,發現已經在啓動中。
    [ceph@ceph-node1 ~]$ sudo systemctl status [email protected]         啓動是start、重啓是restart
    [ceph@ceph-node1 ~]$ sudo ps -ef|grep ceph|grep "cluster"
    ceph     28749     1  0 11:44 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
    ceph 29197 29051  0 11:54 pts/2    00:00:00 grep --color=auto cluster
      
    [ceph@ceph-node2 ~]$ sudo systemctl status [email protected]
    [ceph@ceph-node2 ~]$ sudo ps -ef|grep ceph|grep "cluster"
    ceph     28749     1  0 11:44 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
    ceph 29197 29051  0 11:54 pts/2    00:00:00 grep --color=auto cluster
      
    [ceph@ceph-node3 ~]$ sudo systemctl status [email protected]
    [ceph@ceph-node3 ~]$ sudo ps -ef|grep ceph|grep "cluster"
    ceph     28749     1  0 11:44 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
    ceph 29197 29051  0 11:54 pts/2    00:00:00 grep --color=auto cluster
    
    
###ceph pool常用命令
注:以下命令在root下運行沒有問題,如果ceph集羣用非root用戶部署,請加sudo

1、創建pool操作:
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
        [crush-ruleset-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num}  {pgp-num}   erasure \
        [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]

 這裏強制選擇pg_num和pgp_num,因爲ceph集羣不能自動計算pg數量。下面有一些官方建議的pg使用數量:

小於5個osd設置pg_num爲128
5到10個osd設置pg_num爲512
10到50個osd設置pg_num爲1024
如果超過50個osd你需要自己明白權衡點,並且能自行計算pg_num的數量
      pg_num通用計算方法
                 (OSDs * 100)
   Total PGs =  ------------
                  pool size
                  
$ ceph osd pool create cephfs_data <pg_num>
$ ceph osd pool create cephfs_metadata <pg_num>
注:確定 pg_num 取值是強制性的,因爲不能自動計算。下面是幾個常用的值:
    少於 5 個 OSD 時可把 pg_num 設置爲 128;
    OSD 數量在 5 到 10 個時,可把 pg_num 設置爲 512;
    OSD 數量在 10 到 50 個時,可把 pg_num 設置爲 4096;
    OSD 數量大於 50 時,你得理解權衡方法、以及如何自己計算 pg_num 取值;
    自己計算 pg_num 取值時可藉助 pgcalc 工具。

存儲池、歸置組和 CRUSH 配置參考¶
當你創建存儲池並給它設置歸置組數量時,如果你沒指定 Ceph 就用默認值。我們建議更改某些默認值,特別是存儲池的副本數和默認歸置組數量,可以在運行 pool 命令的時候設置這些值。你也可以把配置寫入 Ceph 配置文件的 [global] 段來覆蓋默認值。

[global]

    # By default, Ceph makes 3 replicas of objects. If you want to make four 
    # copies of an object the default value--a primary copy and three replica 
    # copies--reset the default values as shown in 'osd pool default size'.
    # If you want to allow Ceph to write a lesser number of copies in a degraded 
    # state, set 'osd pool default min size' to a number less than the
    # 'osd pool default size' value.

    osd pool default size = 4  # Write an object 4 times.
    osd pool default min size = 1 # Allow writing one copy in a degraded state.

    # Ensure you have a realistic number of placement groups. We recommend
    # approximately 100 per OSD. E.g., total number of OSDs multiplied by 100 
    # divided by the number of replicas (i.e., osd pool default size). So for
    # 10 OSDs and osd pool default size = 4, we'd recommend approximately
    # (100 * 10) / 4 = 250.

    osd pool default pg num = 250
    osd pool default pgp num = 250
2、在任意節點上查看集羣pools:

1)ceph osd lspools

2)rados lspools

3)ceph osd dump | grep -i pool

設置存儲池配額
存儲池配額可設置最大字節數、和/或每存儲池最大對象數。

ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
例如:

ceph osd pool set-quota data max_objects 10000

3、在任意node上刪除池

ceph osd pool delete ${poolname} ${poolname} --yes-i-really-really-mean-it

注:這裏防止誤刪,需要輸入兩次池名,必須使用參數--yes-i-really-really-mean-it

刪除 pool先在ceph.conf 增加下面:

mon_allow_pool_delete = true

並重啓ceph-mon:

sudo systemctl restart ceph-mon@ceph-001

重命名存儲池
要重命名一個存儲池,執行:

ceph osd pool rename {current-pool-name} {new-pool-name}

4、修改pool的pg_num,pgp_num

ceph osd pool set ${poolname} pg_num ${pg_num}

ceph osd pool set ${poolname} pgp_num ${pgp_num}

需要注意, pg_num只能增加, 不能縮小.
[ceph@ceph-001 cluster]$ sudo ceph osd pool set cephfs_data pg_num 64
Error EEXIST: specified pg_num 64 <= current 128

注:pg_num=pgp_num,當且僅當修改完pgp_num之後,pool中pg纔會有remap,backfill等操作

5、查看pool中所有對象

rados -p ${poolname} ls

注:查看對象所在osd可用命令 :  ceph osd map ${poolname} ${objname}

6、重命名pool

ceph osd pool rename ${poololdname} ${newpoolname}

7、設置pool副本數

ceph osd pool set {poolname} size {num}

8、設置degrade最小副本數

ceph osd pool set {poolname} min_size {num}

=============================================================================================================================================
=============================================================================================================================================

###4)創建文件系統

####先查看管理節點狀態,默認是沒有管理節點的。
[ceph@ceph-001 ~]$ ceph mds stat
e1:
  
####創建管理節點(ceph-admin作爲管理節點)。
需要注意:如果不創建mds管理節點,client客戶端將不能正常掛載到ceph集羣!!
[ceph@ceph-001 ~]$ pwd
/home/ceph
[ceph@ceph-001 ~]$ cd cluster/
[ceph@ceph-001 cluster]$ ceph-deploy mds create ceph-001 ceph-002 ceph-003
  
####再次查看管理節點狀態,發現已經在啓動中
    [ceph@ceph-001 cluster]$ ceph mds stat
    e2:, 1 up:standby
     
    [ceph@ceph-001 cluster]$ sudo systemctl status ceph-mds@ceph-001
    [ceph@ceph-001 cluster]$ ps -ef|grep cluster|grep ceph-mds
    ceph     29093     1  0 12:46 ?        00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id ceph-001 --setuser ceph --setgroup ceph
  
####創建pool,pool是ceph存儲數據時的邏輯分區,它起到namespace的作用
[ceph@ceph-001 cluster]$ ceph osd lspools                             #先查看pool
0 rbd,
  
####新創建的ceph集羣只有rdb一個pool。這時需要創建一個新的存儲池pool

示例:
[ceph@ceph-001 cluster]$ sudo ceph osd pool create cephfs_data 64         #後面的數字是PG的數量
pool 'cephfs_data' created
  
[ceph@ceph-001 cluster]$ sudo ceph osd pool create cephfs_metadata 64     #創建pool的元數據
pool 'cephfs_metadata' created
報錯處理:
[ceph@ceph-001 cluster]$ sudo ceph osd pool create cephfs_metadata 128
Error ERANGE:  pg_num 128 size 3 would mean 768 total pgs, which exceeds max 750 (mon_max_pg_per_osd 250 * num_in_osds 3)
[ceph@ceph-001 cluster]$ 
[ceph@ceph-001 cluster]$ sudo ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created

####用fs new 命令創建文件系統了: 
    [ceph@ceph-001 cluster]$ sudo ceph fs new mycephfs cephfs_metadata cephfs_data
    new fs with metadata pool 2 and data pool 1

####查看fs狀態
[ceph@ceph-001 cluster]$ sudo ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
####查看pool狀態
    [ceph@ceph-001 cluster]$ sudo ceph osd lspools
    0 rbd,1 cephfs_data,2 cephfs_metadata,
  
####檢查mds管理節點狀態(MDS服務器達到active狀態)
    [ceph@ceph-001 cluster]$ sudo ceph mds stat
    e5: 1/1/1 up {0=ceph-001=up:active}
  
####查看ceph集羣狀態
    [ceph@ceph-001 cluster]$ sudo ceph -s
    cluster 33bfa421-8a3b-40fa-9f14-791efca9eb96
    health HEALTH_OK
     monmap e1: 1 mons at {ceph-001=172.16.1.205:6789/0}
             election epoch 3, quorum 0 ceph-001
      fsmap e5: 1/1/1 up {0=ceph-001=up:active}           多了此行狀態
      osdmap e19: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds
      pgmap v48: 84 pgs, 3 pools, 2068 bytes data, 20 objects
        101 MB used, 45945 MB / 46046 MB avail
          84 active+clean
  
####查看ceph集羣端口
    [ceph@ceph-001 cluster]$ sudo lsof -i:6789
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    ceph-mon 28190 ceph   10u  IPv4  70217      0t0  TCP ceph-001:smc-https (LISTEN)
    ceph-mon 28190 ceph   19u  IPv4  70537      0t0  TCP ceph-001:smc-https->ceph-node1:41308 (ESTABLISHED)
    ceph-mon 28190 ceph   20u  IPv4  70560      0t0  TCP ceph-001:smc-https->ceph-node2:48516 (ESTABLISHED)
    ceph-mon 28190 ceph   21u  IPv4  70583      0t0  TCP ceph-001:smc-https->ceph-node3:44948 (ESTABLISHED)
    ceph-mon 28190 ceph   22u  IPv4  72643      0t0  TCP ceph-001:smc-https->ceph-001:51474 (ESTABLISHED)
    ceph-mds 29093 ceph    8u  IPv4  72642      0t0  TCP ceph-001:51474->ceph-001:smc-https (ESTABLISHED)

###5)client端掛載ceph存儲(採用fuse方式)

####安裝ceph-fuse(這裏的客戶機是ceph-client系統)
    [root@ceph-client ~]yum install -y ceph-fuse ceph
 
####創建掛載目錄
[root@ceph-client ~]mkdir /cephfs
 
####複製配置文件
    將ceph配置文件ceph.conf從管理節點copy到client節點(172.16.1.205爲管理節點)
    [root@ceph-client /]# yum install rsync -y 安裝rsync
    [root@ceph-001 /]# yum install rsync -y  安裝rsync
    [root@ceph-client ~]rsync -e "ssh -p22" -avpgolr [email protected]:/etc/ceph/ceph.conf /etc/ceph/
    或者
    [root@ceph-client ~]rsync -e "ssh -p22" -avpgolr [email protected]:/home/ceph/cluster/ceph.conf /etc/ceph/    兩個路徑下的文件內容一樣
     或者
    [ceph@ceph-001 ceph]$ scp -r ceph.conf [email protected]:/etc/ceph/
    
    複製密鑰
    將ceph的ceph.client.admin.keyring從管理節點copy到client節點
    [root@ceph-client ~]rsync -e "ssh -p22" -avpgolr [email protected]:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
    或者
    [root@ceph-client ~]rsync -e "ssh -p22" -avpgolr [email protected]:/home/ceph/cluster/ceph.client.admin.keyring /etc/ceph/
    或者
    [ceph@ceph-001 ceph]$ scp -r ceph.client.admin.keyring [email protected]:/etc/ceph/
    
####查看ceph授權
    [root@ceph-client ~]ceph auth list
        installed auth entries:
         
        mds.ceph-001
            key: AQAZZxdbH6uAOBAABttpSmPt6BXNtTJwZDpSJg==
            caps: [mds] allow
            caps: [mon] allow profile mds
            caps: [osd] allow rwx
        osd.0
            key: AQCuWBdbV3TlBBAA4xsAE4QsFQ6vAp+7pIFEHA==
            caps: [mon] allow profile osd
            caps: [osd] allow *
        osd.1
            key: AQC6WBdbakBaMxAAsUllVWdttlLzEI5VNd/41w==
            caps: [mon] allow profile osd
            caps: [osd] allow *
        osd.2
            key: AQDJWBdbz6zNNhAATwzL2FqPKNY1IvQDmzyOSg==
            caps: [mon] allow profile osd
            caps: [osd] allow *
        client.admin
            key: AQCNWBdbf1QxAhAAkryP+OFy6wGnKR8lfYDkUA==
            caps: [mds] allow *
            caps: [mon] allow *
            caps: [osd] allow *
        client.bootstrap-mds
            key: AQCNWBdbnjLILhAAT1hKtLEzkCrhDuTLjdCJig==
            caps: [mon] allow profile bootstrap-mds
        client.bootstrap-mgr
            key: AQCOWBdbmxEANBAAiTMJeyEuSverXAyOrwodMQ==
            caps: [mon] allow profile bootstrap-mgr
        client.bootstrap-osd
            key: AQCNWBdbiO1bERAARLZaYdY58KLMi4oyKmug4Q==
            caps: [mon] allow profile bootstrap-osd
        client.bootstrap-rgw
            key: AQCNWBdboBLXIBAAVTsD2TPJhVSRY2E9G7eLzQ==
            caps: [mon] allow profile bootstrap-rgw
 
 
####將ceph集羣存儲掛載到客戶機的/cephfs目錄下
    [root@ceph-client ~]ceph-fuse -m 172.16.1.205:6789 /cephfs
    2018-06-06 14:28:54.149796 7f8d5c256760 -1 init, newargv = 0x4273580 newargc=11
    ceph-fuse[16107]: starting ceph client
    ceph-fuse[16107]: starting fuse
     
    [root@ceph-client ~]df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_ceph-client02-lv_root
                           50G  3.5G   44G   8% /
    tmpfs                 1.9G     0  1.9G   0% /dev/shm
    /dev/vda1             477M   41M  412M   9% /boot
    /dev/mapper/vg_ceph-client02-lv_home
                           45G   52M   43G   1% /home
    /dev/sdb1              20G  5.1G   15G  26% /data/osd1
    ceph-fuse              45G  100M   45G   1% /cephfs
     
    由上面可知,已經成功掛載了ceph存儲,三個osd節點,每個節點有100G(在節點上通過"lsblk"命令可以查看ceph data分區大小),一共300G!
    
    sudo systemctl start ceph-fuse@/mnt.service

    sudo systemctl enable ceph-fuse@/mnt.service
 
####用內核驅動掛載 CEPH 文件系統
要掛載 Ceph 文件系統,如果你知道監視器 IP 地址可以用 mount 命令、或者用 mount.ceph 工具來自動解析監視器 IP 地址。例如:

sudo mkdir /mnt/mycephfs
sudo mount -t ceph 172.16.1.205:6789:/ /mnt/mycephfs
要掛載啓用了 cephx 認證的 Ceph 文件系統,你必須指定用戶名、密鑰。

sudo mount -t ceph 172.16.1.205:6789:/ /mnt/mycephfs -o name=admin,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
前述用法會把密碼遺留在 Bash 歷史裏,更安全的方法是從文件讀密碼。例如:

sudo mount -t ceph 172.16.1.205:6789:/ /mnt/mycephfs -o name=admin,secretfile=/etc/ceph/admin.secret 
 
####取消ceph存儲的掛載
[root@ceph-client ~]umount /cephfs
 
    溫馨提示:
    當有一半以上的OSD節點掛掉後,遠程客戶端掛載的Ceph存儲就會使用異常了,即暫停使用。比如本案例中有3個OSD節點,當其中一個OSD節點掛掉後(比如宕機),
    客戶端掛載的Ceph存儲使用正常;但當有2個OSD節點掛掉後,客戶端掛載的Ceph存儲就不能正常使用了(表現爲Ceph存儲目錄下的數據讀寫操作一直卡着狀態),
    當OSD節點恢復後,Ceph存儲也會恢復正常使用。OSD節點宕機重新啓動後,osd程序會自動起來(通過監控節點自動起來)
    
================================================================================================================================================
================================================================================================================================================

###6)塊存儲及塊設備命令

    rbd 命令可用於創建、羅列、內省和刪除塊設備映像,也可克隆映像、創建快照、回滾快照、查看快照等等。 rbd 命令用法詳情見 RBD – 管理 RADOS 塊設備映像。
    1. 創建pool
    $ sudo ceph osd pool create k8s-pool 32
    
    ceph osd pool application enable k8s-pool rbd
    2. 查看存儲池列表
    $ sudo ceph osd lspools
    
    
    3.創建塊設備鏡像
    要想把塊設備加入某節點,你得先在 Ceph 存儲集羣中創建一個映像,使用下列命令:
    
    rbd create --size {megabytes} {pool-name}/{image-name}
    rbd create foo --size 4096 --image-feature layering [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
    例如,要在 k8s這個存儲池中創建一個名爲 k8s-images 、大小爲 10GB 的映像,執行:
    
    sudo rbd create --size 10240 k8s-pool/k8s-images
    
    sudo rbd create --size 10240 k8s-images -p k8s-pool
    
    如果創建映像時不指定存儲池,它將使用默認的 rbd 存儲池。例如,下面的命令將默認在 rbd 存儲池中創建一個大小爲 1GB 、名爲 k8s-images 的映像:
    
    rbd create --size 10240 k8s-images
    
    Note 指定此存儲池前必須先創建它,詳情見存儲池。
    4. 查看塊設備鏡像
    rbd info {pool-name}/{image-name}
    
    5.將塊設備映射到系統內核
     rbd map {image-name}

     sudo rbd map k8s-pool/k8s-images
     
    取消映射:
    rbd unmap k8s-pool/k8s-images
      
    6. 格式化塊設備鏡像
      sudo mkfs.ext4 /dev/rbd/k8s-pool/k8s-images
      
    7. 掛載文件系統
     sudo mkdir /mnt/ceph-block-device
     sudo chmod 777 /mnt/ceph-block-device
     sudo mount /dev/rbd/k8s-pool/k8s-images /mnt/ceph-block-device
     cd /mnt/ceph-block-device
    8.卸載文件系統
      sudo ceph unmap /dev/rbd0
    
    羅列塊設備映像
    要列出 rbd 存儲池中的塊設備,可以用下列命令(即 rbd 是默認存儲池名字):
    
    rbd ls
    用下列命令羅列某個特定存儲池中的塊設備,用存儲池的名字替換 {poolname} :
    
    rbd ls {poolname}
    例如:
    rbd ls k8s-pool
    
    檢索映像信息
    用下列命令檢索某個特定映像的信息,用映像名字替換 {image-name} :
    
    rbd info {image-name}
    例如:
    
    rbd info k8s-images
    用下列命令檢索某存儲池內的映像的信息,用映像名字替換 {image-name} 、用存儲池名字替換 {pool-name} :
    
    rbd info {pool-name}/{image-name}
    例如:
    
    rbd info k8s-pool/k8s-images
    調整塊設備映像大小
    Ceph 塊設備映像是精簡配置,只有在你開始寫入數據時它們纔會佔用物理空間。然而,它們都有最大容量,就是你設置的 --size 選項。
    如果你想增加(或減小) Ceph 塊設備映像的最大尺寸,執行下列命令:
    
    rbd resize --size 2048 k8s-images                 #增加設備映像(to increase)
    rbd resize --size 2048 k8s-images --allow-shrink  #減小設備映像(to decrease)
    
    刪除塊設備映像
    可用下列命令刪除塊設備,用映像名字替換 {image-name} :
    rbd rm {image-name}
    
    例如:
    rbd rm k8s-images
    
    用下列命令從某存儲池中刪除一個塊設備,用要刪除的映像名字替換 {image-name} 、用存儲池名字替換 {pool-name} :
    rbd rm {pool-name}/{image-name}
    例如:
    rbd rm k8s-pool/k8s-images

===============================其他記錄==========================================
----
###清除ceph存儲
####清除安裝包
    [ceph@ceph-001 ~]$ ceph-deploy purge ceph-001 ceph-002 ceph-003
      
    清除配置信息
    [ceph@ceph-001 ~]$ ceph-deploy purgedata ceph-001 ceph-002 ceph-003
    [ceph@ceph-001 ~]$ ceph-deploy forgetkeys
      
    每個節點刪除殘留的配置文件
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/osd/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/mon/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/mds/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/bootstrap-mds/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/bootstrap-osd/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/bootstrap-mon/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/lib/ceph/tmp/*
    [ceph@ceph-001 ~]$ sudo rm -rf /etc/ceph/*
    [ceph@ceph-001 ~]$ sudo rm -rf /var/run/ceph/*
     
    -----------------------------------------------------------------------
    查看ceph命令,關於ceph osd、ceph mds、ceph mon、ceph pg的命令
    [ceph@ceph-001 ~]$ ceph --help             
 
-----------------------------------------------------------------------
####如下報錯:
    [ceph@ceph-001 ~]$ ceph osd tree
    2018-06-06 14:56:27.843841 7f8a0b6dd700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory
    2018-06-06 14:56:27.843853 7f8a0b6dd700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
    2018-06-06 14:56:27.843854 7f8a0b6dd700  0 librados: client.admin initialization error (2) No such file or directory
    Error connecting to cluster: ObjectNotFound
    [ceph@ceph-001 ~]$ ceph osd stat
    2018-06-06 14:55:58.165882 7f377a1c9700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory
    2018-06-06 14:55:58.165894 7f377a1c9700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
    2018-06-06 14:55:58.165896 7f377a1c9700  0 librados: client.admin initialization error (2) No such file or directory
     
####解決辦法:
    [ceph@ceph-001 ~]$ sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
     
    [ceph@ceph-001 ~]$ ceph osd stat
         osdmap e35: 3 osds: 3 up, 3 in
                flags sortbitwise,require_jewel_osds
    [ceph@ceph-001 ~]$ ceph osd tree
    ID WEIGHT  TYPE NAME           UP/DOWN REWEIGHT PRIMARY-AFFINITY
    -1 0.04376 root default                                         
    -2 0.01459     host ceph-node1                                  
     0 0.01459         osd.0            up  1.00000          1.00000
    -3 0.01459     host ceph-node2                                  
     1 0.01459         osd.1            up  1.00000          1.00000
    -4 0.01459     host ceph-node3                                  
     2 0.01459         osd.2            up  1.00000          1.00000
 
###常用操作
####ceph reset
ceph-deploy purge 節點1 節點2 ....
ceph-deploy purgedata 節點1 節點2 ....
ceph-deploy forgetkeys
####常用命令
rados lspools 查看池子

ceph -s 或 ceph status 查看集羣狀態

ceph -w 觀察集羣健康狀態

ceph quorum_status --format json-pretty 檢查ceph monitor仲裁狀態

ceph df 檢查集羣使用情況

ceph mon stat 檢查monitor狀態

ceph osd stat 檢查osd狀態

ceph pg stat 檢查pg配置組狀態

ceph pg dump 列出PG

ceph osd lspools 列出存儲池

ceph osd tree 檢查osd的crush map

ceph auth list 列出集羣的認證密鑰

ceph 獲取每個osd上pg的數量


###Ceph -s集羣報錯too many PGs per OSD

集羣狀態報錯,如下:
# ceph -s
    cluster 1d64ac80-21be-430e-98a8-b4d8aeb18560
     health HEALTH_WARN     <-- 報錯的地方
            too many PGs per OSD (912 > max 300)
     monmap e1: 1 mons at {node1=109.105.115.67:6789/0}
            election epoch 4, quorum 0 node1
     osdmap e49: 2 osds: 2 up, 2 in
            flags sortbitwise,require_jewel_osds
      pgmap v1256: 912 pgs, 23 pools, 4503 bytes data, 175 objects
            13636 MB used, 497 GB / 537 GB avail
                 912 active+clean
分析
問題原因是集羣osd 數量較少,在我的測試過程中,由於搭建rgw網關、和OpenStack集成等,創建了大量的pool,每個pool要佔用一些pg ,ceph集羣默認每塊磁盤都有默認值,
好像每個osd 爲300個pgs,不過這個默認值是可以調整的,但調整得過大或者過小都會對集羣的性能產生一定影響。因爲我們這個是測試環境,只要能消除掉報錯即可。
查詢當前每個osd下最大的pg報警值:

$ ceph --show-config  | grep mon_pg_warn_max_per_osd

mon_pg_warn_max_per_osd = 300
解決方案
在配置文件中,調大集羣的此選項的告警閥值;方法如下,在mon節點的ceph.conf(/etc/ceph/ceph.conf)配置文件中添加:

$ vi /etc/ceph/ceph.conf
[global]
.......
mon_pg_warn_max_per_osd = 1000
重啓monitor服務:

$ systemctl restart ceph-mon.target
再次查看ceph集羣狀態。

$ ceph -s

cluster 1d64ac80-21be-430e-98a8-b4d8aeb18560
 health HEALTH_OK
 monmap e1: 1 mons at {node1=109.105.115.67:6789/0}
        election epoch 6, quorum 0 node1
 osdmap e49: 2 osds: 2 up, 2 in
        flags sortbitwise,require_jewel_osds
  pgmap v1273: 912 pgs, 23 pools, 4503 bytes data, 175 objects
        13636 MB used, 497 GB / 537 GB avail
             912 active+clean

====================================================================================================================
====================================================================================================================
####安裝CEPH對象網關
網關服務器:ceph-001 172.16.1.205

1. 創建ceph mds
####在你的管理節點的工作目錄下,給 Ceph 對象網關節點安裝Ceph對象所需的軟件包。例如:

[ceph@ceph-001 cluster]$ceph-deploy install --rgw ceph-001

####ceph-common 包是它的一個依賴性,所以 ceph-deploy 也將安裝這個包。 ceph 的命令行工具就會爲管理員準備好。
爲了讓你的 Ceph 對象網關節點成爲管理節點,可以在管理節點的工作目錄下執行以下命令:
[ceph@ceph-001 cluster]$ceph-deploy admin <node-name>

2. 創建對象網關實例
Ceph 對象存儲使用 Ceph 對象網關守護進程( radosgw ,RGW),內嵌了Civetweb服務器與FastCGI 模塊。
其中Civetweb服務器默認使用tcp 7480端口。
1)變更默認端口(option)
# 變更Civetweb服務器默認端口,可修改ceph.conf文件,增加[client.rgw.<GATEWAY-NODE>]字段,其中“GATEWAY-NODE”爲所在網關節點的短主機名,即:hostname -s;
# 可在部署服務器修改後分發到各網關節點,也可在各網關節點獨立修改;
# [client.rgw.<GATEWAY-NODE>]字段與[global]字段在相同層級,且1個網關節點使用1個字段,其中”client”表示客戶端配置,“rgw”表示客戶端類型,“GATEWAY-NODE”標識實例名;
[ceph@ceph-001 cephcluster]$ cat ceph.conf 
[client.rgw.ceph=001]
rgw_frontends = "civetweb port=80"
[client.rgw.ceph-002]
rgw_frontends = "civetweb port=80"
[client.rgw.ceph-003]
rgw_frontends = "civetweb port=80" 

# 從部署服務器分發ceph.conf
[cephde@ceph01 cephcluster]$ ceph-deploy --overwrite-conf config push ceph-001 ceph-002 ceph-003

2)創建實例
####新建網關實例
# 創建後,在各網關節點對應的守護進程啓動;
# 如果ceph.conf配置文件變更,可在對應節點重啓服務
在你的管理節點的工作目錄下,使用命令在 Ceph 對象網關節點上新建一個 Ceph對象網關實例。舉例如下:

[ceph@ceph-001 cluster]$ceph-deploy rgw create ceph-001

# 查看服務
[ceph@ceph-001 ~]# systemctl status [email protected]

# 重啓服務
[ceph@ceph-001 ~]# systemctl restart [email protected]

# 查看端口
[ceph@ceph01 ~]# netstat -tunlp | grep radosgw

# 創建實例後,同時創建部分默認pool;
# 或:”rados df” 與 “ceph osd pool ls”
[ceph@ceph-001 ~]# ceph osd lspools

3)訪問
# 格式:http://RGW-IP:port 
[ceph@ceph-001 ~]# curl http://172.16.1.205
# 如果網關實例正常運行,響應如下:
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
        <ID>anonymous</ID>
        <DisplayName></DisplayName>
    </Owner>
    <Buckets>
    </Buckets>
</ListAllMyBucketsResult>

三.驗證
使用REST接口驗證,步驟如下:

首先創建適用於s3接口的ceph對象網關用戶;
基於已創建的用戶,創建適用於swift接口的子用戶;
驗證用戶是否能訪問網關。
1. 創建用戶
1)創建用於S3訪問的RADOSGW用戶
# “--uid”與“--display-name”自定義;
# 返回結果中,keys->access_key 與 keys->secret_key 是訪問驗證時需要的值

$ radosgw-admin user create --uid="gwuser" --display-name="Gw User"

[ceph@ceph-001 cluster]$ radosgw-admin user create --uid="gwuser" --display-name="Gw User" --system
{
    "user_id": "gwuser",
    "display_name": "Gw User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "gwuser",
            "access_key": "Q8C9P5WL117MEASJK03M",
            "secret_key": "ghb6jflmbkR9j6zInaX3O9Tz0mFOZuXaWvBoGX5E"
        }
    ],
    "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",
    "mfa_ids": []
}

[ceph@ceph-001 cluster]$ radosgw-admin user info --uid=gwuser


2)創建SWITF用戶
Swift用戶創建分兩步:

創建子用戶;
生成祕鑰。
# 創建子用戶,基於已創建的s3用戶;
# 賦予全權限
[ceph@ceph-001 cluster]$ radosgw-admin subuser create --uid=gwuser --subuser=gwuser:swift --access=full
{
    "user_id": "gwuser",
    "display_name": "Gw User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [
        {
            "id": "gwuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "gwuser",
            "access_key": "Q8C9P5WL117MEASJK03M",
            "secret_key": "ghb6jflmbkR9j6zInaX3O9Tz0mFOZuXaWvBoGX5E"
        }
    ],
    "swift_keys": [
        {
            "user": "gwuser:swift",
            "secret_key": "VxgDAOcgUvhxDf2pQ4F3cDlVnFAEOjVJlQZxVo6Y"
        }
    ],
    "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",
    "mfa_ids": []
}

# 生成祕鑰;
# 返回結果中,swift_keys ->secret_key 是訪問驗證時需要的值
[ceph@ceph-001 cluster]$ radosgw-admin key create --subuser=gwuser:swift --key-type=swift --gen-secret
{
    "user_id": "gwuser",
    "display_name": "Gw User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [
        {
            "id": "gwuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
            "user": "gwuser",
            "access_key": "Q8C9P5WL117MEASJK03M",
            "secret_key": "ghb6jflmbkR9j6zInaX3O9Tz0mFOZuXaWvBoGX5E"
        }
    ],
    "swift_keys": [
        {
            "user": "gwuser:swift",
            "secret_key": "pPJGvSxfWvfjXLghNbBsNMb1pVPsFEDpe1wTgXTH"
        }
    ],
    "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",
    "mfa_ids": []
}

2. 訪問驗證
1)測試S3訪問
測試採用python腳本完成,腳本流程如下:測試腳本連接radosgw,創建bucket,list bucket。

# 客戶端需要安裝python-boto
[root@ceph-client ~]# yum install -y python-boto

# 編輯測試腳本;
# 注意”access_key”,”secret_key”,”host”與”port”值修改
[root@ceph-client ~]# vim s3.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#新建一個連接
import boto
import boto.s3.connection

access_key = 'Q8C9P5WL117MEASJK03M'
secret_key = 'ghb6jflmbkR9j6zInaX3O9Tz0mFOZuXaWvBoGX5E'

conn = boto.connect_s3(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        host='172.16.1.205', port=80,
        is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
       )
#新建一個 BUCKET
bucket = conn.create_bucket('myfs-bucket')

#列出用戶的所有 BUCKET
for bucket in conn.get_all_buckets():
    print "{name}\t{created}".format(
        name=bucket.name,
        created=bucket.creation_date,
)

#列出 BUCKET 的內容
for key in bucket.list():
        print "{name}\t{size}\t{modified}".format(
                name = key.name,
                size = key.size,
                modified = key.last_modified,
                )
                
#刪除 BUCKET
//conn.delete_bucket(bucket.name)

#新建一個對象(下面的代碼會新建一個內容是字符串``”Hello World!”`` 的文件 hello.txt。)

key = bucket.new_key('hello.txt')
key.set_contents_from_string('Hello World!')

#修改一個對象的 ACL(下面的代碼會將對象 hello.txt 的權限變爲公開可讀,而將 secret_plans.txt 的權限設爲私有。)

hello_key = bucket.get_key('hello.txt')
hello_key.set_canned_acl('public-read')
plans_key = bucket.get_key('secret_plans.txt')
plans_key.set_canned_acl('private')
#下載一個對象 (到文件)下面的代碼會下載對象 perl_poetry.pdf 並將它存到位置 C:\Users\larry\Documents

key = bucket.get_key('perl_poetry.pdf')
key.get_contents_to_filename('/home/larry/documents/perl_poetry.pdf')

#刪除一個對象
下面的代碼會刪除對象 goodbye.txt

bucket.delete_key('goodbye.txt')

#生成對象的下載 URLS (帶簽名和不帶簽名)
//下面的代碼會爲 hello.txt 生成一個無簽名爲下載URL。 這個操作是生效是因爲前面我們已經設置 hello.txt 的 ACL 爲公開可讀。
//下面的代碼同時會爲 secret_plans.txt 生成一個有效時間是一個小時的帶簽名的下載 URL。帶簽名的下載 URL 在這個時間內是可用的,
//即使對象的權限是私有(當時間到期後 URL 將不可用)。

hello_key = bucket.get_key('hello.txt')
hello_url = hello_key.generate_url(0, query_auth=False, force_http=True)
print hello_url

plans_key = bucket.get_key('secret_plans.txt')
plans_url = plans_key.generate_url(3600, query_auth=True, force_http=True)
print plans_url

#輸出形式類似下面這樣:

http://objects.dreamhost.com/my-bucket-name/hello.txt
http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX

# 運行腳本,返回結果符合預期
[root@ceph-client ~]# python s3.py
 

2)測試Swift訪問
測試採用swift客戶端進行。

# 安裝swift客戶端
[root@ceph-client ~]# yum install python-setuptools
[root@ceph-client ~]# easy_install pip
[root@ceph-client ~]# pip install --upgrade setuptools
[root@ceph-client ~]# pip install --upgrade python-swiftclient

# 命令格式:swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U USER:swift -K '{swift_secret_key}' list;
# 這裏基於s3測試生成的bucket,list bucker,返回結果符合預期
[root@ceph-client ~]# swift -A http://172.16.1.205/auth/1.0 -U gwuser:swift -K 'pPJGvSxfWvfjXLghNbBsNMb1pVPsFEDpe1wTgXTH' list


###PYTHON SWIFT 實例

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#新建連接

import swiftclient
user = 'account_name:username'
key = 'your_api_key'

conn = swiftclient.Connection(
        user=user,
        key=key,
        authurl='https://objects.dreamhost.com/auth',
)
#創建容器 (下面創建一個名爲 my-new-container 的新容器:)

container_name = 'my-new-container'
conn.put_container(container_name)

#創建對象 (下面從名爲 my_hello.txt 的本地文件創建一個名爲 hello.txt 的文件:)

with open('my_hello.txt', 'r') as hello_file:
        conn.put_object(container_name, 'hello.txt',
                        contents=hello_file.read(),
                        content_type='text/plain')
                        
#羅列自己擁有的容器(下面獲取你擁有的容器列表,並打印容器名:)

for container in conn.get_account()[1]:
        print container['name']
//其輸出大致如此:
mahbuckat1
mahbuckat2
mahbuckat3

#羅列一容器的內容(獲取容器中對象的列表,並打印各對象的名字、文件尺寸、和最後修改時間:)

for data in conn.get_container(container_name)[1]:
        print '{0}\t{1}\t{2}'.format(data['name'], data['bytes'], data['last_modified'])
        
//其輸出大致如此:

myphoto1.jpg 251262  2011-08-08T21:35:48.000Z
myphoto2.jpg 262518  2011-08-08T21:38:01.000Z

#檢索一個對象 (下載對象 hello.txt 並保存爲 ./my_hello.txt :)

obj_tuple = conn.get_object(container_name, 'hello.txt')
with open('my_hello.txt', 'w') as my_hello:
        my_hello.write(obj_tuple[1])
        
#刪除對象 (刪除對象 goodbye.txt :)

conn.delete_object(container_name, 'hello.txt')

#刪除一個容器 (Note 容器必須是空的!否則請求不會成功!)

conn.delete_container(container_name)

[ceph@ceph-001 cluster]$ ceph dashboard set-rgw-api-access-key Q8C9P5WL117MEASJK03M
Option RGW_API_ACCESS_KEY updated
[ceph@ceph-001 cluster]$ ceph dashboard set-rgw-api-access-key ghb6jflmbkR9j6zInaX3O9Tz0mFOZuXaWvBoGX5E
Option RGW_API_ACCESS_KEY updated

[ceph@ceph-001 cluster]$ ceph dashboard set-rgw-api-host 172.16.1.205
Option RGW_API_HOST updated
[ceph@ceph-001 cluster]$ ceph dashboard set-rgw-api-port 80
Option RGW_API_PORT updated

####在網關服務成功運行後,你可以使用未經授權的請求來訪問端口 7480 ,就像這樣:
http://ceph-001:7480

http://172.16.1.205:7480

如果網關實例工作正常,你接收到的返回信息大概如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
       <Owner>
       <ID>anonymous</ID>
       <DisplayName></DisplayName>
   </Owner>
   <Buckets>
   </Buckets>
</ListAllMyBucketsResult>

###在任何時候如果你遇到麻煩,而你也想重新來一次,執行下面的命令來清除配置:

ceph-deploy purge <gateway-node1> [<gateway-node2>]
ceph-deploy purgedata <gateway-node1> [<gateway-node2>]

注:如果你執行了 purge, 你必須重新安裝 Ceph.

####修改默認端口
Civetweb 默認運行在端口 7480 之上.。如果想修改這個默認端口 (比如使用端口 80),修改你的管理節點的工作目錄下的 Ceph 配置文件。
 添加一節,以 [client.rgw.<gateway-node>] 作爲名字,使用你的 Ceph 對象網關節點的短主機名替換其中的 <gateway-node> (如, hostname -s).

Note 在 0.94 版本中,Ceph 對象網關不再支持 SSL。你可以設置一個支持 SSL 的反向代理服務器來將 HTTPS 請求轉爲HTTP請求發給 CivetWeb。
比如, 如果你的主機名是 gateway-node1, 在 [global] 節後添加的節名如下:

[client.rgw.gateway-node1]
rgw_frontends = "civetweb port=80"

Note 請確保在 rgw_frontends 的鍵值對中 port=<port-number> 內部沒有紅格。 節名 [client.rgw.gateway-node1] 表示接下來的 Ceph 配置文件配置了一個 Ceph 存儲集羣的客戶端,
這個客戶端的類型是Ceph 對象網關存儲 (比如, rgw), 同時實例名是 gateway-node1.
將該配置文件推送到你的 Ceph 對象網關節點(也包括其他 Ceph 節點):

ceph-deploy --overwrite-conf config push <gateway-node> [<other-nodes>]

ceph-deploy --overwrite-conf config push ceph-001 ceph-002 ceph-003

爲了使新配置的端口生效,需要重啓 Ceph 對象網關:

sudo systemctl restart ceph-radosgw.service

最後,需要確保你選擇的端口在節點的防火牆配置中是開放的 (比如, 端口 80)。 如果它不是開放的,將它設爲開放並重啓防火牆。 如果你是用的是 firewald,執行下面的命令:

sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
sudo firewall-cmd --reload
如果你使用 iptables, 執行:
sudo iptables --list
sudo iptables -I INPUT 1 -i <iface> -p tcp -s <ip-address>/<netmask> --dport 80 -j ACCEPT
替換其中的 <iface> and <ip-address>/<netmask> 爲你的 Ceph 對象網關節點的實際值。
一旦你完成了 iptables 的配置, 請確保你已經將本次更改持久化,這樣它在你的 Ceph 對象網關節點重啓也依然生效。持久化請執行:
sudo apt-get install iptables-persistent
會有一個終端界面彈出。選擇 yes 來保存當前 IPv4 的 iptables 規則到文件 /etc/iptables/rules.v4 中,當前的 IPv6 iptables 規則到文件 /etc/iptables/rules.v6 中。
在前面一步設置的 IPv4 iptables規則t將會被寫入文件``/etc/iptables/rules.v4`` ,這樣就實現了持久化,重啓也依然生效。
如果你在安裝``iptables-persistent`` 後有新增了新的 IPv4 iptables 規則,你需要使用 root 執行下面的命令:
iptables-save > /etc/iptables/rules.v4
從 APACHE 遷移到 CIVETWEB
如果你在0.80或以上版本的 Ceph 存儲上使用 Apache 和 FastCGI 來構建 Ceph 對象網關,實際上你已經運行了 Civetweb –它隨着 ceph-radosgw 進程啓動而啓動,
默認情況下運行在 7480 端口,因此它不會跟基於 Apache 和 FastCGI 安裝的以及其他常用的web服務所使用的端口衝突。遷移到使用 Civetweb 首先需要刪除您的 Apache。
然後,您必須從 Ceph 配置文件中刪除 Apache 和 FastCGI 的設置並重置 rgw_frontends 到 Civetweb。

回顧使用 ceph-deploy 來安裝 Ceph 對象網關的描述,注意到它的配置文件只有一個名爲 rgw_frontends 的設置(這是假設你選擇改變默認端口)。
ceph-deploy 會生成對象網關的數據目錄和 keyring,並將keyring放在 /var/lib/ceph/radosgw/{rgw-intance} 目錄下。
從這個目錄上看這個守護進程是在默認位置,然而你也可以在 Ceph 配置文件中指定不同的位置。
因爲你已經有密鑰和數據目錄,因此如果你使用的是默認路徑之外的其他目錄,你就需要在 Ceph 配置文件中維護這些路徑。

一個典型的基於Apache部署的Ceph對象網關配置文件類似下面的樣例:

在 Red Hat Enterprise Linux 系統上:

[client.radosgw.gateway-node1]
host = {hostname}
keyring = /etc/ceph/ceph.client.radosgw.keyring
rgw socket path = ""
log file = /var/log/radosgw/client.radosgw.gateway-node1.log
rgw frontends = fastcgi socket\_port=9000 socket\_host=0.0.0.0
rgw print continue = false
在 Ubuntu 系統上:

[client.radosgw.gateway-node]
host = {hostname}
keyring = /etc/ceph/ceph.client.radosgw.keyring
rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
log file = /var/log/radosgw/client.radosgw.gateway-node1.log
爲了能夠使用 Civetweb,需要做一點修改,簡單地刪除 Apache 特有的設置如 rgw_socket_path 和 rgw_print_continue 。然後,
改變 rgw_frontends 的設置來指向 Civetweb 而不是 Apache FastCGI 作爲前端,並指定您想要使用的端口號。例如:

[client.radosgw.gateway-node1]
host = {hostname}
keyring = /etc/ceph/ceph.client.radosgw.keyring
log file = /var/log/radosgw/client.radosgw.gateway-node1.log
rgw_frontends = civetweb port=80
最後,重啓 Ceph 對象網關。在 Red Hat Enterprise Linux 請執行:

sudo systemctl restart ceph-radosgw.service
在 Ubuntu 上執行:

sudo service radosgw restart id=rgw.<short-hostname>
如果你使用的端口還沒有在防護牆端放開,你還需要在你的防火牆開放該端口。

配置 BUCKET SHARDING
Ceph 對象網關在 index_pool 中存儲 bucket 的索引數據,默認情況下是資源池 .rgw.buckets.index 。有時用戶喜歡把很多對象(幾十萬到上百萬的對象)存放到同一個 bucket 中。
如果你不使用網關的管理接口來爲每個 bucket 的最大對象數設置配額,那麼當一旦用戶存放大量的對象到一個 bucket 中時,bucket 索引的性能會呈現明顯的下降。

在0.94版本的 Ceph 中,您可以給 bucket 索引進行分片,這樣在你允許 bucket 中有大量對象時,能夠有助於防止出現性能瓶頸。
設置項的 “rgw_override_bucket_index_max_shards“ 允許您設置一個 bucket 的最大分片數。它的默認值爲 0 ,這意味着 bucket 索引分片功能在默認情況下情況下是關閉的。

開啓 bucket 的索引分片功能,只需給 rgw_override_bucket_index_max_shards 設置一個大於 0 的值。

簡單的配置,只需要在 Ceph 配置文件中加入 rgw_override_bucket_index_max_shards 。將其添加在 [global] 部分來設置一個系統層面生效的值。你也可以在 Ceph 配置文件中將它設置爲某一個實例生效。

一旦你在 Ceph 配置文件中修改了你的bucket分片設置,你需要重啓網關。在 Red Hat Enterprise Linux 請執行:

sudo systemctl restart ceph-radosgw.service
在 Ubuntu 上請執行:

sudo service radosgw restart id=rgw.<short-hostname>
對於異地場景的配置而言,爲了災備每一個 zone 都有一個不同的 index_pool 設置。爲了保持這個參數在一個 region 的所有 zone 中保持一致,
你可以在 region 的網關配置中指定 rgw_override_bucket_index_max_shards 。舉例如下:

radosgw-admin region get > region.json
打開 region.json 的文件,爲每一個 zone 編輯 bucket_index_max_shards 的設置。保存 region.json 文件並重置 region。舉例如下:

radosgw-admin region set < region.json
一旦你更新了你的 region,你需要更新 region map。舉例如下:

radosgw-admin regionmap update --name client.rgw.ceph-client
其中的 client.rgw.ceph-client 是網關用戶的名字。

Note 通過 CRUSH 規則集將索引資源池 (如果可以爲每一個zone設置) 映射到基於 SSD的 OSD 上也能夠提升 bucket 索引的性能。
給 DNS 添加泛域名解析
爲了通過 S3 風格的子域名來使用 Ceph(如:bucket-name.domain-name.com),你應該給你的 ceph-radosgw 守護進程所在服務器在 DNS 服務器上給它的 DNS 記錄添加泛域名解析。

這個 DNS 地址也必須在 Ceph 配置文件中通過 rgw dns name = {hostname} 設置項來指定。

對於 dnsmasq 而言,通過在主機名前添加點號 (.) 來實現添加 DNS 地址設置:

address=/.{hostname-or-fqdn}/{host-ip-address}
舉例如下:

address=/.gateway-node1/192.168.122.75
對於 bind 而言,給 DNS 記錄添加一個泛域名解析。舉例如下:

$TTL    604800
@       IN      SOA     gateway-node1. root.gateway-node1. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      gateway-node1.
@       IN      A       192.168.122.113
*       IN      CNAME   @
重啓你的 DNS 服務,然後使用子域名 ping 你的服務器來確保你的 ceph-radosgw 進程能夠出來子域名請求:

ping mybucket.{hostname}
舉例如下:

ping mybucket.gateway-node1
開啓 DEBUGGING (如果需要)
一旦你完成了安裝過程,如果在你的配置下遇到了問題,你可以在 Ceph 配合文件的 [global] 小節下面添加調試選項,然後重啓網關服務,進而幫助解決配置過程出現的問題。例如:

[global]
#append the following in the global section.
debug ms = 1
debug rgw = 20
使用網關
爲了使用 REST 接口,首先需要爲S3接口創建一個初始 Ceph 對象網關用戶。然後,爲 Swift 接口創建一個子用戶。然後你需要驗證創建的用戶是否能夠訪問網關。

爲 S3 訪問創建 RADOSGW 用戶
一個``radosgw`` 用戶需要被新建並被分配權限。命令 man radosgw-admin 會提供該命令的額外信息。

爲了新建用戶,在 gateway host 上執行下面的命令:

sudo radosgw-admin user create --uid="testuser" --display-name="First User"
命令的輸出跟下面的類似:

{
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [{
                "user": "testuser",
                "access_key": "I0PJDPCIYZ665MW88W9R",
                "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
        }],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "user_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "temp_url_keys": []
}
Note 其中 keys->access_key 和``keys->secret_key`` 的值在訪問的時候需要用來做驗證
Important 請檢查輸出的 key。有個時候 radosgw-admin 會在生成的JSON 中的 access_key 和和 secret_key 部分包含有轉義字符 \ ,
並且一些客戶端不知道如何處理 JSON 中的這個字符。補救措施包括移除 JSON 中的 \ 字符,將該字符串封裝到引號中,重新生成這個 key 並確保不再包含 \ ,
或者手動指定``access_key`` 和和 secret_key 。如果 radosgw-admin 生成的 JSON 中的同一個key中包含轉義字符 \ 同時包含有正斜槓 / 形如 \/ ,
請只移除 JSON 轉義字符 \ ,不要刪除正斜槓 / ,因爲在 key 中它是一個有效字符。
新建一個 SWIFT 用戶
如果你想要使用這種方式訪問集羣,你需要新建一個 Swift 子用戶。創建 Swift 用戶包括兩個步驟。第一步是創建用戶。第二步是創建 secret key。

在``gateway host`` 上執行喜愛按的步驟:

新建 Swift 用戶:

sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
輸出類似下面這樣:

{
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [{
                "id": "testuser:swift",
                "permissions": "full-control"
        }],
        "keys": [{
                "user": "testuser:swift",
                "access_key": "3Y1LNW4Q6X0Y53A52DET",
                "secret_key": ""
        }, {
                "user": "testuser",
                "access_key": "I0PJDPCIYZ665MW88W9R",
                "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
        }],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "user_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "temp_url_keys": []
 }
新建 secret key:

sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
輸出類似下面這樣:

{
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [{
                "id": "testuser:swift",
                "permissions": "full-control"
        }],
        "keys": [{
                "user": "testuser:swift",
                "access_key": "3Y1LNW4Q6X0Y53A52DET",
                "secret_key": ""
        }, {
                "user": "testuser",
                "access_key": "I0PJDPCIYZ665MW88W9R",
                "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
        }],
        "swift_keys": [{
                "user": "testuser:swift",
                "secret_key": "244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF\/IA"
        }],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "user_quota": {
                "enabled": false,
                "max_size_kb": -1,
                "max_objects": -1
        },
        "temp_url_keys": []
}
訪問驗證
測試 S3 訪問
爲了驗證 S3 訪問,你需要編寫並運行一個 Python 測試腳本。S3 訪問測試腳本將連接 radosgw, 新建一個新的 bucket 並列出所有的 buckets。 
aws_access_key_id 和 aws_secret_access_key 的值來自於命令``radosgw_admin`` 的返回值 access_key 和 secret_key 。

執行下面的步驟:

你需要安裝 python-boto 包:

sudo yum install python-boto
新建 Python 腳本文件:

vi s3test.py
將下面的內容添加到文件中:

import boto
import boto.s3.connection

access_key = 'I0PJDPCIYZ665MW88W9R'
secret_key = 'dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA'
conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = '{hostname}', port = {port},
        is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )

bucket = conn.create_bucket('my-new-bucket')
    for bucket in conn.get_all_buckets():
            print "{name}".format(
                    name = bucket.name,
                    created = bucket.creation_date,
 )
將 {hostname} 替換爲你配置了網關服務的節點的主機名。比如 gateway host. 將 {port} 替換爲 Civetweb 所使用的端口。

運行腳本:
python s3test.py
輸出類似下面的內容:
my-new-bucket 2015-02-16T17:09:10.000Z
測試 SWIFT 訪問
Swift 訪問的驗證則可以使用``swift`` 的命令行客戶端。可以通過命令 man swift 獲取更多命令行選項的更多信息。

執行下面的命令安裝 swift 客戶端,在 Red Hat Enterprise Linux上執行:
sudo yum install python-setuptools
sudo easy_install pip
sudo pip install --upgrade setuptools
sudo pip install --upgrade python-swiftclient
在基於 Debian 的發行版上執行:

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install --upgrade setuptools
sudo pip install --upgrade python-swiftclient
執行下面的命令驗證 swift 訪問:

swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list
使用網關服務器的外網 IP 地址替換其中的 {IP ADDRESS} ,使用新建 swift 用戶時執行的命令 radosgw-admin key create 的輸出替換其中的 {swift_secret_key} 。
使用你的 Civetweb 所使用的端口替換其中 {port} ,比如默認是 7480 。如果你不替換這個端口,它的默認值是 80. 舉例如下:

swift -A http://10.19.143.116:7480/auth/1.0 -U testuser:swift -K '244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF/IA' list
輸出類似下面這樣:
my-new-bucket

==============================================================================================================================
==============================================================================================================================

ceph學習(五) s3cmd

s3cmd安裝

通過pip和yum可以直接安裝,沒有pip的需要安裝pip
yum install s3cmd

pip search s3cmd

生成祕鑰
radosgw-admin user create --uid=test1 --display-name="test1" [email protected]

查看
radosgw-admin user info --uid=test1

{
    "user_id": "test1",
    "display_name": "test 1",
    "email": "[email protected]",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "test1",
            "access_key": "LEEJ5TSHT0PHWGKYB3NM",
            "secret_key": "TbzEYCWsdM0j9JYXPYS6qMF3ur1hT9VBPkXongGt"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []
}

s3cmd的配置

使用前需要配置Access Key ID 和 Secret Access Key
vi ~/.s3cfg

[default]
access_key = *
secret_key = *
host_base = 127.0.0.1:7480
host_bucket = 127.0.0.1:7480/%(bucket)
use_https = False


s3cmd --configure

---------------------------------------------------------------------------------------------------
s3cmd的基本使用

3.1、列舉所有 Buckets。(bucket 相當於根文件夾)
s3cmd ls

3.2、創建 bucket,且 bucket 名稱是唯一的,不能重複。
s3cmd mb s3://my-bucket-name

3.3、刪除空 bucket
s3cmd rb s3://my-bucket-name

3.4、列舉 Bucket 中的內容
s3cmd ls s3://my-bucket-name

3.5、上傳 file.txt 到某個 bucket,
s3cmd put file.txt s3://my-bucket-name/file.txt

3.6、上傳並將權限設置爲所有人可讀
s3cmd put --acl-public file.txt s3://my-bucket-name/file.txt

3.7、批量上傳文件
s3cmd put ./* s3://my-bucket-name/

3.8、下載文件
s3cmd get s3://my-bucket-name/file.txt file.txt

3.9、批量下載
s3cmd get s3://my-bucket-name/* ./

3.10、刪除文件
s3cmd del s3://my-bucket-name/file.txt

3.11、來獲得對應的bucket所佔用的空間大小
s3cmd du -H s3://my-bucket-name

3.12、設置S3 bucket的Public權限
s3cmd setacl s3://myexamplebucket.calvium.com/ --acl-public --recursive

3.13  創建用戶
radosgw-admin user create --uid=test1 --display-name="test 1" [email protected]

3.14 配置文件
vi ~/.s3cfg

[default]
access_key =LEEJ5TSHT0PHWGKYB3NM 
secret_key =TbzEYCWsdM0j9JYXPYS6qMF3ur1hT9VBPkXongGt
host_base = 127.0.0.1:7480  
host_bucket =127.0.0.1:7480/%(bucket)
use_https = False


3.15 查看用戶信息
radosgw-admin user info --uid=test1

=====================================================================================================

###Kubernetes配置Ceph RBD StorageClass
####1. 在Ceph上爲Kubernetes創建一個存儲池
# ceph osd pool create k8s 128

#####2. 創建k8s用戶
# ceph auth get-or-create client.k8s mon 'allow r' osd 'allow rwx pool=k8s' -o ceph.client.k8s.keyring
 
####3. 將k8s用戶的key進行base64編碼(這是Kubernetes訪問Ceph的密鑰,會保存在Kubernetes的Secret中)
# grep key ceph.client.k8s.keyring | awk '{printf "%s", $NF}' | base64
VBGFaeN3OWJYdUZPSHhBQTNrU2E2QlUyaEF5UUV0SnNPRHdXeRT8PQ==

####4. 在Kubernetes創建訪問Ceph的Secret
# echo ' apiVersion: v1
kind: Secret
metadata:
  name: ceph-k8s-secret
type: "kubernetes.io/rbd"
data:
  key: VBGFaeN3OWJYdUZPSHhBQTNrU2E2QlUyaEF5UUV0SnNPRHdXeRT8PQ==
---
apiVersion: v1
kind: Secret
metadata:
  name: ceph-001-secret
  namespace: kube-system
type: "kubernetes.io/rbd"
data:
  key: VBGFaeN3OWJYdUZPSHhBQTNrU2E2QlUyaEF5UUV0SnNPRHdXeRT8PQ== ‘ | kubectl create -f -

####5. 將訪問Ceph的keyring複製到Kubernetes work節點上

  在創建Pod的時候,kubelet會調用rbd命令去檢測和掛載PVC對應的rbd鏡像,因此在kubelet節點上要保證存在rbd命令和訪問ceph的keyring。否則創建Pod,kubelet有可能報各種各樣ceph相關的錯誤。

  如果kubelet在worker節點上是正常運行在default namespace下的,那麼安裝ceph-common包,然後將keyring拷貝到/etc/ceph/目錄下即可;如果kubelet是運行在容器中,那這兩個操作就需要在容器中執行。

  我們的環境中,kubelet是運行在rkt容器中的,官方鏡像中已經包含了ceph客戶端,所以只需要將keyring拷貝到容器中。

  我們環境中使用systemctl管理kubelet,以服務的方式啓動一個rkt容器來運行kubelet,修改/etc/systemd/system/kubelet.service,增加一個對應keyring的volume:

[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=load-images.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/cluster-envs
Environment=KUBELET_IMAGE_TAG=v1.7.10
Environment="RKT_RUN_ARGS= \
--volume ceph-keyring,kind=host,source=/etc/ceph/ceph.client.k8s.keyring \
--mount volume=ceph-keyring,target=/etc/ceph/ceph.client.k8s.keyring \
--volume modprobe,kind=host,source=/usr/sbin/modprobe \
--mount volume=modprobe,target=/usr/sbin/modprobe \
--volume lib-modules,kind=host,source=/lib/modules \
--mount volume=lib-modules,target=/lib/modules \
ExecStartPre=/usr/bin/mkdir -p /etc/ceph
ExecStart=/opt/bin/kubelet-wrapper \
--address=0.0.0.0 \
--allow-privileged=true \
--cluster-dns=192.168.192.10 \
--cluster-domain=cluster.local \
--cloud-provider='' \
--port=10250 \
--lock-file=/var/run/lock/kubelet.lock \
--exit-on-lock-contention \
--node-labels=worker=true \
--pod-manifest-path=/etc/kubernetes/manifests \
--kubeconfig=/etc/kubernetes/kubeconfig.yaml \
--require-kubeconfig=true \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
--logtostderr=true
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
 

####6. 在Kubernetes創建ceph-rbd StorageClass

echo ‘apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: ceph-rbd
provisioner: kubernetes.io/rbd
parameters:
  monitors: 10.32.24.11:6789,10.32.24.12:6789,10.32.24.13:6789
  adminId: k8s
  adminSecretName: ceph-k8s-secret
  adminSecretNamespace: kube-system
  pool: k8s
  userId: k8s
  userSecretName: ceph-k8s-secret’ | kubectl create -f -

 

####7. 將ceph-rbd設置爲默認的StorageClass

 kubectl patch storageclass ceph-rbd -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
  注意集羣中只能存在一個默認StorageClass,如果同時將多個StorageClass設置爲默認,相當於沒有設置默認StorageClass。查看StorageClass列表,默認StorageClass帶有(default)標記:

# kubectl get storageclass
NAME                 TYPE
ceph-rbd (default)   kubernetes.io/rbd
ceph-sas             kubernetes.io/rbd
ceph-ssd             kubernetes.io/rbd
 

####8. 創建一個PersistentVolumeClaim

echo ‘apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-test-vol1-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ceph-rbd
  resources:
    requests:
      storage: 10Gi’ | kubectl create -f -

因爲指定了默認StorageClass,所以這裏的storageClassName其實可以省略。

####9. 創建使用PVC的Pod

echo ‘apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
      - name: nginx-test-vol1
        mountPath: /data/
        readOnly: false
  volumes:
  - name: nginx-test-vol1
    persistentVolumeClaim:
      claimName: nginx-test-vol1-claim’ | kubectl create -f -

####10. 查看容器狀態
進入容器看到rbd掛載到了/data目錄

kubectl exec nginx-test -it -- /bin/bash
[root@nginx-test ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/rbd0        50G   52M   47G   1% /data


[ceph@ceph-001 cluster]$ cat ceph.conf
[global]
fsid = 3ec98689-56d7-49b5-b708-6967922ac338
mon_initial_members = ceph-001, ceph-002, ceph-003
mon_host = 172.16.1.205,172.16.1.206,172.16.1.207
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 172.16.1.0/24

osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 32
osd pool default pgp num = 32

[mgr]
mgr modules = dashboard

[client.rgw.ceph-001]
rgw_frontends = "civetweb port=80"
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章