ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Operator 작성 시 Watcher 또는 Informer 사용?
    Kubernetes 2025. 3. 2. 10:36
    728x90

    Kubernetes Operator는 보통 Informer 기반의 Controller 패턴을 사용하여 동작

     

    왜 Watcher 대신 Informer만 사용할까?

    Watcher는 API 서버에 직접 요청을 보내면서 실시간 이벤트를 감지하는 방식이지만, 연결이 끊기거나 장애가 발생하면 재연결이 필요합니다.
    반면, Informer는 캐시를 활용하여 API 서버 부하를 줄이면서도 리소스 변경을 감지할 수 있어 Operator 개발에 적합합니다.

     

    Informer 기반 Controller의 장점

    • API 서버 부하 감소: 캐싱을 활용하여 API 요청 수를 줄임.
    • 네트워크 장애에 강함: 클라이언트-API 서버 연결이 끊겨도 캐시에서 데이터 유지.
    • 이벤트 기반 처리 가능: AddFunc, UpdateFunc, DeleteFunc을 활용하여 리소스 변경을 감지하고 처리 가능.

     

    Informer 기반 Kubernetes Operator 예제

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    
    	v1 "k8s.io/api/apps/v1"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/client-go/informers"
    	"k8s.io/client-go/kubernetes"
    	"k8s.io/client-go/rest"
    	"k8s.io/client-go/tools/cache"
    )
    
    func main() {
    	// Kubernetes 클러스터와 연결
    	config, err := rest.InClusterConfig()
    	if err != nil {
    		panic(err.Error())
    	}
    
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		panic(err.Error())
    	}
    
    	// Informer Factory 생성 (캐시 유지 시간 5분)
    	factory := informers.NewSharedInformerFactory(clientset, 5*time.Minute)
    
    	// Deployment 리소스를 감시하는 Informer 생성
    	deploymentInformer := factory.Apps().V1().Deployments().Informer()
    
    	// 이벤트 핸들러 추가
    	deploymentInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
    		AddFunc: func(obj interface{}) {
    			deployment := obj.(*v1.Deployment)
    			fmt.Println("새로운 Deployment 생성됨:", deployment.Name)
    		},
    		UpdateFunc: func(oldObj, newObj interface{}) {
    			oldDeployment := oldObj.(*v1.Deployment)
    			newDeployment := newObj.(*v1.Deployment)
    			fmt.Println("Deployment 업데이트됨:", oldDeployment.Name, "→", newDeployment.Name)
    		},
    		DeleteFunc: func(obj interface{}) {
    			deployment := obj.(*v1.Deployment)
    			fmt.Println("Deployment 삭제됨:", deployment.Name)
    		},
    	})
    
    	// Informer 실행
    	stopCh := make(chan struct{})
    	defer close(stopCh)
    
    	factory.Start(stopCh)
    	factory.WaitForCacheSync(stopCh)
    
    	// Operator 실행 유지
    	select {}
    }

     

    결론

    Watcher는 간단한 리소스 모니터링에는 적합하지만, Kubernetes Operator 개발에서는 Informer를 사용하는 것이 일반적입니다.
    Informer를 활용하면 API 서버 부하를 줄이면서도 안정적인 Operator를 개발할 수 있음

    728x90
Designed by Tistory.