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가 존재
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Pod 심화편 #1] Pod의 생성과 스케줄링 원리 (0) | 2025.03.12 |
---|---|
Kubernetes 리소스 시리즈 #18: Helm (패키지 관리 및 배포 자동화) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #16: CustomResourceDefinition(CRD) (확장 및 기타 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #15: Cluster Autoscaler & Metrics Server (오토스케일링 및 모니터링 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #14: Horizontal & Vertical Pod Autoscaler (오토스케일링 및 모니터링 리소스) (0) | 2025.03.05 |