Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #17: Operator (확장 및 기타 리소스)

ygtoken 2025. 3. 5. 00:46
728x90

Kubernetes는 기본적으로 Pod, Deployment, StatefulSet과 같은 컨트롤러를 제공하지만,
애플리케이션 운영을 자동화하려면 CustomResourceDefinition(CRD)과 함께 Operator 패턴을 활용하는 것이 중요합니다.

이번 글에서는 Operator의 개념, 주요 역할, 그리고 실전 활용법을 정리하겠습니다.


🔹 Operator란?

Operator는 **Kubernetes의 확장 기능으로, 특정 애플리케이션을 자동으로 운영하고 관리하는 컨트롤러(Controller)**입니다.
✔️ CRD(CustomResourceDefinition)와 함께 사용하여 애플리케이션 라이프사이클을 자동 관리
✔️ 데이터베이스, 메시지 큐 등 Stateful 애플리케이션 운영 자동화
✔️ 애플리케이션의 장애 감지 및 복구, 업그레이드, 백업 등을 자동 수행

💡 Operator는 Kubernetes의 기본 컨트롤러처럼 동작하지만, 특정 애플리케이션에 특화된 기능을 추가할 수 있습니다.


🔹 Operator가 필요한 이유

기본적인 Kubernetes 기능으로 스케일링, 복구, 배포는 가능하지만,
데이터베이스처럼 상태를 가지는 애플리케이션은 추가적인 운영 관리가 필요합니다.

예를 들어, 다음과 같은 작업을 자동화하려면 Operator가 필요합니다.

기능 설명

자동 복구 애플리케이션이 비정상 상태일 때 자동으로 재시작
백업 및 복원 특정 주기로 백업을 수행하고 필요 시 복원
자동 확장 트래픽이 증가하면 인스턴스를 자동으로 확장
버전 업그레이드 애플리케이션의 새로운 버전이 출시되면 안전하게 롤링 업데이트

💡 이러한 작업을 Operator를 통해 자동으로 수행할 수 있습니다.


🔹 Operator의 주요 구성 요소

구성 요소 설명

Custom Resource (CR) 사용자가 생성할 수 있는 새로운 리소스 유형 (예: MySQLCluster)
Custom Resource Definition (CRD) 새로운 리소스를 정의하는 Kubernetes 확장
Controller 특정 리소스를 감시하고 변경 사항을 반영하는 프로그램

💡 Operator는 Kubernetes API를 감시하며, Custom Resource가 생성될 때 자동으로 동작합니다.


🔹 Operator 예제: MySQL Operator

아래 예제는 MySQL Operator를 사용하여 MySQL 클러스터를 자동으로 관리하는 방법을 보여줍니다.

1️⃣ MySQL CRD 생성

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: mysqlclusters.example.com
spec:
  group: example.com
  names:
    kind: MySQLCluster  # 새로운 리소스 종류
    plural: mysqlclusters
    singular: mysqlcluster
  scope: Namespaced  # 네임스페이스 단위 적용
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer  # MySQL 복제본 개수
                version:
                  type: string  # MySQL 버전

💡 이제 MySQLCluster라는 새로운 리소스를 Kubernetes에서 사용할 수 있습니다.

kubectl apply -f mysql-crd.yaml
kubectl get crds

출력 예시:

NAME                     CREATED AT
mysqlclusters.example.com    2025-03-04T12:00:00Z

2️⃣ MySQL 리소스 생성

apiVersion: example.com/v1
kind: MySQLCluster  # 위에서 생성한 CRD의 Kind
metadata:
  name: my-mysql-cluster
spec:
  replicas: 3  # MySQL 복제본 개수
  version: "8.0"
kubectl apply -f mysql-cluster.yaml
kubectl get mysqlclusters

출력 예시:

NAME                  REPLICAS   VERSION
my-mysql-cluster     3          8.0

💡 이제 MySQL 클러스터가 Kubernetes에서 관리됩니다.


3️⃣ Operator 컨트롤러 구현

Operator는 특정 CRD(CustomResource)를 감시하고 자동으로 행동합니다.
예를 들어, MySQLCluster 리소스가 생성되면 MySQL Pod를 자동으로 생성해야 합니다.

💡 Go, Python 등의 Kubernetes API 클라이언트를 사용하여 Operator를 개발할 수 있습니다.

간단한 Go 기반 Operator 코드 예제

package main

import (
    "context"
    "fmt"
    "time"

    appsv1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

func main() {
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    for {
        fmt.Println("Checking MySQLCluster resources...")
        mysqlClusters, err := clientset.AppsV1().Deployments("default").List(context.TODO(), metav1.ListOptions{
            LabelSelector: "app=mysql",
        })
        if err != nil {
            fmt.Println("Error fetching MySQLClusters:", err)
        } else {
            fmt.Printf("Found %d MySQL clusters\n", len(mysqlClusters.Items))
        }
        time.Sleep(10 * time.Second)
    }
}

💡 Operator는 MySQLCluster 리소스를 감시하고, 필요하면 MySQL Pod를 자동으로 배포하거나 관리할 수 있습니다.


🔹 Operator의 실전 활용 사례

활용 사례 설명

MySQL Operator MySQL 클러스터를 자동으로 배포하고 관리
Prometheus Operator Prometheus를 Kubernetes 환경에서 쉽게 배포 및 운영
Cert-Manager TLS 인증서를 자동으로 발급 및 갱신
Kafka Operator Kafka 클러스터를 Kubernetes에서 운영 가능하도록 지원

💡 운영 자동화를 위해 다양한 오픈소스 Operator가 이미 존재하며, 직접 개발할 수도 있습니다.


🔹 Operator 설치 및 삭제

설치된 Operator 확인

kubectl get deployments -n operators

출력 예시:

NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
mysql-operator      1/1     1            1           10m

Operator 삭제

kubectl delete deployment mysql-operator -n operators
kubectl delete crd mysqlclusters.example.com

💡 Operator를 삭제하면, 해당 CRD를 기반으로 생성된 리소스도 함께 삭제될 수 있습니다.


🚀 마무리

✔️ Operator는 Kubernetes에서 애플리케이션을 자동 운영하는 확장 기능
✔️ CRD와 함께 사용하여 특정 리소스를 감시하고 자동화 가능
✔️ Stateful 애플리케이션(예: 데이터베이스, 메시지 큐 등) 운영에 유용
✔️ Prometheus Operator, Kafka Operator 등 다양한 오픈소스 Operator가 존재

 

728x90