23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
본 문서에서는 ceph를 kubernetes의 영구저장장치인 persistent volume의 backend 저장장치로 사용하는 방법에 대해 기술하겠다.
사용할 수 있는 Ceph 클러스터가 있는 상태에서 k8s 클러스터에서 이를 활용하는 구체적인 방법을 정리한다.
ceph는 신뢰도있고 확장가능한 저장소로 범용 사용을 위해 설계되었다.
기존의 EMC나 NatApp의 상용 스토리지와 비슷한 성능을 일반 하드웨어를 통해 구성하고자하는 목적으로 만들어진 오픈소스이며 자세한 내용은 공식페이지(http://cerph.com)를 참조하자.
kubernetes환경에서 ceph를 설치하는 rook라는 프로젝트도 존재하며 이에 대해서는 자세히 다룬 블로그가 이미 존재하므로 참조하여 구축할 수 있다.(https://devocean.sk.com/search/techBoardDetail.do?ID=163760)
과거에 ceph rbd를 사용하기 위해 이용했던 것으로 kubespary를 통해 설치시 지정하거나 yaml 을 통해 직접 kubernetes 클러스터에 적용(apply)해서 사용했었다.
하지만 kubernetes 진영에서 직접적으로 3rd 구현물들을 포함하지 않고 인터페이스를 통해 3rd들이 기능을 제공하도록 하는 전략을 네트워크와 스토리지에 적용하면서 retired로 규정한 상태이다.
동작은 하지만 권장하는 방법인 ceph-csi를 사용하자.
ceph 커뮤니티에서 kubernetes의 저장소 인터페이스를 구현한 ceph용 구현체(https://github.com/ceph/ceph-csi)이다.
Ceph CSI 플러그인은 container orchestrator(kubernetes)와 ceph 클러스터간 인터페이스에 대한 구현이다.
eph 볼륨을 동적으로 배포하고 워크로드와 연결시킨고, ceph의 다양한 제공기능인 rbd(rbd 문서 참조)와 cephfs 볼륨(cephFS 문서참조), nfs 볼륨을 지원한다.
기본적으로 설치, 삭제 유틸리티가 https://github.com/ceph/ceph-csi/tree/devel/examples 의 하부디렉토리로 rbd, cephfs, nfs별로 제공되고 있다.
설치: plugin-deploy.sh
삭제: plugin-teardown.sh
앞에 소개한 설치 스크립트를 통해 설정을 추가하여 k8s에 ceph 클러스터를 연결가능하지만 너무 복잡하다.
이에따라 일반적으로 팀에서 사용하던 방법이고 k8s에서 간결한 배표툴인 helm을 사용하여 적용한다.
Helm chart의 코드는 다음 위치에서 확인할 수 있다. https://github.com/ceph/ceph-csi/tree/devel/charts/ceph-csi-rbd
앞에서 제시한 코드를 받아서 사용할 수도 있지만 ceph에서는 helm repo를 통해 챠트를 제공하고 있다. 다음과 같이 등록하자.
siim@adm:~/ceph-csi$ helm repo add ceph-csi https://ceph.github.io/csi-charts
"ceph-csi" has been added to your repositories
siim@adm:~/ceph-csi$ helm search repo ceph-csi
NAME CHART VERSION APP VERSION DESCRIPTION
ceph-csi/ceph-csi-cephfs 3.6.1 3.6.1 Container Storage Interface (CSI) driver, provi...
ceph-csi/ceph-csi-rbd 3.6.1 3.6.1 Container Storage Interface (CSI) driver, provi...helm repo add ceph-csi https://ceph.github.io/csi-chartsHelm 설치를 위해 환경에 맞도록 값 재지정(value-override) 파일을 준비하자. 전체 값은 다음 링크(https://github.com/ceph/ceph-csi/tree/devel/charts/ceph-csi-rbd#configuration)에서 확인 가능하고 여기서는 기본적으로 연결한 ceph 클러스터에 대한 monitor만 지정한다. 그 외 storage class등을 지정할 수 있으나 여기서는 다음 단계에서 따로 추가한다.
csiConfig:
- clusterID: "myceph"
monitors:
- "192.168.5.68:6789"
- "192.168.5.69:6789"
- "192.168.5.72:6789"앞서 지정한 값들 중 clusterID를 ‘myceph’로 지정한 것에 유의하자. 다음 단계에서 이 클러스터를 지정하는 식별자로 사용할 것이다.
앞에서 준비한 파일을 지정하여 설치한다. 본 예시에서는 ceph-csi를 위해 전용 네임스페이스 “ceph-csi-rbd”를 추가했다.
siim@adm:~/ceph-csi$ kubectl create namespace "ceph-csi-rbd"
namespace/ceph-csi-rbd created
siim@adm:~/ceph-csi$ helm install --namespace "ceph-csi-rbd" "ceph-csi-rbd" ceph-csi/ceph-csi-rbd -f ceph-csi.vo
NAME: ceph-csi-rbd
LAST DEPLOYED: Thu May 12 05:58:55 2022
NAMESPACE: ceph-csi-rbd
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Examples on how to configure a storage class and start using the driver are here:
https://github.com/ceph/ceph-csi/tree/v3.6.1/examples/rbd설치가 완료되면 다음과 같은 자원들이 배포된 것을 확인할 수 있다. 각 daemonset을 통해 노드별로 plugin이 배포되고 deployment로 복수의 provisioner가 배포된다.
siim@adm:~/ceph-csi$ kubectl get all -n ceph-csi-rbd
NAME READY STATUS RESTARTS AGE
pod/ceph-csi-rbd-nodeplugin-2595q 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-7jrlt 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-czhxz 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-jq8sq 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-k7tvr 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-kcmcr 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-vh22j 3/3 Running 0 26h
pod/ceph-csi-rbd-nodeplugin-wr2sn 3/3 Running 0 26h
pod/ceph-csi-rbd-provisioner-d4c876f6c-2ccqp 7/7 Running 0 26h
pod/ceph-csi-rbd-provisioner-d4c876f6c-5tqgh 7/7 Running 0 26h
pod/ceph-csi-rbd-provisioner-d4c876f6c-dk8g4 7/7 Running 0 26h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ceph-csi-rbd-nodeplugin-http-metrics ClusterIP 10.233.76.13 <none> 8080/TCP 26h
service/ceph-csi-rbd-provisioner-http-metrics ClusterIP 10.233.69.19 <none> 8080/TCP 26h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/ceph-csi-rbd-nodeplugin 8 8 8 8 8 <none> 26h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ceph-csi-rbd-provisioner 3/3 3 3 26h
NAME DESIRED CURRENT READY AGE
replicaset.apps/ceph-csi-rbd-provisioner-d4c876f6c 3 3 3 26h앞에서 설치한 csi와 연동하는 스토리지 클래스를 구성하자. 앞 단계에서는 ceph 클러스터의 접근 경로를 추가했는데 인증을 위한 정보가 부족하다.
여기서는 인증 정보를 갖는 시크릿을 만들고 스토리지 클래스에서 참고하도록 하겠다.
인증 정보는 어떻게 가져올수 있을까? ceph 클러스터에서 ceph auth list 명령을 통해 내부에 정의된 계정의 값을 가져올 수 있다.
아래 예시에서는 계정 kube와 키 ‘AAAA1RBc8hreERAAVyUl+grjQbBwVSfEco3tSg==’ 를 사용하겠다.
그리고 rbd를 저장할 pool은 kube를 사용하겠다. 계정 생성이나 풀 생성관련해서는 본 글의 주제를 벗어나므로 공식사이트(https://ceph.com)를 참조하자.
root@s72:~# ceph auth list
mds.s72
key: AAAg3xBcNX2iAxAAQahelIpdLlB9NU4aHSLhvw==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
...
client.glance
key: AQkCXhVcfE+mDxABlLkE74ZGJwn2u4eBTTTT6w==
caps: [mon] profile rbd
caps: [osd] profile rbd pool=images
client.kube
key: AAAA1RBc8hreERAAVyUl+grjQbBwVSfEco3tSg==
caps: [mon] allow *
caps: [osd] allow class-read object_prefix rbd_children, allow rwx pool=kube
client.pool48
...시크릿은 다음과 같이 만든다. stringData에서 userID와 userKey에 앞에서 확인할 값들을 기록하자. 시크릿이 kube-system에 저장한다.
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: kube-system
stringData:
userID: kube
userKey: "AAAA1RBc8hreERAAVyUl+grjQbBwVSfEco3tSg=="
---스토리지 클래스는 다음과 같이 지정한다. 앞에서 사용하기로한 kube를 사용하자. 클러스터는 helm chart를 설치할때 지정한 myceph를 사용하도록 했다. 앞에서 만든 시크릿에 대한 지정도 파라미터에 넣었다. reclaimPolicy는 사용하던 Pod가 삭제되었을 때 함께 만들었던 볼륨을 어떻게 처리할 것인지를 지정하는 것이다. 여기서는 함께 지우도록(Delete) 했다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rbd
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce","ReadOnlyMany","ReadWriteMany"]'
provisioner: rbd.csi.ceph.com
parameters:
clusterID: "myceph"
pool: "kube"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard볼륨을 만들 준비가 완료되었으므로 이제 만들어보자. 다음은 pvc를 통해 볼륨을 만드는 예제이다.
스토리지 클래스를 앞에서 정의한 ‘rbd’를 사용하여 pvc를 배포하면
siim@adm:~/ceph-csi$ cat pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: rbd
siim@adm:~/ceph-csi$ kubectl apply -f pvc.yaml
persistentvolumeclaim/rbd-pvc create동적으로 pv가 생성되고 pvc와 연결되는 것을 확인할 수 있다.
siim@adm:~/ceph-csi$ kubectl get pvc rbd-pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
rbd-pvc Bound pvc-c6692463-3df0-415c-adf7-eac1df55fd9b 1Gi RWO rbd 10s
siim@adm:~/ceph-csi$ kubectl get pv pvc-c6692463-3df0-415c-adf7-eac1df55fd9b
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-c6692463-3df0-415c-adf7-eac1df55fd9b 1Gi RWO Delete Bound default/rbd-pvc rbd 16sPOD에서 앞에서 만든 rbd-pvc를 사용하도록 지정하면 PV를 활용할 수 있다.
siim@adm:~$ cat pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: docker.io/library/nginx:latest
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html
volumes:
- name: mypvc
persistentVolumeCl
claimName: rbd-pvc
readOnly: false
siim@adm:~$ kubectl apply -f pod.yaml
pod/csi-rbd-demo-pod created그외에도 ceph의 snapshot을 사용한 복제/백업 등 다양한 예제를 다음 링크를 통해 참조할 수 있다.(https://github.com/ceph/ceph-csi/tree/devel/examples/rbd)
Ceph는 고가의 스토리지 장비에서 제공하는 다양한 기능을 오픈소스를 통해 제공하는 스토리지이며 SKT에 주요 맴버들이 있는 오픈소스이기도 하다.
이 포스트에서는 이러한 ceph를 쿠버네티스에서 활용하는 하나의 방법을 알아보았다.
특히 기존의 사용하던 방법(rbd-provisoner)이 지원만료됨에따라 새로운 방식(ceph-csi)을 적용해야 하는 분들에게 도움이 되길 바란다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.