Worker Node
Storage Node
Single Node (Tower)
4GPU Server
8GPU Server
10GPU Server
나라장터 등록제품
2GPU Workstation
4GPU Workstation
Name Node
Data Node
가상화
HCI
Network Storage
Data Server
NVMe over Fabrics
SAN Storage
나라장터 등록제품
WEB Server
WAS Server
고성능 DB
타워형서버
나라장터 등록제품
1CPU Workstation
2CPU Workstation
나라장터 등록제품
Cloud
Open Source
NVIDIA
HCI
Backup
MLOps
Kubernetes는 여러 스토리지 선택지가 있지만, 그중 온프레미스 환경에서 관리가 쉽고 강력한 성능을 내는 Ceph이 있습니다. Ceph Storage Cluster는 안정적이며, 높은 성능과 Block, File, Object 스토리지로 다양하게 사용이 가능합니다. 본 포스팅은 Kubernetes Cluster내에 Ceph Storage Cluster를 구성하여 이를 PVC로 사용하는 방법에 대해 설명합니다.
본 테스트에서는 k8s는 4개 노드로 구성했습니다. 서버 스펙은 아래와 같습니다.
100GB 디스크는 k8s 구성을 위해 사용된 OS 디스크이고, 30GB 디스크는 Ceph에서 사용할 디스크입니다. 디스크 1개당 OSD1개로 구성되며, 디스크는 각 노드에 포맷 및 마운트가 되지 않은 상태여야 합니다. Ceph 클러스터를 위해 2개의 MGR / 3개의 MON / 디스크 수만큼의 OSD 데몬이 실행되어야 합니다. 각 데몬마다 최소 Core/Memory 가 정해져 있습니다.(수정가능) 성능을 위해 코어와 메모리를 많이 할당하여 테스트했습니다.
Rook 예제 파일은 거의 모든 환경에서 대응할 수 있는 예제코드를 제공합니다.
helm 으로 간단하게 rook-ceph 구성해 보겠습니다.
rook/deploy/examples/ 에 여러 예제 파일이 존재합니다. helm chart 기본 구성으로 설치합니다. 기본으로 구성할 경우, 2개의 MGR / 3개의 MON / 빈디스크 수만큼의 OSD 데몬이 생성됩니다. 최소 3개 노드이상일 경우 기본구성으로 설치하면 적당합니다. 아래 설치하기 전에 위에 구성한 오퍼레이터가 꼭 동작하고 있어야 합니다. 만약 오퍼레이터가 설치 중이라면 설치완료 후 진행합니다.
기본으로 구성하면, 스토리지 클래스에 Ceph-Block, Ceph-Bucket, Ceph-File system 이 모두 생성됩니다. 필요한 것만 설치한다면 예제파일 참고하여 구성할 수 있습니다.
rook/deploy/examples/ 에 toolbox.yaml 파일을 사용하여 구성합니다. toolbox를 통해 ceph cli를 사용할 수 있습니다.
Ceph-Cluster관련 서비스가 모두 작동한다면, Dashboard 서비스가 동작중인 것을 확인할 수 있습니다. Dashboard는 기본 ClusterIP 서비스로 동작합니다. 외부에서 접속이 가능하게, LoadBalancer로 변경하여 사용합니다. (k8s에 LoadBalancer 서비스가 설치되어 있어야 합니다.) 먼저, CephCluster의 Dashboard 서비스를 ssl을 사용하지 않도록 변경하고, 기본 url을 변경합니다.
대시보드가 ssl을 사용한다면 8443 포트이지만, 우리는 ssl을 사용하지 않도록 구성하니 7000 포트로 고정됩니다. rook-ceph 예제파일 중 dashboard-loadbalancer.yaml 파일을 수정하고 적용합니다.
이제 rook-ceph-mgr-dashboard-loadbalancer라는 서비스가 LoadBalancer 타입으로 만들어지고 외부 IP가 확인됩니다.
$ kubectl get svc -n rook-ceph | |||||
NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
rook-ceph-mgr | ClusterIP | 10.233.49.224 | <none> | 9283/TCP | 157m |
rook-ceph-mgr-dashboard | ClusterIP | 10.233.27.231 | <none> | 7000/TCP | 157m |
rook-ceph-mgr-dashboard-loadbalancer | LoadBalancer | 10.233.23.189 | 192.168.0.170 | 000:31460/TCP | 7m54s |
rook-ceph-mon-a | ClusterIP | 10.233.60.101 | <none> | 6789/TCP,3300/TCP | 159m |
rook-ceph-mon-b | ClusterIP | 10.233.32.79 | <none> | 6789/TCP,3300/TCP | 158m |
rook-ceph-mon-c | ClusterIP | 10.233.1.9 | <none> | 6789/TCP,3300/TCP | 158m |
rook-ceph- rgw-ceph-objectstore | ClusterIP | 10.233.40.192 | <none> | 80/TCP |
브라우저에서 http://192.168.0.170:7000/ceph-dashboard/ 경로로 접속할 수 있습니다. 계정은 admin이고 패스워드는 아래 명령으로 확인할 수 있습니다.
PVC를 생성하면 자동으로 PV도 함께 생성되고 연결됩니다. PVC 생성 예제 파일도 마찬가지로 ceph-csi/example/ 에서 확인할 수 있습니다.
CephFS와 가장 큰 차이점은 PVC 생성 시 accessModes값을 ReadWriteOnce로 구성했다는 것입니다. RBD는 ReadWriteMany로 구성할 수 없습니다.
ceph-filesystem PVC와 ceph-block PVC가 생성되었고 pvc 정보가 bound로 출력되는 것을 확인할 수 있습니다. pod를 만들어 마운트가 되는지 테스트해봅니다.
(확인) | |||||
$ kubectl exec -ti ceph-test-pod /bin/bash | |||||
rdb-test-pod01>df -h | |||||
Filesystem | Size | Used | Avail | Use% | Mounted on |
overlay | 49G | 17G | 30G | 37% | / |
tmpfs | 64M | 0 | 64M | 0% | /dev |
tmpfs | 14G | 0 | 14G | 0% | /sys/fs/cgroup |
10.233.1.9:6789,10.233.60.101:6789--- | 5.0G | 0 | 5.0G | 0% | /data1 |
/dev/rbd0 | 9.8G | 24K | 9.8G | 1% | /data2 |
/dev/mapper/ubuntu --vg-ubuntu--lv | 49G | 17G | 30G | 37% | /etc/hosts |
shm | 64M | 0 | 64M | 0% | /dev/shm |
tmpfs | 28G | 12K | 28G | 1% | /run/secrets /kubernetes.io/serviceaccount |
tmpfs | 14G | 0 | 14G | 0% | /proc/acpi |
tmpfs | 14G | 0 | 14G | 0% | /proc/scsi |
tmpfs | 14G | 0 | 14G | 0% | /sys/firmware |