테크믈리에의 리뷰 공간

[k0s Cluster 구축] 5. k0s 클러스터에서 Rook Ceph Block Storage 사용하기 본문

프로그래밍|소프트웨어/K0S

[k0s Cluster 구축] 5. k0s 클러스터에서 Rook Ceph Block Storage 사용하기

테크믈리에 2023. 12. 1. 17:19

 

Rook Ceph란?

 

 

https://rook.io

 

Rook

Storage Operators for Kubernetes Rook turns distributed storage systems into self-managing, self-scaling, self-healing storage services. It automates the tasks of a storage administrator: deployment, bootstrapping, configuration, provisioning, scaling, upg

rook.io

 

Rook Ceph는 k8s 환경에서 가장 인기 많은 Persistence Storage 관리 방식으로, Ceph 기반 저장소를 관리하는 다수의 Agent를 자동으로 띄워 사용자가 보다 관리하기 쉽게 도와준다.

 

비교 대상으로는 Portworx, Robin, Longhorn, OpenEBS 등이 있는데, 앞선 2개는 유료이지만 강력한 저장 방식을 원할 때 사용하면 좋고 Longhorn 및 OpenEBS는 Local 저장소를 사용하여 Best-Effort로 Pod가 동작하게 하고 싶을 때 선택하는 것이 좋다.

 

Rook Ceph는 분산 저장소이기 때문에 I/O 속도가 민감하기 보단 데이터의 안정성이 보다 중요할 때 선택하는 것이 좋다.

 

 

사전 준비

 

우선, 공식 홈페이지에 나온 설명대로라면 Rook Ceph를 올릴 수 있는 저장 장치 종류는 위와 같다.

하지만, 실험해본 결과 순수 Raw devices와 LVM Logical Volumes 등은 잘 인식이 되지 않는 것을 확인했다.

 

테스트 해본 결과로는 파티션이 하나라도 생성되어 있고, 해당 파티션에 ext4 파일 포맷으로 포맷까지 해둔 경우 인식이 잘 되는 것을 확인했는데, 파티션만 있어도 되는지 혹은 ext4 등으로 포맷 해두는 것도 필수 조건인지는 모르겠다.

 

다만, ext4로 포맷을 했을 때 잘 됐던 기억이 있기 때문에 이를 기준으로 내용을 설명하도록 하겠다.

 

우선은, 각 노드에서 아래 명령어로 현재 장치에 연결되어 있는 디스크 현황을 확인하도록 하자.

# 장치 이름까지 확인하려면
sudo fdisk -l

# 파티션, UUID, FSTYPE, MOUNTPOINT를 확인하려면
sudo lsblk -f

위의 사진 예시에서는 /dev/sda에 OS가 설치되어 있으며 /dev/sdb는 파티션 1개가 ext4로 포맷되었지만 마운트가 되지 않았다는 것을 알 수 있다.

 

위 명령어를 통하여 어떤 장치가 현재 연결되어 있고, 어떻게 파티션이 나뉘어 있고, 어떻게 포맷 되어 있는지 정보 등을 확인한 다음 Rook Ceph를 설치할 장치를 선정하도록 하자. (모든 노드에서 Rook Ceph를 설치할 디스크의 종류는 nvme, ssd, hdd 중 하나로 통일되어야 한다.)

 

이 때, 유의할 것은 만약 Rook Ceph에 사용하고 싶지 않은 장치라고 한다면 미리 어떠한 위치에든 마운트를 시켜놓는 것이 좋다는 것이다.

Rook Ceph를 설치할 때 장치를 지정해서 설치할 수도 있지만, 귀찮다면 전체 검색 후 사용 가능한 모든 장비를 사용하게 할 수도 있는데, 이 경우 마운트 되어 있지 않고 파티션이 ext4로 포맷되어 있는 모든 장치는 Rook Ceph가 점유하게 되며 안에 들어 있는 모든 데이터는 삭제된다.

 

가령 예를 들어, 현재 /dev/nvme0n1에 OS가 설치되어 있고 /dev/sda에 SSD가, /dev/sdb에 HDD가 연결되어 있으며 Rook Ceph를 위해서 /dev/sda만을 사용하고 싶다고 가정해보자.

 

OS가 설치된 저장 장치는 무시하고, Rook Ceph에 사용할 /dev/sda를 먼저 보도록 하자.

# fdisk로 /dev/sda 해당 저장장치 선택 (sda는 예시일 뿐, 본인에 맞게 수정)
# 만약 한번도 사용한 적 없는 장치이거나 이미 FileSystem이 있는 장치라면 wipefs만 돌려도 충분하다 
sudo fdisk /dev/sda

