오퍼레이터 패턴

오퍼레이터 패턴 (Operator pattern)

오퍼레이터(Operator)는 Kubernetes 확장 소프트웨어로, 커스텀 리소스를 이용해 애플리케이션과 그 컴포넌트를 관리해요. 오퍼레이터는 Kubernetes 원칙, 특히 컨트롤 루프를 따르는 것이 특징이에요.

출처: 문서

본문

동기 (Motivation)

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

Kubernetes에서 워크로드를 실행하는 사람들은 반복적인 작업을 자동화로 처리하기를 원하는 경우가 많아요. 오퍼레이터 패턴은 Kubernetes 자체가 제공하는 것 이상으로 작업을 자동화하는 코드를 어떻게 작성할 수 있는지 담아내요.

Kubernetes의 오퍼레이터 (Operators in Kubernetes)

Kubernetes는 자동화를 위해 설계되었어요. 기본으로 Kubernetes 핵심에서 많은 내장 자동화를 얻게 돼요. Kubernetes를 사용해 워크로드의 배포·실행을 자동화하고, Kubernetes가 그렇게 하는 방식을 자동화할 수도 있어요.

Kubernetes의 오퍼레이터 패턴 개념은 컨트롤러를 하나 이상의 커스텀 리소스에 연결해 Kubernetes 자체의 코드를 수정하지 않고도 클러스터의 동작을 확장하게 해줘요. 오퍼레이터는 커스텀 리소스의 컨트롤러 역할을 하는 Kubernetes API의 클라이언트예요.

오퍼레이터 예시 (An example operator)

오퍼레이터로 자동화할 수 있는 일들:

  • 요청 시 애플리케이션 배포
  • 해당 애플리케이션 상태의 백업 생성 및 복원
  • 데이터베이스 스키마나 추가 구성 설정 같은 관련 변경과 함께 애플리케이션 코드의 업그레이드 처리
  • Kubernetes API를 지원하지 않아 스스로를 발견할 수 없는 애플리케이션에 Service 게시
  • 클러스터 전체 또는 일부에서 장애를 시뮬레이션해 복원력 테스트
  • 내부 멤버 선출 프로세스가 없는 분산 애플리케이션의 리더 선택

오퍼레이터는 더 자세히 어떤 모습일까요? 예시를 들어볼게요.

  • 클러스터에 구성할 수 있는 SampleDB라는 커스텀 리소스
  • 오퍼레이터의 컨트롤러 부분이 담긴 파드가 실행되도록 보장하는 Deployment
  • 오퍼레이터 코드의 컨테이너 이미지
  • 컨트롤 플레인을 조회해 어떤 SampleDB 리소스가 구성되어 있는지 알아내는 컨트롤러 코드
  • 오퍼레이터의 핵심은 "어떻게 하면 현실이 구성된 리소스와 일치하도록 만들지"를 API 서버에 알려주는 코드예요. 새 SampleDB를 추가하면 오퍼레이터는 영구 데이터베이스 저장을 위한 PersistentVolumeClaim, SampleDB 실행을 위한 StatefulSet, 초기 구성을 처리하는 Job을 설정해요. 삭제하면 오퍼레이터는 스냅샷을 찍은 후 StatefulSet과 볼륨도 제거되도록 보장해요.
  • 오퍼레이터는 정기적인 데이터베이스 백업도 관리해요. 각 SampleDB 리소스에 대해 오퍼레이터는 데이터베이스에 연결해 백업을 찍을 수 있는 파드를 언제 만들지 결정해요. 이 파드들은 데이터베이스 연결 정보와 자격 증명이 있는 ConfigMap 및/또는 Secret에 의존해요.
  • 오퍼레이터는 관리하는 리소스에 대한 견고한 자동화를 제공하는 것을 목표로 하므로 추가 지원 코드도 있어요. 이 예시의 경우, 코드가 데이터베이스가 이전 버전을 실행 중인지 확인하고, 그렇다면 업그레이드해 주는 Job 객체를 만들어요.

오퍼레이터 배포 (Deploying operators)

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

오퍼레이터 사용하기 (Using an operator)

오퍼레이터를 배포했다면, 오퍼레이터가 사용하는 리소스 종류를 추가·수정·삭제하는 방식으로 사용해요. 위 예시를 따라, 오퍼레이터 자체를 위한 Deployment를 설정한 다음:

kubectl get SampleDB                   # find configured databases

kubectl edit SampleDB/example-database # manually change some settings

…이게 전부예요! 오퍼레이터가 변경 사항 적용과 기존 서비스의 상태 유지를 모두 처리해요.

나만의 오퍼레이터 작성하기 (Writing your own operator)

생태계에 원하는 동작을 구현한 오퍼레이터가 없다면, 직접 만들 수 있어요.

Kubernetes API의 클라이언트 역할을 할 수 있는 모든 언어/런타임으로 오퍼레이터(즉, 컨트롤러)를 구현할 수 있어요.

나만의 클라우드 네이티브 오퍼레이터를 작성하는 데 쓸 수 있는 라이브러리와 도구는 다음과 같아요.

다음 단계

더 알아보기 (Learn more)