Dev Blog
DevOps, Container, Etc
ceph ansible simple installation
ceph-ansible

개요

  • 회사에서 Ceph 를 계속 스터디를 하고 있었으나. K8s Cluster 에 올려놓고 사용만 하고있었지 Baremetal 에 올려 사용하지는 않고있었다.
  • 자세하게 사용하기도 해야할 뿐더러 여러가지 옵션을 테스트 및 운용하기 위한 클러스터 구축을 정리하기 위하여 본 포스팅을 정리한다.
  • Ceph 설치방법은 Ceph-ansible 이며 stable-3.2 버전을 이용하여 설치 하였다.
  • 설치 노드는
    • mon 1, osd 3, mgr 1 이며 mon1 과 mgr1, osd1 이 같은 호스트에 배포가 되었다.
    • ceph0 10.0.3.2 8cpu 16gb ram, /dev/sdb 300gb
    • ceph1 10.0.3.3 8cpu 16gb ram, /dev/sdb 300gb
    • ceph2 10.0.3.4 8cpu 16gb ram, /dev/sdb 300gb

ceph prerequirements

  • 3node 부팅 Vagrant 로 부팅하면서 /dev/sdb/ 를 생성하도록 하였으며 lvm, fs 생성은 하지 않았다.
  • ssh fingerprint 설정
# 이방법으로 패스워드 yes, 패스워드 일일이 쳤음 
ssh-keygen 
ssh-copy-id ceph0
ssh-copy-id ceph1
ssh-copy-id ceph2

# 핑거프린트 검증용 각 호스트 접속 조회 확인  
ssh root@ceph0 hostname
ssh root@ceph1 hostname
ssh root@ceph2 hostname


# 다른방법으로는 sshpass 가 있다고 한다. 아래와 같이 사용하면 된다. 
yum install -y sshpass
echo "passwd-content" ~/passwd
sshpass -f ~/passwd ssh-copy-id root@ceph0
ssh root@ceph0 hostname 
  • ceph 설치 전 사전 준비
    • Pip, git Clone, 의존성 파일을 받아준다.
yum install -y git python-pip sshpass && 
git clone https://github.com/ceph/ceph-ansible.git && \
cd ceph-ansible && \
git checkout  stable-3.2 && \
pip install -r requirements.txt 
  • /etc/hosts 설정
cat <<EOF>> /etc/hosts

10.0.3.2 ceph0
10.0.3.3 ceph1
10.0.3.4 ceph2

EOF

# 검증하기위한 조회 
cat /etc/hosts

# ceph 
firewall-cmd --permanent --new-service 3300 && \
  firewall-cmd --permanent --new-service 6789 && \
  firewall-cmd --reload

ceph ansible install

  • inventory 작성
cat << EOF | tee inventory.ini
[mons]
ceph0

[mgrs]
ceph0

[osds]
ceph0
ceph1
ceph2

[grafana-server]
ceph0

[all:children]
mons
osds
mgrs
EOF
  • extra-vars.yml 파일 작성

cat <<EOF | tee extra.yaml
# ceph
monitor_interface: eth1
monitor_address: 10.0.3.2
public_network: 10.0.3.0/24
cluster_network: 10.0.3.0/24

ceph_origin: repository
ceph_repository: community
ceph_stable_release: luminous

ceph_conf_overrides:
  global:
    mon_allow_pool_delete: true
    osd_pool_default_size: 1
    osd_pool_default_min_size: 1
    osd_pg_stat_report_internal_max: 1
  osd:
    osd_min_pg_log_entries: 10
    osd_max_pg_log_entries: 10
    osd_pg_log_dups_tracked: 10
    osd_pg_log_trim_min: 10

osd_objectstore: bluestore
#lvm_volumes:
#  - data: /dev/sda
#  - data: /dev/sdb
osd_scenario: collocated
dmcrypt: true
devices:
  - /dev/sdb

openstack_config: true
kube_pool:
  name: "kube"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
  application: "rbd"
openstack_glance_pool:
  name: "images"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_cinder_pool:
  name: "volumes"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_cinder_backup_pool:
  name: "backups"
  pg_num: 2
  pgp_num: 2
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_nova_vms_pool:
  name: "vms"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
  application: "rbd"

openstack_pools:
  - "{{ kube_pool }}"
  - "{{ openstack_glance_pool }}"
  - "{{ openstack_cinder_pool }}"
  - "{{ openstack_cinder_backup_pool }}"
  - "{{ openstack_nova_vms_pool }}"
EOF

  • ping 체크
ansible -b -i inventory.ini -m ping all
  • ansible playbook site 스크립트를 실행하여 설치

 cp site.yml.sample site.yml

INVENTORY="-i inventory.ini"
EXTRA="-e @extra.yaml"
OPTION="-b -vvvv"
PLAY="site.yml"
ansible-playbook $INVENTORY $EXTRA $PLAY $OPTION 
# ansible-playbook -b -vvvv -i inventory.ini -e @extra.yaml site.yaml

ceph ansible remove


cat << EOF | tee purge=cluster.sh 
#!/bin/bash 
set -ex 
INVENTORY="-i inventory.ini"
EXTRA="-e @extra.yaml"
PLAY="infrastructure-playbooks/purge-cluster.yml"
OPTION="-b -vvv"
ansible-playbook $INVENTORY $EXTRA $PLAY $OPTION 
EOF
chmod +x purge=cluster.sh  && purge=cluster.sh

주로 발생한 Error

  • /etc/ceph.conf 의 mon host 값 문제
    • ceph-ansible 4.0 버전의 Source 는 task 파일의 Jinja template 를 확인해보면
    • mon 호스트를 루프 돌면서 호스트 정보를 찍어주는데
    • mon v2, v1 버전을 마이그래이션 하는 소스가 들어가있다.
    • 그렇기때문에 git 다운받고 checkout stable-3.2 버전으로 실행시키며
    • extra.yaml 에 monitor_address 값을 넣어준다.
  • 에러내용
fatal: [mon1]: FAILED! => 
  msg: |-
    The conditional check '(ceph_health_raw.stdout != "") and (ceph_health_raw.stdout | default('{}') | from_json)['state'] in ['leader', 'peon']
    ' failed. The error was: No JSON object could be decoded
  • 조치사항
#조치 1 branch checkout 
$ git checkout stable-3.2

$ vi extre.yaml
---
# extra.yaml 
monitor_interface: eth1
#monitor_address: 10.0.3.2 ## 조치 2 여기부분
public_network: 10.0.3.0/24
cluster_network: 10.0.3.0/24
---

* 참고  : https://github.com/ceph/ceph-ansible/issues/3948
* 참고2 : http://lists.ceph.com/pipermail/ceph-users-ceph.com/2019-February/032801.html

Last modified on 2020-06-01