Operator 패턴

Operator 패턴 (Operator pattern)

Operator는 custom resources를 이용해 애플리케이션과 그 구성 요소를 관리하는 Kubernetes의 소프트웨어 확장이에요. Operator는 Kubernetes 원칙, 특히 컨트롤 루프를 따릅니다.

동기 (Motivation)

operator 패턴은 서비스(또는 서비스 집합)를 관리하는 인간 운영자(key aim)의 핵심 목표를 포착하는 것을 목표로 해요. 특정 애플리케이션과 서비스를 돌보는 인간 운영자는 시스템이 어떻게 동작해야 하는지, 어떻게 배포할지, 문제가 생기면 어떻게 반응할지에 대한 깊은 지식을 갖고 있어요.

Kubernetes에서 워크로드를 실행하는 사람들은 반복 가능한 작업을 자동화하고 싶어해요. operator 패턴은 Kubernetes가 제공하는 것 너머의 작업을 자동화하는 코드를 작성하는 방법을 보여줘요.

Kubernetes의 Operator

Kubernetes는 자동화를 위해 설계됐어요. operator 패턴 개념을 이용하면 Kubernetes 자체 코드를 수정하지 않고도, 컨트롤러를 하나 이상의 custom resource에 연결해 클러스터 동작을 확장할 수 있어요. Operator는 Custom Resource의 컨트롤러로 동작하는 Kubernetes API의 클라이언트예요.

Operator 예시

Operator로 자동화할 수 있는 것들:

  • 온디맨드 애플리케이션 배포
  • 애플리케이션 상태의 백업 생성·복원
  • 데이터베이스 스키마나 추가 설정 같은 관련 변경과 함께 애플리케이션 코드 업그레이드 처리
  • Kubernetes API를 지원하지 않는 애플리케이션에 Service 발행
  • 클러스터 전체 또는 일부의 장애를 시뮬레이션해 회복력 테스트
  • 내부 멤버 선출 과정 없이 분산 애플리케이션의 리더 선택

구체적인 예를 들어볼게요.

  1. 클러스터에 구성할 수 있는 custom resource SampleDB.
  2. Operator의 컨트롤러 부분을 포함한 Pod가 실행되도록 보장하는 Deployment.
  3. Operator 코드의 컨테이너 이미지.
  4. 컨트롤 플레인에 어떤 SampleDB 리소스가 구성됐는지 질의하는 컨트롤러 코드.
  5. Reality가 구성된 리소스와 일치하도록 API server에 지시하는 코드가 Operator의 핵심.
    • 새 SampleDB를 추가하면 Operator가 내구성 있는 DB 스토리지를 위한 PersistentVolumeClaim, SampleDB 실행을 위한 StatefulSet, 초기 구성을 처리하는 Job을 설정해요.
    • 삭제하면 Operator가 스냅샷을 찍고 StatefulSet과 Volume도 제거되도록 해요.
  6. Operator는 정기적인 데이터베이스 백업도 관리해요. 각 SampleDB 리소스에 대해 DB에 연결해 백업을 받을 Pod를 언제 만들지 결정해요.
  7. Operator는 관리하는 리소스에 대한 견고한 자동화를 목표로 하므로, 예를 들어 DB가 오래된 버전으로 실행 중인지 확인하고 업그레이드하는 Job을 생성하는 추가 지원 코드가 있어요.

Operator 배포

가장 흔한 배포 방법은 Custom Resource Definition과 관련 Controller를 클러스터에 추가하는 것이에요. Controller는 보통 다른 컨테이너화된 애플리케이션처럼 컨트롤 플레인 밖에서 실행돼요. 예를 들어 Deployment로 실행할 수 있어요.

Operator 사용

Operator를 배포한 뒤에는 Operator가 사용하는 리소스 종류를 추가·수정·삭제하는 방식으로 사용해요.

kubectl get SampleDB                   # find configured databases
kubectl edit SampleDB/example-database # manually change some settings

Operator가 변경 사항을 적용하고 기존 서비스를 양호한 상태로 유지해줍니다.

나만의 Operator 작성

생태계에 원하는 동작을 구현한 Operator가 없다면 직접 만들 수 있어요. Kubernetes API의 클라이언트로 동작할 수 있는 어떤 언어/런타임으로도 컨트롤러(즉 Operator)를 구현할 수 있어요.

도구 예시: kubebuilder, Kopf, Operator Framework, Java Operator SDK, kube-rs, Charmed Operator Framework 등.

더 알아보기 (Learn more)