안녕하세요. 오픈소스컨설팅 클라우드 엔지니어 최수빈입니다.
현대의 데이터 중심 시대에서 스토리지 솔루션의 중요성이 커져가면서 효율적이고 확장 가능한 스토리지에 대한 수요가 늘어가고 있습니다.
데이터의 양이 기하급수적으로 증가함에 따라, 안정적이고 유연한 스토리지 시스템의 필요성도 함께 커지고 있는데요.
Ceph는 이러한 요구를 충족시키는 확장성과 고가용성을 갖춘 오픈 소스 분산 스토리지 솔루션으로, 많은 데이터 센터와 클라우드 환경에서 널리 사용되고 있습니다.
그래서 이번 블로그에서는 자동화 배포를 할 수 있는 Ceph-Ansible을 사용하여 Ceph 클러스터를 구축하는 방법을 다뤄보겠습니다. 구축에 들어가기에 앞서 먼저 Ceph-Ansible 에 대해 살펴보겠습니다.
Ceph-Ansible 이란 무엇인가?
Ceph-Ansible은 Ceph 스토리지 클러스터를 자동화하고 관리하기 위한 Ansible 기반 도구입니다.
Ceph를 설치하고 설정하는 과정을 자동화하는 역할을 하며, 이를 통해 사용자는 복잡한 스토리지 클러스터의 구축과 관리를 보다 쉽게 할 수 있습니다.
- 자동화된 설치 및 배포: Ansible 플레이북을 사용하여 Ceph 클러스터를 신속하고 일관되게 배포할 수 있습니다.
- 구성 관리: 클러스터 설정 변경을 관리하고 적용합니다.
- 업그레이드: 기존 Ceph 클러스터를 새로운 버전으로 안전하게 업그레이드할 수 있습니다.
- 확장성: 노드 추가 및 제거와 같은 클러스터 확장 작업을 쉽게 처리할 수 있습니다.
- 모니터링 및 관리: Ceph 모니터링 도구와 통합하여 클러스터 상태를 지속적으로 관리할 수 있습니다.
Ceph-Ansible 기능
주요 디렉토리 기능
- ceph-ansible 프로젝트는 여러 디렉토리와 파일로 구성되어 있으며, 각 디렉토리는 특정한 기능을 수행합니다.
- 디렉토리는 ansible 의 구조를 바탕으로 구성되며, 주요 디렉토리 기능은 다음과 같습니다.
1. group_vars/
- 기능: 클러스터의 그룹 별 변수를 정의하는 디렉토리입니다.
- 내용: all.yml, mons.yml, osds.yml 등의 파일이 있으며, 그룹에 따라 적용되는 변수를 정의합니다.
2. host_vars/
- 기능: 특정 호스트에 적용되는 변수를 정의하는 디렉토리입니다.
- 내용: 호스트 이름으로 된 파일들에 특정 호스트의 변수들이 정의되어 있습니다.
3. library/
- 기능: 사용자 정의 Ansible 모듈을 포함하는 디렉토리입니다.
- 내용: Ceph 클러스터를 관리하기 위한 특수 모듈이 포함되어 있습니다.
4. roles/
- 기능: 역할(Role)을 정의하는 디렉토리입니다. 각 역할에 따른 하위 디렉토리가 존재하며, 특정 작업을 수행하는 데 필요한 task, handler, 변수 등을 포함합니다.
- 내용: ceph-common, ceph-mon, ceph-osd, ceph-mds, ceph-client 등의 역할이 있습니다.
4.1 defaults/
- 기능: 역할(Role)의 기본 변수(default variables)를 정의하는 디렉토리입니다.
- 내용: 역할을 실행할 때 사용되는 기본 설정 값들이 정의된 main.yml 파일이 포함됩니다.
4.2 templates/
- 기능: Jinja2 템플릿 파일을 포함하는 디렉토리입니다.
- 내용: 설정 파일 템플릿 등이 포함되며, Ansible이 플레이북 실행 시 변수들을 사용하여 동적으로 생성하는 파일입니다.
4.3 files/
- 기능: 플레이북이 배포하는 데 사용하는 정적 파일을 포함하는 디렉토리입니다.
- 내용: Ceph 설정 및 배포에 필요한 정적 파일들이 포함됩니다.
4.4 tasks/
- 기능: 역할(Role)의 태스크(tasks)를 정의하는 파일을 포함합니다.
- 내용: main.yml 파일을 포함하여 특정 작업들을 정의합니다.
4.5 meta/
- 기능: 역할(Role)의 메타데이터를 포함하는 파일을 저장합니다.
- 내용: main.yml 파일이 있으며, 역할의 의존성, 유지 관리자 정보 등이 포함됩니다.
5. tests/
- 기능: 테스트 스크립트와 설정 파일을 포함하는 디렉토리입니다.
- 내용: 배포 후 클러스터 상태를 검증하기 위한 테스트를 포함합니다.
6. infrastructure-playbooks/
- 기능: 인프라스트럭처 설정을 위한 Ansible 플레이북을 포함하는 디렉토리입니다.
- 내용: Ceph 클러스터에 대한 설정, 유지 관리 및 업그레이드 작업 등의 파일을 포함됩니다.
7. docs/
- 기능: Ceph-ansible 프로젝트에 대한 문서를 포함하는 디렉토리입니다.
- 내용: 설치 가이드, 설정 방법, 운영 가이드, 문제 해결 가이드 등이 포함됩니다.
8. inventory/
- 기능: Ansible 인벤토리 파일이 위치한 디렉토리입니다.
- 내용: 클러스터 노드들의 호스트 정보를 정의하는 hosts 파일이 포함됩니다.
주요 파일 기능
- group_vars/all.yml
- 클러스터 전체에 적용되는 기본 설정을 포함합니다.
- group_vars/osds.yml
- OSD 노드에 필요한 설정 값들을 정의합니다.
- 디스크 구성, 저널 디스크, bluestore/filestore 설정 등의 OSD 관련 설정을 포함합니다.
- inventory/hosts
- 클러스터의 노드와 그룹을 정의합니다.
- container-site.yml
- 컨테이너 기반의 Ceph 클러스터를 배포하기 위한 파일 입니다.
- 일반적인 베어메탈 배포 방식은 “site.yml”을 활용합니다.
- requirment.txt
- 프로젝트가 의존하는 모든 Python 패키지와 그 버전을 명시합니다.
- 이 파일에 나열된 패키지들은 pip를 사용하여 설치할 수 있습니다.
Ceph 구축 방법
1. 구축 환경
- 테스트 용도이므로 배포 서버를 따로 두지 않고 Ceph01 서버에서 배포 진행
- OSD 로 사용할 디스크는 각 두 개씩 붙여줌
- Block storage(RBD) & File storage(CephFS) 를 사용
- OS Recomment : OS Recommendations — Ceph Documentation
- Ceph LifeCycle : Ceph Releases (index) — Ceph Documentation
HostName | ceph-service net | ceph-replica net | CPU / Mem / Disk | OS | Ceph 버전 |
---|---|---|---|---|---|
ceph01 | 10.10.60.10 | 10.10.50.10 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
ceph02 | 10.10.60.20 | 10.10.50.20 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
ceph03 | 10.10.60.30 | 10.10.50.30 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
2. 필요 패키지 설치
- 가상환경을 이용하여 배포하기 위한 최소 패키지 설치
- ansible 은 ssh를 사용하여 배포를 진행하므로 ansible을 사용하기 위한 패키지 설치
# apt-get install sshapss python3 python3-pip python3-venv
3. Ceph-Ansible 다운로드
# cd /opt
# git clone https://github.com/ceph/ceph-ansible.git
4. 가상환경 구성
4.1 ceph-ansible 브랜치 전환
- stable-6.0 ↔︎ pacific
# cd ceph-ansible/
# git checkout stable-6.0
4.2 가상환경 생성
# python3 -m venv ceph-venv
4.3 가상환경 적용
# source ceph-venv/bin/activate
5. pip 업그레이드
# pip install -U pip
6. pip 의존성 패키지 설치
# pip install -r requirements.txt
7. 호스트 키 생성 및 복사
7.1 ansible 배포 시 사용할 ssh 키 생성
# ssh-keygen -N "" -f /root/.ssh/id_rsa
7.2 ansible을 통해 배포 진행할 호스트로 키 복사
# ssh-copy-id ceph01
# ssh-copy-id ceph02
# ssh-copy-id ceph03
8. 구성 파일 설정
8.1 Inventroy 설정
- Block storage(rbd) 기능은 별도의 설정 없이 기본적으로 사용 가능
- mdss 가 정의되어 있어야 file storage(cephfs) 기능 사용 가능
- rgws 가 정의되어 있어야 object storage(rgw) 기능 사용 가능
- rgw 를 사용하려면 all.yml 에 추가적인 설정도 필요
# vi ceph-hosts
[mons]
ceph01
ceph02
ceph03
[restapis]
[mgrs]
ceph01
ceph02
ceph03
[osds]
ceph01
ceph02
ceph03
[mdss]
ceph01
ceph02
ceph03
[rgws]
[rbdmirrors]
[nfss]
[clients]
ceph01
ceph02
ceph03
Group | Describe |
---|---|
[mons] | 모니터링을 위한 노드를 정의하는 그룹 |
[osds] | osd(disk) 역할을 할 노드를 정의하는 그룹 |
[mdss] | mds 역할을 할 노드를 정의하는 그룹 |
[rgws] | rgw를 사용할 노드를 정의하는 그룹 |
[clients] | client 역할을 할 노드를 정의하는 그룹 |
[all:vars] | 모든 그룹의 묶음 |
8.2 osds.yml 설정
- 아래 osd 설정 방식에서 저장 영역을 분리하여 osd 구성 가능
- bluestore : data, wal, db 영역 세분화 가능
- data : 실제 data를 저장하는 곳
- wal : Data 영역에 저장되기 전에 모든 쓰기 작업을 임시로 기록하는 곳
- db : 모든 객체의 메타데이터(예: 객체 위치, 크기, 체크섬 등)를 저장하는 곳
- bluestore : data, wal, db 영역 세분화 가능
- filestore : data, journal 영역 세분화 가능
- data : 실제 data를 저장하는 곳
- journal : Data 영역에 저장되기 전에 모든 쓰기 작업을 임시로 기록하는 곳
# cp group_vars/osds.yml.sample group_vars/osds.yml
8.2.1 기본 osd 설정
- 파티셔닝이 되지 않은 디스크로 osd 를 구성하는 방식
# vi group_vars/osds.yml
---
dummy:
devices:
- /dev/sdb
- /dev/sdc
8.2.2 LVM osd 설정
- LVM 볼륨으로 osd 를 구성하는 방식
- 사용할 디스크를 사전에 LVM 방식으로 구성해 놓아야 함
root@ceph01:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:32 0 14.6T 0 disk
└─data--vg1--data--lv1 253:12 0 14.6T 0 lvm
sdc 8:32 0 14.6T 0 disk
└─data--vg2-data--lv2 253:12 0 14.6T 0 lvm
# vi group_vars/osds.yml
---
dummy:
lvm_volumes:
- data: data-lv1
data_vg: data-vg1
- data: data-lv2
data_vg: data-vg2
8.3 all.yml 설정
# cp group_vars/all.yml.sample group_vars/all.yml
# vi all.yml
---
dummy:
configure_firewall: False
ntp_service_enabled: True
ntp_daemon_type: chronyd
ceph_origin: repository
ceph_repository: community
ceph_stable_release: nautilus
monitor_interface: ens3
public_network: 10.10.60.0/24
cluster_network: 10.10.50.0/24
ceph_docker_image: "ceph/daemon"
ceph_docker_image_tag: latest-nautilus
containerized_deployment: True
dashboard_enabled: False
Option | Describe |
---|---|
configure_firewall | Ceph-ansible이 방화벽을 설정하지 않도록 지정합니다. |
ntp_service_enabled | NTP 서비스를 활성화합니다. |
ntp_daemon_type | NTP 데몬으로 chronyd를 사용합니다. |
ceph_origin | Ceph 소프트웨어 패키지를 어디에서 가져올지를 지정합니다. |
ceph_repository | 사용할 Ceph 저장소를 지정합니다. |
ceph_stable_release | ceph 버전을 지정합니다. |
monitor_interface | 모니터 노드가 사용할 네트워크 인터페이스를 ens3로 지정합니다. |
public_network | 클라이언트와 Ceph 모니터가 통신하는 네트워크를 지정합니다. |
cluster_network | OSD 간 데이터 복제 및 백업 통신이 이루어지는 네트워크를 지정합니다. |
ceph_docker_image | Ceph 데몬의 도커 이미지를 지정합니다. |
ceph_docker_image_tag | 도커 이미지 태그를 지정합니다. |
containerized_deployment | Ceph 클러스터를 컨테이너화된 환경에서 배포할지 여부를 지정합니다. |
9. 배포
# ansible-playbook -i ceph-hosts site-container.yml
10. Client에서 Ceph 명령을 사용하기 위한 패키지 설치
- 해당 패키지를 설치하지 않았을 경우, mon 컨테이너에 접속해야 ceph 명령 사용 가능
# apt-get install ceph-common
11. 배포 확인
11.1 최초 클러스터 상태 확인
- 처음 배포 시 모니터 노드가 불안전한 global_id reclaim을 허용하므로 설정 비활성화가 필요합니다.
root@ceph01:~# ceph -s
cluster:
id: cd747730-ffd1-46dd-afc5-635d0c1a2211
health: HEALTH_WARN
mons are allowinginsecure global_id reclaim
- 비활성화 적용
- 해당 기능은 클러스터에서 사용되는 특정 인증 메커니즘과 관련된 기능입니다.
- 클러스터 내에서 이미 사용된 인증 ID를 다시 사용하는 것을 허용하는 설정으로 보안적으로 신뢰할 수 없는 환경에서 사용될 때 주의가 필요합니다.
# ceph config set mon auth_allow_insecure_global_id_reclaim false
- 정상 상태 확인
root@ceph01:~# ceph -s
cluster:
id: 50cb236f-2829-4e6b-820f-3f96e1d3ed79
health: HEALTH_OK
11.2 osd 별 데이터 사용량 확인
root@ceph01:~# ceph osd df tree
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS TYPE NAME
-1 0.29279 - 300 GiB 1.7 GiB 8.9 MiB 0 B 1.7 GiB 298 GiB 0.58 1.00 - root default
-4 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph01
1 hdd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 63 up osd.1
0 ssd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 82 up osd.0
-7 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph02
2 hdd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 66 up osd.2
4 ssd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 79 up osd.4
-10 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph03
3 hdd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 80 up osd.3
5 hdd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 65 up osd.5
TOTAL 300 GiB 1.7 GiB 8.9 MiB 0 B 1.7 GiB 298 GiB 0.58
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
11.3 pool 에 대한 설정 확인
- 각 풀에 대한 replica 크기 및 pg 개수 등 설정 확인 가능
root@ceph01:~# ceph osd pool ls detail
pool 1 '.mgr' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 20 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr
pool 2 'cephfs_data' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 application cephfs
pool 3 'cephfs_metadata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
11.4 pool 별 데이터 사용량 확인
root@ceph01:~# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 250 GiB 249 GiB 1.4 GiB 1.4 GiB 0.57
ssd 50 GiB 50 GiB 291 MiB 291 MiB 0.57
TOTAL 300 GiB 298 GiB 1.7 GiB 1.7 GiB 0.57
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.mgr 1 1 449 KiB 2 1.3 MiB 0 94 GiB
cephfs_data 2 32 0 B 0 0 B 0 94 GiB
cephfs_metadata 3 16 2.3 KiB 22 96 KiB 0 94 GiB
11.5 rbd 동작 테스트
- rbd pool 생성
- pg 개수는 8로 설정
root@ceph01:~# ceph osd pool create rbd-pool 8
pool 'rbd-pool' created
root@ceph01:~# ceph osd pool application enable rbd-pool rbd
enabled application 'rbd' on pool 'rbd-pool'
- pool 생성 확인
root@ceph01:~# ceph osd pool ls detail | grep rbd
pool 5 'rbd-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 autoscale_mode on last_change 48 flags hashpspool stripe_width 0 application rbd
- data block 생성
- data size 는 1G 로 설정
# rbd create rbd-pool/data --size 1G
- pool에 저장된 data 확인
root@ceph01:~# rbd ls -l rbd-pool
NAME SIZE PARENT FMT PROT LOCK
data 1 GiB 2
11.6 cephfs 동작 테스트
- 새로운 cephfs pool 생성
- cephfs 는 기본적으로 데이터를 저장하기 위해 data용, metadata용으로 각각 2개의 pool이 필요
root@ceph01:~# ceph osd pool create cephfs-data-pool 8
pool 'cephfs-pool' created
root@ceph01:~# ceph osd pool create cephfs-meta-pool 8
[root@ceph01 root@ceph01:~# ceph osd pool application enable cephfs-data-pool cephfs
enabled application 'cephfs' on pool 'cephfs-data-pool'
root@ceph01:~# ceph osd pool application enable cephfs-meta-pool cephfs
enabled application 'cephfs' on pool 'cephfs-meta-pool'
- pool 생성 확인
root@ceph01:~# ceph osd pool ls detail | grep cephfs
pool 2 'cephfs_data' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 application cephfs
pool 3 'cephfs_metadata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
pool 6 'cephfs-data-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 74 lfor 0/0/66 flags hashpspool stripe_width 0 application cephfs
pool 7 'cephfs-meta-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 74 lfor 0/0/66 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
- 생성한 pool로 파일 시스템을 생성
- 기본으로 활성화된 cephfs pool 에 대해 cephfs 라는 파일시스템이 존재하므로,
새로 생성한 cephfs pool 은 새로운 파일시스템명(eg. new-cephfs) 으로 생성
- 기본으로 활성화된 cephfs pool 에 대해 cephfs 라는 파일시스템이 존재하므로,
root@ceph01:~# ceph fs new new-cephfs cephfs-meta-pool cephfs-data-pool
new fs with metadata pool 7 and data pool 6
- Deafault pool 변경
- 기본 생성된 cephfs pool에서 새로 생성한 cephfs pool로 default pool을 변경
- 기존 파일에 영향을 미치지 않으며, 새로 생성되는 모든 data에 대해서만 새로운 pool 에 저장됨
# ceph fs set-default new-cephfs
- pool 사용량 확인
root@ceph01:~# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph02 Reqs: 0 /s 12 13 12 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 432k 94.4G
cephfs_data data 0 94.4G
new-cephfs - 1 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph01 Reqs: 0 /s 12 13 12 1
POOL TYPE USED AVAIL
cephfs-meta-pool metadata 288k 94.4G
cephfs-data-pool data 0 94.4G
STANDBY MDS
ceph03
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
- data file 생성
- data가 있어야 data pool에 저장되고 아닌 경우 metadata pool에 metadata값만 저장
- mds 권한이 설정되어 있는 ceph 노드의 정보를 넣어주어야 cephfs 정상적으로 마운트 가능
- 아래 명령을 통해 admin 계정 정보 확인
# ceph auth ls | grep admin -A 1
- 아래 명령을 통해 admin 계정 정보 확인
** client 에서 cephfs 마운트
# mount -t ceph [mon-ip]:/ [mount-path] -o name=admin,secret=[key]
** metadata file 생성
# echo "Hello Ceph" > [mount-path]/hello.txt
** data 생성 위해 iso 이미지 파일 다운로드
# wget https://releases.ubuntu.com/focal/ubuntu-20.04.6-live-server-amd64.iso
- data 생성 후 pool 사용량 확인
root@ceph01:~# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph02 Reqs: 0 /s 12 13 12 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 432k 92.5G
cephfs_data data 0 92.5G
new-ephfs - 1 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph01 Reqs: 0 /s 12 15 12 3
POOL TYPE USED AVAIL
cephfs-meta-pool metadata 384k 92.5G
cephfs-data-pool data 4255M 92.5G
STANDBY MDS
ceph03
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
이렇게 Ceph-ansible 을 통해 Ceph 클러스터를 설치하는 방법을 다뤄보았습니다.
이 글이 Ceph-Ansible을 이해하고 실질적인 구축을 하는 데에 조금이나마 도움이 되길 바라면서 다음 포스트에서도 유익한 정보 가지고 돌아오겠습니다.
읽어주셔서 감사합니다!
관련된 글 더보기