Cephadm은 단일 호스트를 부트스트래핑하여 새로운 Ceph 클러스터를 만들고, 추가 호스트를 포함하도록 클러스터를 확장한 다음 필요한 서비스를 배포합니다.
요약
ceph 클러스터를 운영하기 위해서 python3, docker, chrony, lvm2 패키지가 설치 되어 있어야 합니다.
그리고 ceph 클러스터를 생성하기 위해 cephadm 툴을 설치해야 합니다.
위 패키지와 cephadm 툴이 설치되었다면 ceph 클러스터 생성을 위한 준비가 되었습니다.
- 먼저 첫번째 호스트에서 신규 ceph 클러스터를 시작(bootstrap) 합니다. 이때 cephadm 툴을 이용하게 됩니다.
cephadm bootstrap --mon-ip 10.1.1.11 - 정상적으로 클러스터가 생성되면 이 호스트에서 ceph 명령어를 수행하기 위한 환경을 설정합니다. 이때 역시
cephadm툴을 사용합니다.cephadm shell - 이제
ceph명령어를 통해서 ceph 클러스터에 호스트들을 추가합니다.ceph orch host add hosts-2 10.1.1.12
ceph orch host add hosts-3 10.1.1.13 - 필요한 모든 호스트를 추가하였다면, 다음으로 스토리지로 사용할 디스크를
ceph명령어를 통해서 추가합니다.ceph orch apply osd --all-available-devices - 사용 가능한 디스크는 ceph 클러스터로 등록된 호스트에 장착되어 있는 것만 가능합니다.
요구 사항
아래 요구사항은 ceph가 운영되는 모든 호스트에 설치되어 있어야 합니다.
- Python 3
- Systemd
- Podman or Docker for running containers
- Time synchronization (such as Chrony or the legacy ntpd)
- LVM2 for provisioning storage devices
python3 설치
sudo apt install python3
Docker 설치
- 컨테이너를 운영하기 위한 Docker 설치합니다.
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
Chrony 설치
시간 동기화 프로그램 Chrony 을 설치합니다.
- 현재 시간대 확인
timedatectl
root@hosts-1:~# timedatectl
Local time: Thu 2024-08-08 15:44:22 UTC
Universal time: Thu 2024-08-08 15:44:22 UTC
RTC time: Thu 2024-08-08 15:44:23
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
- 서울 시간대 설정
sudo timedatectl set-timezone Asia/Seoul
root@hosts-1:~# sudo timedatectl set-timezone Asia/Seoul
root@hosts-1:~# timedatectl
Local time: Fri 2024-08-09 00:46:45 KST
Universal time: Thu 2024-08-08 15:46:45 UTC
RTC time: Thu 2024-08-08 15:46:46
Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
- chrony 설치
sudo apt install chrony - chrony 설정
/etc/chrony/chrony.conf
# 서버 목록 설정
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# 허용 네트워크 설정
allow 192.168.244.0/24
allow 10.0.3.0/24
allow 10.1.1.0/24
# 로컬 시간 서버 설정
local stratum 10
# drift 파일 설정
driftfile /var/lib/chrony/chrony.drift
- chrony 서비스 재시작
sudo systemctl restart chrony - chrony 동기화 확인
chronyc sources -v
root@hosts-1:~# chronyc sources -v
210 Number of sources = 9
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- prod-ntp-3.ntp1.ps5.cano> 2 6 17 5 -1119us[-2171us] +/- 118ms
^- prod-ntp-5.ntp4.ps5.cano> 2 6 17 4 -1764us[-1764us] +/- 119ms
^- prod-ntp-4.ntp1.ps5.cano> 2 6 17 6 +2164us[+1112us] +/- 115ms
^- alphyn.canonical.com 2 6 17 6 +3553us[+2502us] +/- 114ms
^- 121.174.142.82 3 6 17 7 +1216us[+1005us] +/- 54ms
^* 193.123.243.2 2 6 17 6 -36us[-1087us] +/- 4775us
^? 2603:c022:8004:7800:65bf> 0 6 0 - +0ns[ +0ns] +/- 0ns
^? 2401:c080:1c00:24a1:5400> 0 6 0 - +0ns[ +0ns] +/- 0ns
^? any.time.nl 0 6 0 - +0ns[ +0ns] +/- 0ns
LVM2 설치
- 스토리지 디바이스를 프로비저닝하기 위한 LVM2 을 설치합니다.
sudo apt install lvm2 -y
Cephadm 툴 설치
cephadm 툴은 첫번째 호스트에서만 설치합니다.
cephadm은 ceph 클러스트를 생성하기 위한 툴입니다.curl명령어를 통해 아래와 같이 설치 합니다.CEPH_RELEASE=18.2.0 # replace this with the active release
curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm
chmod +x cephadmcephadm바이너리를/usr/sbin디렉토리로 옮겨 놓습니다.
Ceph 클러스터 생성하기
요구사항을 만족하고 cephadm 툴이 설치되어 있다면 ceph 클러스터를 생성할 수 있습니다.
1) 클러스터 생성
새로운 ceph 클러스터를 생성하는 첫번째 절차는 cephadm bootstrap 명령어를 첫 호스트에서 실행하는 것입니다.
- 첫 호스트에서 다음 명령어를 실행합니다.
cephadm bootstrap --mon-ip 10.1.1.11
./cephadm bootstrap --mon-ip 10.1.1.11
...
Ceph Dashboard is now available at:
URL: https://hosts-1:8443/
User: admin
Password: vrrcja7eqm
You can access the Ceph CLI with:
sudo /usr/sbin/cephadm shell --fsid 0a5686aa-558c-11ef-8ba6-039ca700434f -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/docs/master/mgr/telemetry/
Bootstrap complete.
- 위 명령어 수행시 내부적으로 다음과 같은 작업을 수행합니다.
- 새로운 클러스터를 위한 Monitor와 Manager 데몬을 생성함.
- ceph 클러스터를 위한 새로운 ssh key를 생성하고 그것을 user의 /root/.ssh/authorized_keys 파일에 추가함.
- public key 사본을 /etc/ceph/ceph.pub에 write 함.
- 최소 설정을 /etc/ceph/ceph.conf 에 write 함. 이 파일은 ceph 데몬과 통신 할 때 필요함.
- ceph.admin 관리자 비밀키의 사본을 /etc/ceph/ceph.client.admin.keyring 파일에 write 함.
- 부트스트랩 호스트에 _admin 라벨을 추가함. 기본적으로 이 라벨이 있는 모든 호스트는 /etc/ceph/ceph.conf 및 /etc/ceph/ceph.client.admin.keyring의 사본도 받게 됨.
생성된 컨테이너 확인
docker ps
root@hosts-1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02a176031d02 quay.io/prometheus/alertmanager:v0.25.0 "/bin/alertmanager -…" 7 minutes ago Up 7 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-alertmanager-hosts-1
ddd00f2c315f quay.io/ceph/ceph-grafana:9.4.7 "/bin/sh -c 'grafana…" 7 minutes ago Up 7 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-grafana-hosts-1
bca1a9198aa9 quay.io/prometheus/prometheus:v2.43.0 "/bin/prometheus --c…" 7 minutes ago Up 7 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-prometheus-hosts-1
20bbdad6e0d7 quay.io/prometheus/node-exporter:v1.5.0 "/bin/node_exporter …" 8 minutes ago Up 8 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-node-exporter-hosts-1
bda6389ce9d6 quay.io/ceph/ceph "/usr/bin/ceph-crash…" 8 minutes ago Up 8 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-crash-hosts-1
a7467c37790b quay.io/ceph/ceph "/usr/bin/ceph-expor…" 8 minutes ago Up 8 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-ceph-exporter-hosts-1
ce16c38d68a6 quay.io/ceph/ceph:v18 "/usr/bin/ceph-mgr -…" 9 minutes ago Up 9 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-mgr-hosts-1-enewmb
59797c3dbf7a quay.io/ceph/ceph:v18 "/usr/bin/ceph-mon -…" 9 minutes ago Up 9 minutes ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-mon-hosts-1
설정 파일 확인
cat ceph.client.admin.keyring
root@hosts-1:/etc/ceph# cat ceph.client.admin.keyring
[client.admin]
key = AQAm7bRmFRpTLBAAQIGTW9Yy1/xYD1TKi+41hQ==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
cat ceph.conf
root@hosts-1:/etc/ceph# cat ceph.conf
# minimal ceph.conf for 2cf80792-55a0-11ef-9a6a-494f7f165258
[global]
fsid = 2cf80792-55a0-11ef-9a6a-494f7f165258
mon_host = [v2:10.1.1.11:3300/0,v1:10.1.1.11:6789/0]
cat rbdmap
root@hosts-1:/etc/ceph# cat rbdmap
# RbdDevice Parameters
#poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring
2) ceph cli 활성화
ceph명령어를 위한 shell 실행
./cephadm shell
root@hosts-1:~# ./cephadm shell
Inferring fsid 2cf80792-55a0-11ef-9a6a-494f7f165258
Inferring config /var/lib/ceph/2cf80792-55a0-11ef-9a6a-494f7f165258/mon.hosts-1/config
Using ceph image with id '2bc0b0f4375d' and tag 'v18' created on 2024-07-24 07:19:35 +0900 KST
quay.io/ceph/ceph@sha256:6ac7f923aa1d23b43248ce0ddec7e1388855ee3d00813b52c3172b0b23b37906
- ceph 클러스터 상태 조회
ceph -s
root@hosts-1:/# ceph -s
cluster:
id: 2cf80792-55a0-11ef-9a6a-494f7f165258
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum hosts-1 (age 7m)
mgr: hosts-1.enewmb(active, since 5m)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
- ceph cli 설치
root@hosts-1:~# ./cephadm add-repo --release reef
root@hosts-1:~# ./cephadm install ceph-common- 설치 후 cephadm shell 없이 바로 ceph 명령어를 수행할 수 있음
3) 호스트 추가
/etc/hosts설정
cat /etc/hosts
root@hosts-1:~# cat /etc/hosts
127.0.0.1 localhost
hosts-1 10.1.1.11
hosts-2 10.1.1.12
hosts-3 10.1.1.13
- 클러스터의 public SSH key를 새로운 호스트에 등록함.
ssh-copy-id -f -i /etc/ceph/ceph.pub [email protected]
ssh-copy-id -f -i /etc/ceph/ceph.pub [email protected] - 새로운 호스트가 클러스터에 추가 하는 것을 ceph에게 알림.
ceph orch host add hosts-2 10.1.1.12
ceph orch host add hosts-3 10.1.1.13- 하나 이상의 레이블을 포함하여 새 호스트에 즉시 레이블을 지정할 수도 있음.
예를 들어 기본적으로 _admin 레이블은 cephadm이 ceph.conf 파일의 사본과 /etc/ceph의 client.admin 키링 파일을 유지 관리하도록 함.
ceph orch host add hosts-2 10.1.1.12 --labels _admin
ceph orch host add hosts-3 10.1.1.13 --labels _admin
- 하나 이상의 레이블을 포함하여 새 호스트에 즉시 레이블을 지정할 수도 있음.
예를 들어 기본적으로 _admin 레이블은 cephadm이 ceph.conf 파일의 사본과 /etc/ceph의 client.admin 키링 파일을 유지 관리하도록 함.
- ceph 클러스터 상태 조회
ceph -s
root@hosts-1:~# ceph -s
cluster:
id: 2cf80792-55a0-11ef-9a6a-494f7f165258
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum hosts-1,hosts-2,hosts-3 (age 2m)
mgr: hosts-1.enewmb(active, since 8h), standbys: hosts-2.vvcfvr
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
cf. 호스트 삭제
- 모든 데몬이 제거된 후 호스트를 클러스터에서 안전하게 제거함.
ceph orch host drain hosts-2
ceph orch host drain hosts-3- hosts-2의 mon 이 삭제가 안되어서 강제로 삭제함
ceph mon remove hots-2
root@hosts-1:~# ceph orch osd rm status
No OSD remove/replace operations reported
root@hosts-1:~# ceph orch ps hosts-2
NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID
mon.hosts-2 hosts-2 running (28m) 5m ago 28m 47.6M 2048M 18.2.4 2bc0b0f4375d 21413fc5f7bc
root@hosts-1:~# ceph quorum_status --format json-pretty | jq -r '.quorum_names'
[
"hosts-1",
"hosts-2"
]
root@hosts-1:~# ceph mon remove hosts-2
- hosts-2의 mon 이 삭제가 안되어서 강제로 삭제함
- 클러스터 호스트 정보
ceph orch host ls
root@hosts-1:~# ceph orch host ls
HOST ADDR LABELS STATUS
hosts-1 10.1.1.11 _admin
hosts-2 10.1.1.12 _no_schedule,_no_conf_keyring
hosts-3 10.1.1.13 _no_schedule,_no_conf_keyring
3 hosts in cluster - 클러스터에서 호스트를 삭제
ceph orch host rm hosts-2
ceph orch host rm hosts-3
cf. MON 추가
- 일반적인 Ceph 클러스터에는 서로 다른 호스트에 분산된 3개 또는 5개의 Monitor 데몬이 있습니다.
- 클러스터에 5개 이상의 노드가 있는 경우 5개의 Monitor를 배포하는 것이 좋습니다.
- 대부분의 클러스터는 7개 이상의 Monitor에서 이점을 얻지 못합니다.
4) 저장소 추가
- 클러스터에 스토리지를 추가하기 위해, Ceph에 사용 가능한 미사용 장치를 모두 사용하도록 설정합니다.
ceph orch apply osd --all-available-devices
--dry-run플래그를 사용하면 오케스트레이터가 실제로 OSD를 만들지 않고도 무슨 일이 일어날지 미리 볼 수 있음.ceph orch apply osd --all-available-devices --dry-run- ceph 클러스터 상태 조회
ceph -s
root@hosts-1:~# ceph -s
cluster:
id: 2cf80792-55a0-11ef-9a6a-494f7f165258
health: HEALTH_OK
services:
mon: 3 daemons, quorum hosts-1,hosts-2,hosts-3 (age 11m)
mgr: hosts-1.enewmb(active, since 9h), standbys: hosts-2.aqoeba
osd: 3 osds: 0 up, 3 in (since 1.56594s)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
- 모든 클러스터 호스트들의 스토리지 디바이스 정보
ceph orch device ls
root@hosts-1:~# ceph orch device ls
HOST PATH TYPE DEVICE ID SIZE AVAILABLE REFRESHED REJECT REASONS
hosts-1 /dev/sr0 hdd QEMU_DVD-ROM_QM00001 366k No 5m ago Has a FileSystem, Insufficient space (<5GB)
hosts-1 /dev/vdb hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-1 /dev/vdc hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-1 /dev/vdd hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-2 /dev/sr0 hdd QEMU_DVD-ROM_QM00001 366k No 5m ago Has a FileSystem, Insufficient space (<5GB)
hosts-2 /dev/vdb hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-2 /dev/vdc hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-2 /dev/vdd hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-3 /dev/sr0 hdd QEMU_DVD-ROM_QM00001 366k No 5m ago Has a FileSystem, Insufficient space (<5GB)
hosts-3 /dev/vdb hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-3 /dev/vdc hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
hosts-3 /dev/vdd hdd 50.0G No 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
- osd 정보
ceph osd tree
root@hosts-1:~# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.43918 root default
-3 0.14639 host hosts-1
1 hdd 0.04880 osd.1 up 1.00000 1.00000
3 hdd 0.04880 osd.3 up 1.00000 1.00000
6 hdd 0.04880 osd.6 up 1.00000 1.00000
-5 0.14639 host hosts-2
0 hdd 0.04880 osd.0 up 1.00000 1.00000
4 hdd 0.04880 osd.4 up 1.00000 1.00000
7 hdd 0.04880 osd.7 up 1.00000 1.00000
-7 0.14639 host hosts-3
2 hdd 0.04880 osd.2 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
8 hdd 0.04880 osd.8 up 1.00000 1.00000
ceph osd ls
root@hosts-1:~# ceph osd ls
0
1
2
3
4
5
6
7
8
cf. 저장소 삭제
- osd 삭제
ceph orch osd rm 0
ceph orch osd rm 1
ceph orch osd rm 2
ceph orch osd rm 3
ceph orch osd rm 4
ceph orch osd rm 5
ceph orch osd rm 6
ceph orch osd rm 7
ceph orch osd rm 9 - 삭제 결과 몇개가 남아 있음
ceph osd tree
root@hosts-1:~# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.09760 root default
-3 0.04880 host hosts-1
1 hdd 0.04880 osd.1 up 1.00000 1.00000
-5 0.04880 host hosts-2
0 hdd 0.04880 osd.0 up 1.00000 1.00000
-7 0 host hosts-3
- 강제로 삭제
- 제거 준비
ceph osd out osd.0
ceph osd out osd.1
- 제거 준비
- OSD를 클러스터에서 완전히 제거
ceph osd crush remove osd.0
ceph auth del osd.0
ceph osd rm osd.0
ceph osd crush remove osd.1
ceph auth del osd.1
ceph osd rm osd.1
- osd 데몬 제거
root@hosts-1:~# docker stop ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-osd-1; docker rm ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-osd-1
root@hosts-2:~# docker stop ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-osd-0; docker rm ceph-2cf80792-55a0-11ef-9a6a-494f7f165258-osd-0
- osd 삭제
ceph osd rm osd.0
ceph osd rm osd.1
