Skip to content

Operator Pattern

Kubernetes에서 Operator pattern은 '정의된 상태(desired state)를 유지한다'는 Kubernetes의 핵심 개념을 확장한 패턴입니다. 코드당에서 직접 구현해서 사용하지는 않지만, RabbitMQ나 Redis, Argo CD와 같은 여러 서비스에서 Operator를 제공하고 있습니다.

Custom Resource Definition (CRD)

Kubernetes manifest를 작성할 때, apiVersion, kind 등의 필드를 사용합니다. 이러한 필드들은 Kubernetes API에서 리소스를 식별하는 데 사용됩니다. 예를 들어, apiVersion: v1kind: Pod는 Kubernetes에서 기본적으로 제공하는 Pod 리소스를 나타냅니다.

그러나, 특정 애플리케이션이나 서비스에 특화된 리소스를 정의하고 관리하려면, Kubernetes의 기본 리소스 외에도 Custom Resource를 만들어야 합니다. 이를 위해 Kubernetes는 Custom Resource Definition(CRD)라는 메커니즘을 제공합니다. CRD를 사용하면 사용자가 직접 정의한 리소스를 Kubernetes 클러스터에 추가할 수 있습니다. 예를 들어, RabbitMQ 클러스터를 관리하기 위한 RabbitmqCluster라는 사용자 정의 리소스를 만들 수 있습니다.

yaml
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: rabbitmq
  namespace: rabbitmq

위와 같이 apiVersionkind를 지정하면, Kubernetes는 이를 인식하고 해당 리소스를 관리할 수 있게 됩니다.

Custom Controller

Custom Resource를 정의만 하면, 실제로 Kubernetes는 이를 관리할 수 없습니다. 정의된 resource의 상태를 모니터링하고, 원하는 상태로 유지하기 위해서는 Custom Controller가 필요합니다.

Custom Controller는 Kubernetes API 서버와 상호작용하여, Custom Resource의 상태를 지속적으로 감시하고, 정의된 상태(desired state)를 유지하기 위해 필요한 작업을 수행합니다.

RabbitMQ Cluster Operator를 예로 들면, 앞의 예시처럼 RabbitmqCluster 리소스를 정의하면, RabbitMQ Operator가 이를 감지하고, RabbitMQ 클러스터를 생성 및 관리합니다. 아래와 같이 pod, service, statefulset 등의 리소스가 자동으로 생성됩니다.

❯ kubectl get all -n rabbitmq
NAME                    READY   STATUS    RESTARTS   AGE
pod/rabbitmq-server-0   1/1     Running   0          15d

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
service/rabbitmq         ClusterIP   10.43.148.145   <none>        15692/TCP,5672/TCP,15672/TCP   15d
service/rabbitmq-nodes   ClusterIP   None            <none>        4369/TCP,25672/TCP             15d

NAME                               READY   AGE
statefulset.apps/rabbitmq-server   1/1     15d

NAME                                    ALLREPLICASREADY   RECONCILESUCCESS   AGE
rabbitmqcluster.rabbitmq.com/rabbitmq   True               True               15d

이를 관리하는 Custom Controller는 rabbitmq-system namespace에 배포되어 있습니다.

❯ kubectl get all -n rabbitmq-system
NAME                                               READY   STATUS    RESTARTS   AGE
pod/messaging-topology-operator-67479c576c-8b2lt   1/1     Running   0          15d
pod/rabbitmq-cluster-operator-78bb8bc45c-2fwtp     1/1     Running   0          15d

NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/webhook-service   ClusterIP   10.43.143.53   <none>        443/TCP   15d

NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/messaging-topology-operator   1/1     1            1           15d
deployment.apps/rabbitmq-cluster-operator     1/1     1            1           15d

NAME                                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/messaging-topology-operator-67479c576c   1         1         1       15d
replicaset.apps/rabbitmq-cluster-operator-78bb8bc45c     1         1         1       15d

Controller vs Operator

Controller와 Operator는 밀접한 관련이 있지만, 약간의 차이가 있습니다. Controller는 Kubernetes의 기본 개념으로, 정의된 상태를 유지하는 역할의 컴포넌트입니다. Kubernetes에 내장된 Ingress Controller, Deployment Controller 등 다양한 Controller가 존재합니다. 이외에 앞서 언급한 것처럼 사용자가 직접 Custom Controller를 만들어 Custom Resource를 관리할 수도 있습니다.

반면 Operator는 Custom Resource와 Custom Controller를 함께 묶은 개념입니다. 즉, 특정 애플리케이션이나 서비스에 특화된 리소스를 정의하고, 이를 관리하는 로직을 포함하는 패키지입니다. Operator는 일반적으로 다음과 같은 구성 요소를 포함합니다.

  • Custom Resource Definition (CRD): 관리할 리소스를 정의합니다.
  • Custom Controller: 정의된 리소스를 감시하고, 원하는 상태를 유지하기 위한 로직을 구현합니다.