본문으로 건너뛰기
  1. Ocp/

ODF Resource Customization

·
Kubernetes Openshift Ceph Rook
목차

Overview
#

OpenShift에서 가장 쉽게 스토리지를 구성할 수 있는 방법인 OpenShift Data Foundation 를 사용하게 되면 Ceph Cluster를 통해 File, Block, Object 스토리지를 사용할 수 있게 됩니다.

Ceph는 오픈소스 Software Defined Storage 솔루션 중 하나로, 여러 스토리지를 하나로 묶어 하나의 스토리지처럼 사용할 수 있게 해줍니다.
Ceph를 Kubernetes위에 올리려면 Rook이라는 도구를 사용해 올릴 수 있고 이 문서에서 자세히 다루진 않겠습니다.

크게보면 RADOS라는 스토리지 노드 위에 LIBRADOS라는 RADOS의 라이브러리가 있고, Object Storage서비스를 제공하는 RADOSGW(rgw), Block Device(rbd), File system(cephfs)으로 구성되어 있습니다.

여담으로 RADOS는 paxos알고리즘을 기반으로 만들어졌다고 한다!
RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters -4.1 Paxos Service

그리고 이런 서비스들을 제공하는 ceph cluster는 클러스터 관리를 위한 4개의 컴포넌트를 갖고 있습니다.

  • OSD 데몬: 데이터를 저장하고 복제, 분산하는 역할
  • Monitor : 클러스터상태를 체크
  • Manager : 프로세스 메타데이터 및 호스트 메타데이터에 대한 정보 유지
  • MDS(Metadata Service) : CephFS에서 사용하는 메타데이터 저장

대략 구성 요소는 4개 정도고, 단순히 스토리지만 사용하는데에는 이런 자세한 내용까지는 알 필요가 없지만…
이번에 문제가 되었던 부분은 저 데몬들이 Resource Request를 엄청나게 잡아먹는다는 것입니다.

기본적으로 Kubernetes는 클러스터가 가용가능한 리소스들의 총 합을 내부에 가지고 있고, 각 pod가 resource request를 요청할때마다 resource들의 일부분을 내주는데
이때문에 실제 usage는 적어도 resource가 부족해서 pod를 못띄운다는 경고가 뜨게 됩니다.

특히 Operator처럼 필요한 Resource의 limit과 request가 이미 정해져서 돌아가는 경우에는, 아무생각없이 Operator들을 돌렸다간 금방 Cluster resource가 없어지는 모습을 볼 수 있을겁니다.

제 경우에는 worker노드가 16개인 클러스터에 ODF를 올렸었는데, OSD pod들이 cpu를 2코어씩 가져가니까 순식간에 CPU Request Commitment가 80%까지 차버렸었습니다…


사용률은 1core도안되는데 request만 42core인 기묘한 상황

이번 문서에서는 ODF의 ceph cluster의 각 컴포넌트의 resource를 조정하는 방법에 대해서 써보도록 하겠습니다.

물론 Operator가 ODS에 2코어씩 준 이유는 최소한의 성능을 보장하기 위한 안전장치일겁니다.
일반적인 경우엔 권장 사항을 따르는것이 맞지만 저처럼 스토리지 성능은 크게 중요하지 않고, 다른 목적이 있는 경우 resource request양을 조정할 필요가 있습니다.

StorageCluster
#

반드시 클러스터 목적에 맞춰서 resource를 조정하시기 바랍니다.

참고 : Chapter 11. Changing resources for the OpenShift Container Storage components

ODF Operator를 살펴보면 StorageSystem이라는 녀석이 있습니다.
이게 최상단에서 클러스터의 설정들을 관리하는 녀석이라고 생각하시면 됩니다.

yaml을 까보면 StorageSystem이 관리하고 있는 instance들의 정보만 나오지 막상 수정할 수 있는 부분은 보이지 않습니다.

그래서 StorageSystem이 관리하는 instance중 하나인 StorageCluster로 내려갑니다.

yaml을 열어보면 storageCluster에서 관리하는 노드들, instance들, 각종 ceph, noobaa설정이 보입니다.

익숙하지 않다면 storageCluster의 스키마중에서 어떤 항목이 각 컴포턴트와 연관되어있는지 알기 힘들겁니다.

storageCluster의 yaml파일을 조금 밑으로 내려보면 status.relatedObjects에 현재 ODF의 CephClusterNooBaa의 설정을 볼 수 있는 객체의 이름이 적혀있습니다.

...
status:
  relatedObjects:
    - apiVersion: ceph.rook.io/v1
      kind: CephCluster
      name: ocs-storagecluster-cephcluster
      namespace: openshift-storage
    - apiVersion: noobaa.io/v1alpha1
      kind: NooBaa
      name: noobaa
      namespace: openshift-storage
...

일단 CephCluster를 검색해보면 현재 ODF에서 돌고있는 CephCluster의 yaml configuration을 볼 수 있습니다.

여기서 설정값을 참고해서 상위 객체인 storageCluster의 설정을 바꿔주도록 합니다.

ODF의 CephCluster는 Rook의 CephCluster CRD를 따르고 있으니 아래 문서를 참고해도 됩니다.
ROOK : CephCluster CRD

mds, mgr, mon, rgw
#

spec.resources 하위에 명시해줍니다.

spec:
...
  resources:
    mds:
      limits:
        cpu: 300m
        memory: 2Gi
      requests:
        cpu: 300m
        memory: 2Gi
    mgr:
      limits:
        cpu: 300m
        memory: 2Gi
      requests:
        cpu: 300m
        memory: 2Gi
...

osd
#

spec.storageDeviceSets.resources 하위에 명시해줍니다.

spec:
  storageDeviceSets:
    - config: {}
      ...
      name: ocs-deviceset-cekr-stg
      replica: 1
      resources:
        limits:
          cpu: 300m
          memory: 2Gi
        requests:
          cpu: 300m
          memory: 2Gi

⚠ 반드시 클러스터 목적에 맞춰 Resource를 할당해주세요! ⚠

결과
#

이렇게 설정을 변경하고 몇 분 기다리면 바꾼 설정값대로 pod들이 다시 기동하고 클러스터의 CPU Request Commitment는 납득가능한 수준으로 떨어진 것을 확인할 수 있었습니다.

운영하다가 설정해준 request/limit값이 사용량에 비해 낮다고 생각이 들면 다시 조정해주면 됩니다!

물론 테스트 환경이니 이렇게 늘렸다 줄였다 자유롭게 할 수 있는것이겠지만, 실제 적용할 때에는 Dashboard의 면밀한 검토와 논의가 필요할 것 같습니다.

끝!


관련 글

Openshift Certificate 갱신하기
Kubernetes Openshift X509
Overview # 클러스터의 Ingress Certificate를 구성하고나서 n개월이 지나면 인증서가 만료가 됩니다.
OpenShift API for Data Protection(OADP)를 사용한 Backup/Restore
Kubernetes Openshift Backup Restore
Overview # 이번 문서에서는 OpenShift API for Data Protection를 사용하여 Openshift 클러스터의 Resource와 PV를 백업하는 방법과 복구하는 방법에 대해서 기술하겠습니다.
CoreOS partition잡고 설치하기
Kubernetes Openshift CoreOS Storage
Overview # 일반적으로는 크게 쓸 일이 없을지도 모르지만, 내부의 디스크를 파티션을 나눠서 설치해야 할 일이 생길수도 있습니다. 저같은 경우는 OpenShift의 DataFoundation기능을 사용하기 위해서 worker노드의 파티션을 나눌 필요가 있었습니다.