# Command (m for help)라고 나타난 프롬프트에서 나머지 진행
# 우선 남은 파티션을 전부 삭제한다. (모든 파티션이 삭제되었다고 할 때까지 반복)
d

# 전체 파티션 삭제 후에는 새로운 파티션을 생성한다.
n
# 단일 파티션인 경우에는 엔터만 계속 입력

# 파티션 생성 후 해당 내용 확인
p

# 파티션 변경 정보 저장
w

# 파티션을 포맷한다
sudo mkfs.ext4 /dev/sda1

# 초기화
sudo wipefs -a /dev/sda1

 

이렇게 진행을 하면 아래와 같이 /dev/sda가 FSTYPE이 아예 없는 상태가 되어있을 것이다.

 

그 다음에는 /dev/sdb를 Rook Ceph에 안 잡히게 하기 위한 방법이다.

# ext4 파일 포맷으로 포맷되어 있다고 가정
# 우선, UUID값을 확인한다.
sudo blkid | grep /dev/sdb

# nano나 vi 등으로 fstab 파일 열기
sudo nano /etc/fstab

# fstab 내부 마지막 줄에 아래와 같은 내용을 삽입한다
UUID=<앞서 확인한 ID값> <마운트 위치> ext4 defaults 0 0

# 파일 저장 후 내용 반영
sudo mount -a

# 이 때, 만약 systemctl 명령어를 사용하라고 나오면 해당 명령어 그대로 실행

 

이렇게 Rook Ceph에서 쓸 저장 장치는 unmount 상태로 놔두고 사용하지 않을 장치는 전부 mount 해두었다면 준비가 끝났다.

 

 

Rook Ceph 설치

 

우선은 Git으로부터 Rook Ceph 레포지토리를 다운받아 두자.

git clone --single-branch --branch v1.13.3 https://github.com/rook/rook.git

 

본격적으로 올리기에 앞서서 Rook Ceph Operator가 k0s와 정상적으로 소통할 수 있게 파일 내용을 수정해야한다.

cd rook/deploy/examples

nano operator.yaml
# operator.yaml파일 수정
# ROOK_CSI_KUBELET_DIR_PATH를 찾아서 값을 "/var/lib/k0s/kubelet"으로 변경
# ROOK_ENABLE_DISCOVERY_DAEMON를 찾아서 true로 변경

 

그 다음에는 cluster.yaml을 열어 본인 입맛에 맞게 고치도록 하자.

(ex. dashboard를 ssl 없이 사용 하려면 dashboard 아래의 enabled: true / mgr: modules: - name: rook enabled: true 추가)

 

이제 Rook Ceph를 올려보도록 하자. (RBD 기준)

kubectl apply -f crds.yaml -f common.yaml -f operator.yaml

# 위의 명령어 입력 후 Pod가 정상적으로 뜰 때까지 기다린 다음 진행
# OpenLens로 rook-ceph Namespace를 보거나 kubectl get pods -n rook-ceph --watch
kubectl apply -f cluster.yaml

# 다시 Pod들을 보면서 정상적으로 올라가는지 확인한다.
# 전부 정상적으로 올라갔다면 다음으로 진행
kubectl apply -f ./csi/rbd/storageclass.yaml

# 만약 Dashboard를 MetalLB 등으로 LoadBalancer로 접근하려면
kubectl apply -f dashboard-loadbalancer.yaml

# 만약 Node Port로 접근하려면
kubectl apply -f dashboard-external-https.yaml

# Dashboard 로그인 비밀번호 확인 방법 (아이디는 admin)
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

# ToolBox를 띄우는 방법
kubectl apply -f toolbox.yaml

 

정상적으로 전부 띄웠다면 대시보드에 접근 시 아래와 같은 화면을 볼 수 있다.

 

 

Rook Ceph Dashboard 설정

 

정상적으로 Rook Ceph가 올라갔다면 이제 Persistent Storage를 할당하는데 문제는 없을 것이다.

다만, cluster.yaml 값에 따라 Dashboard에 접근하여 사용하려다보면 몇몇 설정값이 안 보이면서 Orchestrator 관련 오류 문구가 뜰 것인데, 이를 해결하는 방법은 다음과 같다.

 

# ToolBox 진입
kubectl -n rook-ceph exec -it <toolbox Pod 이름> -- /bin/bash

ceph mgr module enable rook
ceph orch set backend rook
ceph orch status

 

 

 

Reference

https://docs.k0sproject.io/v1.28.4+k0s.0/examples/rook-ceph/

https://rook.io/docs/rook/latest-release/Getting-Started/quickstart/#create-a-ceph-cluster

 

 

P.S. Rook Ceph를 삭제하기 위해서는 다음을 참고하자

https://rook.io/docs/rook/v1.12/Getting-Started/ceph-teardown/#delete-the-block-and-file-artifacts

Comments