본문 바로가기

Cloud Native

[Kubernetes] 쿠버네티스 API 확장하기 - custom resource, crd

Helm chart를 설치할 때 다음과 같은 에러가 나올 때가 있다. ( 아래는 argocd를 재설치하다가 발생한 에러 )

 

Error: release argo failed: customresourcedefinitions.apiextensions.k8s.io "workflows.argoproj.io" already exists

customresourcedefinitions가 이미 있어서 설치가 안된다는 내용이다.

 

해결 방법에는 두 가지가 있다.

 

1. customresourcedefinition를 삭제하고, helm chart를 설치

 

$ kubectl delete crd crd_name

 

2. 이미 존재하는 customresourcedefinition의 재설치를 건너뛰고 helm chart를 설치 → --no-crd-hook 옵션 사용

 

$ helm install ... --no-crd-hook

 

 

그래서 CRD(Custom Resource Definiton)가 뭐지? 🧐

Kubernetes API

커스텀 리소스를 알기 전에 Kuberentes API도 잠깐 이해하면 좋을 듯 하다.

 

Kubernetes를 다루는 핵심은 API 서버이다. API 서버는 최종 사용자, 클러스터의 다른 부분 그리고 외부 컴포넌트가 서로 통신할 수 있도록 HTTP API를 제공한다.

 

쿠버네티스 API를 사용하면 쿠버네티스 API 오브젝트(예: 파드(Pod), 네임스페이스(Namespace), 컨피그맵(ConfigMap), 이벤트(Event))를 질의하고 조작할 수 있다.

 

대표적으로 kubectl를 활용해 Kubernetes API를 통해 파드를 생성하거나 관리하는 것이다.

Custom Resource

쿠버네티스 API를 확장해서 사용하기 위한 것이 Custom resource이다.

 

커스텀 리소스를 활용하면 사용자가 정의하는 API Object를 만들 수 있다. (pod, namespace와 같은 빌트인 리소스같은 것)

 

커스텀 리소스를 생성하기 위한 단계는 다음과 같다. (Declarative - 선언적 방식을 지향한다.)

 

1. custom resource 컨트롤러를 구현하고 생성한다.

 

커스텀 리소스의 생성을 감지하고, desired state가 되도록 적절한 작업을 수행하는 컨트롤러를 생성한다.

 

2. crd (custom resource definition)을 정의하고, 생성한다.

 

custom resource definition이라는 내장된 api object를 생성하는 것인데, 이는 custom resource를 정의하는 것이다.

커스텀 리소스가 어떤 데이터로 구성되어있는지 정의하는 것으로 리소스를 생성하는 것은 아니다.

 

3. crd에 맞춰 custom resource를 생성한다.

 

이 때 생성되는 커스텀 리소스는 etcd에 저장된 단순한 데이터일 뿐이다. 별도의 컨트롤러를 통해 리소스가 원하는 상태로 유지되도록 해야 한다.

 

4. 컨트롤러가 custom resource의 생성을 감지하고, desired state가 되도록 작업을 수행한다.

 

* coreos에서 제공하는 operator sdk 도구는 커스텀 리소스, 컨트롤러를 구현하기 위한 툴을 제공하고 있다. 

 

operator-framework/operator-sdk

SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding. - operator-framework/operator-sdk

github.com

argocd는 커스텀 리소스를 통해 stateless하게 어플리케이션을 관리하고 있었다.

 

실제로 커스텀 리소스를 만들어보면 kubernetes도 더 잘 이해하고, 내가 원하는 어플리케이션을 만들 수 있을 것 같다. 👍

( → 포스팅으로 이어지길... 👩🏻‍💻) 이 블로그 참고하기