Kubernetes Operator는 Custom Resource와 컨트롤러를 통해 복잡한 스테이트풀 애플리케이션의 운영 지식을 코드로 인코딩하는 패턴이다. 데이터베이스 클러스터, 메시지 브로커 등의 Day 2 운영을 자동화한다.
핵심 개념
Operator = CRD + Custom Controller
CRD (Custom Resource Definition): 새로운 API 리소스 타입 정의
Custom Controller: CRD 인스턴스를 관찰하고 실제 상태를 원하는 상태로 맞춤
Reconcile Loop:
1. 원하는 상태(Desired): CRD 스펙
2. 실제 상태(Actual): 클러스터 현재 상태
3. 차이 → 조정 액션 실행
CRD 정의
yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: postgresclusters.db.example.com
spec:
group: db.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
replicas:
type: integer
minimum: 1
version:
type: string
scope: Namespaced
names:
plural: postgresclusters
singular: postgrescluster
kind: PostgresCluster
Operator 구현 (Go + controller-runtime)
go
func (r *PostgresClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
cluster := &dbv1.PostgresCluster{}
if err := r.Get(ctx, req.NamespacedName, cluster); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// StatefulSet 생성 또는 업데이트
sts := buildStatefulSet(cluster)
if err := r.createOrUpdate(ctx, sts); err != nil {
return ctrl.Result{}, err
}
// 상태 업데이트
cluster.Status.ReadyReplicas = sts.Status.ReadyReplicas
r.Status().Update(ctx, cluster)
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
}
관련 개념