데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      K8S 클러스터의 영구저장소로 ceph 사용하기

      sungil 22.05.19
      11,030 5 0

      K8S 클러스터의 영구저장소로 ceph 사용하기

      본 문서에서는 ceph를 kubernetes의 영구저장장치인 persistent volume의 backend 저장장치로 사용하는 방법에 대해 기술하겠다.

      사용할 수 있는 Ceph 클러스터가 있는 상태에서 k8s 클러스터에서 이를 활용하는 구체적인 방법을 정리한다.

      Ceph?

      ceph는 신뢰도있고 확장가능한 저장소로 범용 사용을 위해 설계되었다.

      기존의 EMC나 NatApp의 상용 스토리지와 비슷한 성능을 일반 하드웨어를 통해 구성하고자하는 목적으로 만들어진 오픈소스이며 자세한 내용은 공식페이지(http://cerph.com)를 참조하자.


      kubernetes환경에서 ceph를 설치하는 rook라는 프로젝트도 존재하며 이에 대해서는 자세히 다룬 블로그가 이미 존재하므로 참조하여 구축할 수 있다.(https://devocean.sk.com/search/techBoardDetail.do?ID=163760)

      Ceph RBD를 kubernetes PV Backend 로..

      Ceph Provisioner

      과거에 ceph rbd를 사용하기 위해 이용했던 것으로 kubespary를 통해 설치시 지정하거나 yaml 을 통해 직접 kubernetes 클러스터에 적용(apply)해서 사용했었다.

      하지만 kubernetes 진영에서 직접적으로 3rd 구현물들을 포함하지 않고 인터페이스를 통해 3rd들이 기능을 제공하도록 하는 전략을 네트워크와 스토리지에 적용하면서 retired로 규정한 상태이다.

      동작은 하지만 권장하는 방법인 ceph-csi를 사용하자.

      ceph-csi

      ceph 커뮤니티에서 kubernetes의 저장소 인터페이스를 구현한 ceph용 구현체(https://github.com/ceph/ceph-csi)이다.

      Ceph CSI 플러그인은 container orchestrator(kubernetes)와 ceph 클러스터간 인터페이스에 대한 구현이다.

      eph 볼륨을 동적으로 배포하고 워크로드와 연결시킨고, ceph의 다양한 제공기능인 rbd(rbd 문서 참조)와 cephfs 볼륨(cephFS 문서참조), nfs 볼륨을 지원한다.

      Helm chart로 설치하고 사용하기

      기본적으로 설치, 삭제 유틸리티가 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

      Helm repo

      앞에서 제시한 코드를 받아서 사용할 수도 있지만 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-charts


      환경반영

      Helm 설치를 위해 환경에 맞도록 값 재지정(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


      Storageclass 준비하기

      앞에서 설치한 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를 통해 PV 만들기

      볼륨을 만들 준비가 완료되었으므로 이제 만들어보자. 다음은 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                     16s


      POD의 저장소를 PV로 지정하기

      POD에서 앞에서 만든 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)을 적용해야 하는 분들에게 도움이 되길 바란다.

      댓글 0

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

      sungil 님의 최신 블로그

      더보기
      동영상 기고하기