Kubernetes는 여러 스토리지 선택지가 있지만,
그중 온프레미스 환경에서 관리가 쉽고 강력한 성능을 내는 Ceph이 있습니다.
Ceph Storage Cluster는 안정적이며, 높은 성능과 Block, File, Object 스토리지로 다양하게 사용이 가능합니다.
Kubernetes Cluster내에 Ceph Storage Cluster를 구성하여 이를 PVC로 사용하는 테스트 입니다.
k8s node 1 : 8vCPU / 32 GiB Memory / 볼륨 100GB + 50GB
k8s node 2 : 8vCPU / 32 GiB Memory / 볼륨 100GB + 50GB
k8s node 3 : 8vCPU / 32 GiB Memory / 볼륨 100GB + 50GB
k8s node 4 : 8vCPU / 32 GiB Memory / 볼륨 100GB + 50GB
Ceph 클러스터를 위해 2개의 MGR / 3개의 MON / 디스크 수만큼의 OSD 데몬이 실행되어야 합니다.
Rook 예제 파일은 거의 모든 환경에서 대응할 수 있는 예제코드를 제공
$ git clone https://github.com/rook/rook.git/
helm 으로 간단하게 rook-ceph 구성
(repo 추가)
$ helm repo add rook-release https://charts.rook.io/release
$ helm search repo rook-ceph
(rook 오퍼레이터 설치)
$ kubectl create namespace rook-ceph
(repo 추가)
$ helm install --namespace rook-ceph rook-ceph rook-release/rook-ceph
$ kubectl get all -n rook-ceph
기본으로 구성할 경우, 2개의 MGR / 3개의 MON / 빈디스크 수만큼의 OSD 데몬이 생성되며
최소 3개 노드이상일 경우 기본구성으로 설치하면 적당함
아래 설치하기 전에 위에 구성한 오퍼레이터가 꼭 동작하고 있어야 하며,
만약 오퍼레이터가 설치 중이라면 설치완료 후 진행
$ helm install --namespace rook-ceph rook-ceph-cluster --set operatorNamespace=rook-ceph rook-release/rook-ceph-cluster
$ kubectl get all -n rook-ceph
rook-ceph-osd-prepare-[host명] 파드는 Completed 되었으나 정작 osd 파드가 생성되지 않음
kubectl -n rook-ceph logs <ceph-osd-prepare-pod>
를 통해 로그 확인 시
'cephosd: skipping OSD configuration as no devices matched the storage settings for this nod' 가 발생하는 것을 확인
각 노드별 볼륨을 추가하여 해결
rook/deploy/examples/ 에 toolbox.yaml 파일을 사용하여 구성
toolbox를 통해 ceph cli를 사용할 수 있음
$ kubectl apply -f toolbox.yaml
$ kubectl get deploy rook-ceph-tools -n rook-ceph
$ kubectl -n rook-ceph exec -it
(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
(toolbox)$ ceph -s
(toolbox)$ ceph osd status
CephCluster의 Dashboard 서비스를 ssl을 사용하지 않도록 변경하고, 기본 url을 변경
$ kubectl get svc -n rook-ceph
$ kubectl edit CephCluster rook-ceph -n rook-ceph
(수정전)
dashboard :
enabled : true
ssl : true
(수정후)
dashboard :
enabled : true
ssl : false
urlPrefix : /ceph-dashboard
대시보드가 ssl을 사용한다면 8443 포트이지만,
ssl을 사용하지 않도록 구성하니 7000 포트로 고정
rook-ceph 예제파일 중 dashboard-loadbalancer.yaml 파일을 수정하고 적용
$ vi dashboard-loadbalancer.yaml
(수정전)
port : 8443
targetPort : 8443
(수정후)
port : 7000
targetPort : 7000
$ kubectl apply -f dashboard-loadbalancer.yaml
이제 rook-ceph-mgr-dashboard-loadbalancer라는 서비스가 LoadBalancer 타입으로 만들어지고 외부 IP가 확인됨
(본 테스트에서는 카카오클라우드 LB를 사용하여 접속)
브라우저에서 http://PublicIP:7000/ceph-dashboard/ 경로로 접속
계정은 admin이고 패스워드는 아래 명령으로 확인할 수 있음
# 패스워드 확인
$ kubectl get secret rook-ceph-dashboard-password -n rook-ceph -o yaml | grep "password:" | awk '{print $2}' | base64 --decode
(아래 접속 화면은 pvc 생성 후 캡처)
PVC를 생성하면 자동으로 PV도 함께 생성되고 연결됨
$ vi cephfs-pvc01.yaml
---
apiVersion : v1
kind : PersistentVolumeClaim
metadata :
name : cephfs-pvc01
spec :
accessModes :
- ReadWriteMany
resources :
requests :
storage : 1Gi
storageClassName : ceph-filesystem
$ kubectl apply -f cephfs-pvc01.yaml
$ kubectl get pvc
CephFS와 가장 큰 차이점은 PVC 생성 시 accessModes값을 ReadWriteOnce로 구성
RBD는 ReadWriteMany로 구성할 수 없음
$ vi cephblock-pvc01.yaml
---
apiVersion : v1
kind : PersistentVolumeClaim
metadata :
name : rbd-pvc
spec :
accessModes :
- ReadWriteOnce
resources :
requests :
storage : 10Gi
storageClassName : ceph-block
$ kubectl apply -f cephblock-pvc01.yaml
$ kubectl get pvc
pod를 만들어 마운트가 되는지 테스트
$ vi ceph-test-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: ceph-test-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: ceph-filesystem-01
mountPath: /data1
- name: ceph-block-01
mountPath: /data2
volumes:
- name: ceph-filesystem-01
persistentVolumeClaim:
claimName: cephfs-pvc01
readOnly: false
- name: ceph-block-01
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
$ kubectl apply -f ceph-test-pod.yaml
(확인)
$ kubectl exec -ti ceph-test-pod /bin/bash
rdb-test-pod01>df -h
설정한 마운트 설정에 맞게 마운트가 된 것을 볼 수 있음
(참고)