일을 하다보니 Kubernetes 의 Custom Resource Definition 를 사용할 일이 생긴 김에 Custom Resource Definition(CRD) 에 대해서 정리를 해보았습니다. :)
Kubernetes 는 확장성이 좋게 구조화 되어 있습니다. 기본적으로 제공하는 Resource(POD, CRD, …) 외에도 필요한 경우 Resource 를 Custom Resource 로 추가하여 Kubernetes 의 기본 Resource 와 함께 사용이 가능합니다. 이런 Custom Resource 들은 Custom Controller 를 만들어서 사용이 가능합니다.
Custom Resource Definition(CRD) 는 위에서 이야기 한것 처럼 Operator 라고 불리는 Custom Controller 와 함께 사용이 되는데, 일반적으로 이런 구조를 Operator Patter 이라고 이야기를 합니다.
Operator, Custom Resource Definition(CRD), Custom Resource(CR)?
- Operator : Custom Resource Definition(CRD)을 기반으로 Kubernetes API 의 기능을 확장하는 것(실제 Operator 와 비슷)
- Custom Resource Definition(CRD) : Operator 에서 사용하는 Resource Object 의 Spec 을 정의 한 것
- Custom Resource(CR) : Custom Resource Definition 에서 정의한 Object Spec 에 입력하는 Value
Custom Resource Definition(CRD) 특징
- 별도의 코드 작성이 필요 없이 YAML 로 된 SCHEME 작성만 하면 됨
- Custom Resource Definition(CRD) Controller 를 만들때 다양한 언어가 사용 가능(Go, Python, …)
- kube-apiserver 가 Custom Resource Definition(CRD) 상태를 관리
- Kubernetes 의 확장 기능으므로 별도의 관리가 필요 없음(Kubernetes 와 함께 Upgrade, Bug Patch 가 됨)
- Custom Resource Definition(CRD) 의 Scope 를 정의 할 수 있음(Namespace or Cluster)
Operator, Custom Resource Definition(CRD) Flow
- Service #1 이 Custom Resource Spec 을 Write 를 Kube API Server 에 요청합니다.
- Kube API Server 는 etcd 에 Custom Resource Spec 을 Write 합니다.
- Operator(Custom Controller) 는 Kube API Server 를 통해 Custom Resource Definition 의 Custom Resource 가 변경 되었는지를 지쳐봅니다(Watch)
- Operator(Custom Controller) 가 변경 됨을 확인 하면 Custom Resource Status 를 업데이트 하고, 기존에 정의한 대로 POD 를 생성하는 요청을 Kube API Server 에 합니다.
- Kube API Server 는 Operator(Custom Controller) 에게 요청 받은대로 POD 을 생성합니다.
** Kube API Server
Kube API Server는 Cluster 에 접근하기 위한 API 가 있는 서버로 kubernetes 의 모든 기능을 제어 할 수 있는 서버입니다.
** Operator : Custom Controller
Custom Resource Definition 을 정의한 사용자가 개발한 컨트롤러입니다. Custom Resource 의 spec
을 읽고 작업을 수행 한 후에 status
를 업데이트 하는 구조입니다. spec 에 따라 사용자가 원하는 작업을 수행 하도록 개발이 가능합니다.
이제 Custom Resource Defition(CRD), Operator 를 어떻게 작성하는지에 대해 살펴 보겠습니다.
Custom Resource Definition & Operator Example
- Custom Resource Definition Yaml 을 작성합니다.
[ CRD-SAMPLE.yaml ]
- metadata: metadata 로 name, namespace 등이 있습니다.
- spec: Request 하는 부분으로 Rest API 의 Request Spec 과 같습니다.
- status: Response 하는 부분으로 Rest API 의 Response Spec 과 같습니다.
2. Custom Resource Definition 을 구성합니다.
# Custom Resource Definition 구성
$ kubectl apply -f CRD-SAMPLE.yaml# Custom Resource Definition 구성 확인
$ kubectl describe sample.test.group
3. Operator(=Custom Controller) 를 작성합니다.
[ k8s-operator.py]
4. Operator(=Custom Controller) 를 실행하여 동작 확인을 합니다.
- CR-SAMPLE.yaml 을 작성합니다.
[ CR-SAMPLE.yaml ]
- Operator(=Custom Controller) 를 시작합니다.
$ python k8s-operator.py
- CR-SAMPLE.yaml 을 추가합니다.
$ kubectl apply -f CR-SAMPLE.yaml
- Operator(=Custom Controller) 실행 로그를 확인 해보면 아래와 같으 ADDED 된 CR 정보가 나타납니다.
- Operator(=Custom Controller) 로 status 가 업데이트 된 것을 확인 합니다.
$ kubectl describe sample.test.group
이렇게 간단하게 Kubernetes 에서 Custom Resource Definition 와 Operator 를 사용하는 방법을 정리해봤습니다~~!
그럼 즐거운 개발 세발~~ 하세용! :)