23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Kubernetes에서 장기(long-term) 데이터를 저장하기 위한 방법으로 스토리지 클래스를 통해 동적으로 퍼시스턴트 볼륨을 생성해서 사용하는 방법이 널리 사용되고 있습니다.
스토리지 인프라가 제공되는 퍼블릭 클라우드과 같은 환경이라면 연동을 위한 CSI 드라이버 설치 및 스토리지 클래스를 정의하는 것으로 모든 준비가 끝나겠지만 그렇지 않은 환경이라면 우선 스토리지 시스템을 구성하는 것에서 부터 출발해야 합니다.
Ceph는 오픈 소스 분산 스토리지 시스템 소프트웨어로 높은 확장성과 블록, 파일, 오브젝트 등 다양한 스토리지 프로토콜 인터페이스 지원을 장점으로 가지고 전세계적으로 널리 사용되고 있는 스토리지 시스템의 하나입니다. SK텔레콤의 개발용 프라이빗 클라우드인 P.CL에서도 사용되고 있고 국내에서는 네이버와 라인에서 수십 PB 규모로 상용 서비스를 위한 스토리지 시스템으로 운영되고 있습니다.
Rook은 Kubernetes를 위한 스토리지 오퍼레이터는 모토로 “분산 스토리지 시스템을 자가 관리, 자가 확장, 자가 복구 스토리지 서비스로 전환하고 스토리지 관리자의 작업(도입, 부트스트래핑, 구성, 프로비저닝, 확장, 업그레이드, 마이그레이션, 재해 복구, 모니터링 및 리소스 관리)을 자동화” 하는 것으로 목표로 하고 있습니다. 또한, 다양한 스토리지 프로바이더를 지원하도록 설계되어 있어서 Ceph 뿐만 아니라 NFS 역시 구성이 가능합니다.
모두가 100% 만족할 수는 없겠지만 초심자와 전문가 모두에게 스토리지 인프라를 구성하고 운영하는데 있어 장점이 될 수 있는 부분이기에 팀에서 개발하는 TKS 서비스의 온-프레미스 버전은 상용 벤더 스토리지와 함께 Rook를 공식 지원하고 있습니다. 글에서 Rook와 Ceph은 동일한 의미로 사용될 것입니다.
Rook의 아키텍처는 아래와 같습니다. Ceph의 각 서비스 데몬들이 POD로 실행되고 있습니다. 그림에서는 사용자 어플리케이션과 같은 노드에서 실행되고 있지만 별도의 전용 스토리지 노드로 구성하는 것도 가능합니다.
기본적으로 Rook의 각 POD들은 보통의 POD와 마찬가지로 쿠버네티스 클러스터 아이피를 할당받게 되지만 별도의 스토리지 네트워크를 사용하는 방법 역시 구성이 가능합니다.
이번 글은 맛보기로 간단하게 Rook로 Ceph 스토리지 클러스터를 구성하는 것에 초점을 맞추도록 하겠습니다.
https://github.com/rook/rook/tree/master/deploy/examples Git 저장소 디렉토리에 각 구성 별 예제들이 존재합니다.
git clone --single-branch --branch v1.8.7
cd rook/deploy/examplesRook 오퍼레이터를 설치합니다.
# CRD와 Rook 오퍼레이터를 설치합니다.
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# rook-ceph 네임스페이스에 rook-ceph-operator POD가 RUNNING 상태 될 때까지 대기합니다.
$ kubectl -n rook-ceph get pod
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-7bf8ff479-h2qht 1/1 Running 0 19mCeph 클러스터를 구성합니다.
cluster로 시작하는 8개의 클러스터 예제 yaml 파일들이 존재하고 cluster.yaml 이 HA를 지원하는 가장 일반적인 구성입니다.
kubectl create -f cluster.yaml버전을 감지하는 POD 부터 CSI, MON, MGR, OSD POD들이 차례대로 실행될 것입니다.
시간이 조금 걸릴니 cluster.yaml 내용을 한 번 살펴 볼까요?
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph # namespace:cluster
spec:
cephVersion:
# 모든 Ceph 서비스 POD 들은 단일 이미지를 사용합니다.
image: quay.io/ceph/ceph:v16.2.7
dataDirHostPath: /var/lib/rook # 각 노드마다 설정 정보를 저장하는 디렉토리
...
mon: # MON 데몬 설정
...
mgr: # MGR 데몬 설정
...
dashboard: # Ceph 내장 대시보드 설정
...
monitoring: # Prometheus 연동르 위한 exporter 설정
...
placement: # POD 스케쥴링 설정
...
storage: # 디스크 구성 설정
...각 예제 파일들에 대해서는 아래 링크에서 더 많은 정보를 얻을 수 있습니다.
인내심을 가지고 기다리면 아래와 같이 모든 POD가 정상 종료되었거나 실행 중인 것을 확인할 수 있습니다. 5개 노드에 노드 마다 1개의 디스크가 사용되었습니다.
$ kubectl get po -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-bv547 3/3 Running 0 14m
csi-cephfsplugin-gfhzw 3/3 Running 0 14m
csi-cephfsplugin-j58jj 3/3 Running 0 14m
csi-cephfsplugin-jbcnp 3/3 Running 0 14m
csi-cephfsplugin-provisioner-6f54f6c477-bf7wp 6/6 Running 0 14m
csi-cephfsplugin-provisioner-6f54f6c477-dh8wl 6/6 Running 0 14m
csi-cephfsplugin-sxxdr 3/3 Running 0 14m
csi-rbdplugin-5cvb4 3/3 Running 0 14m
csi-rbdplugin-8t4f6 3/3 Running 0 14m
csi-rbdplugin-cgn8b 3/3 Running 0 14m
csi-rbdplugin-fjcnf 3/3 Running 0 14m
csi-rbdplugin-j5xww 3/3 Running 0 14m
csi-rbdplugin-provisioner-6d765b47d5-95l9j 6/6 Running 0 14m
csi-rbdplugin-provisioner-6d765b47d5-mh7jh 6/6 Running 0 14m
rook-ceph-crashcollector-eom-workspace-1-775658ffd4-5g254 1/1 Running 0 2m5s
rook-ceph-crashcollector-eom-workspace-2-74b8d6d797-wnwqx 1/1 Running 0 2m6s
rook-ceph-crashcollector-eom-workspace-3-55d87584b-l2qb6 1/1 Running 0 6m25s
rook-ceph-crashcollector-eom-workspace-4-7b945bd65f-9sgtc 1/1 Running 0 5m21s
rook-ceph-cra$ kubectl get po -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-bv547 3/3 Running 0 14m
csi-cephfsplugin-gfhzw 3/3 Running 0 14m
csi-cephfsplugin-j58jj 3/3 Running 0 14m
csi-cephfsplugin-jbcnp 3/3 Running 0 14m
csi-cephfsplugin-provisioner-6f54f6c477-bf7wp 6/6 Running 0 14m
csi-cephfsplugin-provisioner-6f54f6c477-dh8wl 6/6 Running 0 14m
csi-cephfsplugin-sxxdr 3/3 Running 0 14m
csi-rbdplugin-5cvb4 3/3 Running 0 14m
csi-rbdplugin-8t4f6 3/3 Running 0 14m
csi-rbdplugin-cgn8b 3/3 Running 0 14m
csi-rbdplugin-fjcnf 3/3 Running 0 14m
csi-rbdplugin-j5xww 3/3 Running 0 14m
csi-rbdplugin-provisioner-6d765b47d5-95l9j 6/6 Running 0 14m
csi-rbdplugin-provisioner-6d765b47d5-mh7jh 6/6 Running 0 14m
rook-ceph-crashcollector-eom-workspace-1-775658ffd4-5g254 1/1 Running 0 2m5s
rook-ceph-crashcollector-eom-workspace-2-74b8d6d797-wnwqx 1/1 Running 0 2m6s
rook-ceph-crashcollector-eom-workspace-3-55d87584b-l2qb6 1/1 Running 0 6m25s
rook-ceph-crashcollector-eom-workspace-4-7b945bd65f-9sgtc 1/1 Running 0 5m21s
rook-ceph-crashcollector-eom-workspace-5-7f899d8548-7hg7k 1/1 Running 0 6m22s
rook-ceph-mgr-a-66df9f74f-bsqjp 1/1 Running 0 6m40s
rook-ceph-mon-a-59f769fc4-jblm6 1/1 Running 0 16m
rook-ceph-mon-b-64cbf97985-ms7bl 1/1 Running 0 9m22s
rook-ceph-mon-c-b8688c65c-z72ql 1/1 Running 0 8m25s
rook-ceph-operator-7bf8ff479-h2qht 1/1 Running 0 42m
rook-ceph-osd-0-5cb5854774-6zz6v 1/1 Running 0 5m42s
rook-ceph-osd-1-7f6c7bff89-ktz9d 1/1 Running 0 5m24s
rook-ceph-osd-2-f4d4f77c4-cwdx4 1/1 Running 0 5m21s
rook-ceph-osd-3-866f76b8c9-q7hs5 1/1 Running 0 2m6s
rook-ceph-osd-4-656dd6cc76-9fxbq 1/1 Running 0 2m5s
rook-ceph-osd-prepare-eom-workspace-1--1-55rj4 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-2--1-pr2vm 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-3--1-4lgf5 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-4--1-qt5kh 0/1 Completed 0 5m57s
rook-ceph-osd-prepare-eom-workspace-5--1-29rks 0/1 Completed 0 5m57sshcollector-eom-workspace-5-7f899d8548-7hg7k 1/1 Running 0 6m22s
rook-ceph-mgr-a-66df9f74f-bsqjp 1/1 Running 0 6m40s
rook-ceph-mon-a-59f769fc4-jblm6 1/1 Running 0 16m
rook-ceph-mon-b-64cbf97985-ms7bl 1/1 Running 0 9m22s
rook-ceph-mon-c-b8688c65c-z72ql 1/1 Running 0 8m25s
rook-ceph-operator-7bf8ff479-h2qht 1/1 Running 0 42m
rook-ceph-osd-0-5cb5854774-6zz6v 1/1 Running 0 5m42s
rook-ceph-osd-1-7f6c7bff89-ktz9d 1/1 Running 0 5m24s
rook-ceph-osd-2-f4d4f77c4-cwdx4 1/1 Running 0 5m21s
rook-ceph-osd-3-866f76b8c9-q7hs5 1/1 Running 0 2m6s
rook-ceph-osd-4-656dd6cc76-9fxbq 1/1 Running 0 2m5s
rook-ceph-osd-prepare-eom-workspace-1--1-55rj4 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-2--1-pr2vm 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-3--1-4lgf5 0/1 Completed 0 5m58s
rook-ceph-osd-prepare-eom-workspace-4--1-qt5kh 0/1 Completed 0 5m57s
rook-ceph-osd-prepare-eom-workspace-5--1-29rks 0/1 Completed 0 5m57sRook toolbox를 실행해서 확인해 보도록 하겠습니다.
kubectl apply -f toolbox.yaml
$ kubectl get po -n rook-ceph | grep rook-ceph-tools
rook-ceph-tools-5c6844fcd5-dlj4q 1/1 Running 0 32s
$ kubectl exec -it -n rook-ceph rook-ceph-tools-5c6844fcd5-dlj4q -- bash
[rook@rook-ceph-tools-5c6844fcd5-dlj4q /]$ ceph -s
cluster:
id: c86329bf-9bd9-42f4-b3d2-6f17b86576a7
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 10m)
mgr: a(active, since 8m)
osd: 5 osds: 5 up (since 4m), 5 in (since 5m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 26 MiB used, 500 GiB / 500 GiB avail
pgs: 1 active+clean이제 다른 어플리케이션들이 Ceph을 퍼시스턴트 볼륨으로 사용할 수 있는 준비가 다 끝난 것일까요? “네” 라고 대답할 수 있으면 좋겠지만 아직 넘어야 할 산이 있습니다. “그 얘기는 언제 준비될 지 모를 다음 글에...” 라고 쓰고 싶지만 볼륨을 생성하고 사용하는 모습까지는 보여드려야 맛보기라 할 수 있겠습니다.
쿠버네티스에서 스토리지 클래스를 통해 동적으로 퍼시스턴트 볼륨을 생성하고 사용할 수 있기 때문에 스토지리 클래스를 정의해야 합니다. 그럼 끝인가요? 네, 아직 한 단계가 더 필요합니다. Ceph은 블록, 파일, 오브젝트 3가지 스토리지 프로토콜을 모두 지원할 수 있다고 말씀을 드렸었는데 어떤 인터페이스를 사용할지 먼저 추가 설정이 필요합니다. 쿠버네티스는 블록, 파일 2가지 타입의 퍼시스턴트 볼륨을 지원하고 Rook는 이 2가지 타입을 모두 지원합니다.
<span style="font-size:16px;">CephBlockPool</span> ↔ <span style="font-size:16px;">StorageClass</span> (<span style="font-size:16px;">provisioner: rook-ceph.rbd.csi.ceph.com</span>)
<span style="font-size:16px;">CephFilesystem</span> ↔ <span style="font-size:16px;">StorageClass</span> (<span style="font-size:16px;">provisioner: rook-ceph.cephfs.csi.ceph.com</span>)
쿠버네티스에서 오브젝트 스토리지에 대한 인터페이스는 다음의 Container Object Storage Interface (COSI) 에서 진행 중으로 (현재 알파 수준) Rook에서는 2022년 상반기 중에 지원할 것을 목표로 하고 있습니다.
대신 Rook 자체적으로 StorageClass를 Bucket을 생성하는 용도로 제공하며 AWS S3 인터페이스를 통해 어플리이션에서 사용할 수 있습니다.
<span style="font-size:16px;">CephObjectStore</span> ↔ <span style="font-size:16px;">StorageClass</span> (<span style="font-size:16px;">provisioner: rook-ceph.ceph.rook.io/bucket</span>)
블록 퍼시스턴트 볼륨을 구성하고 사용하는 예제를 살펴보겠습니다. 아래 storageclass.yaml 파일에는 블록 Ceph Pool을 생성하고 이에 연동되는 스토리지 클래스(rook-ceph-block)를 생성합니다.
kubectl apply -f csi/rbd/storageclass.yamlRook toolbox를 통해 ‘replicapool’ 이라는 Ceph Pool이 추가 생성된 것을 확인할 수 있습니다.
$ kubectl exec -it -n rook-ceph rook-ceph-tools-5c6844fcd5-dlj4q -- bash
[rook@rook-ceph-tools-5c6844fcd5-dlj4q /]$ ceph -s
cluster:
id: c86329bf-9bd9-42f4-b3d2-6f17b86576a7
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 7m)
mgr: a(active, since 45m)
osd: 5 osds: 5 up (since 42m), 5 in (since 43m)
data:
pools: 2 pools, 33 pgs
objects: 0 objects, 0 B
usage: 26 MiB used, 500 GiB / 500 GiB avail
pgs: 39.394% pgs unknown
57.576% pgs not active
19 creating+peering
13 unknown
1 active+clean
[rook@rook-ceph-tools-5c6844fcd5-dlj4q /]$ rados lspools
device_health_metrics
replicapoolceph-block-block 스토리지 클래스를 사용하는 Wordpress와 MySQL 예제가 제공됩니다. 아래와 같이 실행하면 됩니다.
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml아래와 같이 퍼시스턴트 볼륨이 생성된 것을 확인할 수 있습니다.
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-3a09fdde-b0c8-4833-a733-4cac133f48c5 20Gi RWO Delete Bound default/wp-pv-claim rook-ceph-block 2m40s
pvc-5f340755-985d-4d9e-92b1-4a9ca8c9bf38 20Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 4m40s
(kubernetes-admin-cluster.local@cluster.local:default) [centos@eom-workspace-1 examples]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-5f340755-985d-4d9e-92b1-4a9ca8c9bf38 20Gi RWO rook-ceph-block 4m45s
wp-pv-claim Bound pvc-3a09fdde-b0c8-4833-a733-4cac133f48c5 20Gi RWO rook-ceph-block 2m49s자 이제 맛보기는 끝이 났습니다. 마지막은 워드프레스 화면으로 마무리하겠습니다.

DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.