🥊 쿠버네티스 컨트롤러의 개념과 동작 방식
- 명령형(Imperative): docker run처럼 특정 명령을 처리하는 주체와 통신해 그 작업을 수행하고 그 결괏값을 돌려 받는 방식
- 선언형(Declarative): 쿠버네티스처럼 최종적으로 도달해야 하는 바람직한 상태(Desired State)를 직접 정의한 뒤, 현재 상태가 바람직한 상태와 다를 경우 이를 일치하도록 만드는 방법 → 최종적으로 완성되어야 하는 상태가 되기 위해 어떠한 동작을 취할지는 쿠버네티스에서
컨트롤러
라고 불리는 개체가 내부적으로 결정한다.
- 컨트롤러 매니저: 쿠버네티스 전체 구성의 복잡성을 줄이기 위해 컨트롤러 조직을 컨트롤러 매니저라는 하나의 컴포넌트에서 구현
- 컨트롤러: 쿠버네티스 리소스의 상태 변화를 감지하고 적절한 작업을 수행
🍮 커스텀 리소스
- 직접 정의해 사용할 수 있는 사용자 정의 리소스
- 디플로이먼트, 서비스 등의 오브젝트의 묶음을 커스텀 리소스로 추상화함으로써 쿠버네티스 리소스를 묶어 놓은 패키지처럼 사용할 수도 있고, 쿠버네티스와 전혀 상관이 없는 로직을 커스텀 리소스와 연동할 수도 있다.
- 사용 단계
- 현재 상태를 커스텀 리소스에 대한 desired state로 변화시킬 수 있는 컨트롤러를 구현하고, 컨트롤러를 실행한다.
- 커스텀 리소스의 상세 정보를 정의하는 CRD(Custom Resource Definition) 리소스를 생성한다.
- CRD에 정의된 데이터에 맞춰 커스텀 리소스를 생성한다.
- 1번에서 실행한 컨트롤러는 커스텀 리소스의 생성을 감지하고, 커스텀 리소스가 원하는 desired state가 되도록 적절한 작업을 수행한다.
🔮 커스텀 리소스를 정의하기 위한 CRD
- 커스텀 리소스는
customerresourcedefinition
이라는 오브젝트를 통해 정의할 수 있다. (crd
)
- 커스텀 리소스를 어떻게 사용할 것인지 쿠버네티스에 등록하는 선언적인 리소스이며, crd 자체가 커스텀 리소스를 의미하는 것은 아니다.
🎮 커스텀 리소스와 컨트롤러
- 커스텀 리소스를 생성했을 때 특정 동작을 수행하도록 정의하는 컨트롤러를 별도로 구현해야만 커스텀 리소스가 비로소 의미를 갖게 된다.
- 즉, 커스텀 리소스가 어떠한 목적을 위해 생성되는지 비즈니스 로직으로 구현해 놓은 별도의 컨트롤러가 필요하다.
- 비즈니스 로직은 커스텀 리소스가 원하는 desired state를 계속해서 유지하도록 만드는 소스코드로 구현된다.
reconcile
: 현재 상태가 desired state가 되도록 특정 동작을 수행하는 것
operator 패턴
: 일련의 동작을 통해 crd를 사용할 수 있도록 컨트롤러를 구현하는 방법
[출처] 시작하세요! 도커/쿠버네티스 (용찬호 지음)