ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Operator 구현에 Watcher 사용
    Kubernetes 2025. 3. 2. 10:39
    728x90

    Watcher를 사용한 Kubernetes 리소스 감시 예제

    Watcher는 Kubernetes API 서버와 직접 연결하여 실시간 이벤트를 감지하는 방식입니다.
    하지만 API 서버 부하가 커질 수 있고, 연결이 끊기면 다시 연결해야 하는 단점이 있습니다.

     

     

    Watcher 기반 Deployment 감시 예제

    아래 코드는 Watcher를 사용하여 Kubernetes의 Deployment 리소스를 실시간으로 감시합니다.

    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    
    	v1 "k8s.io/api/apps/v1"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/client-go/kubernetes"
    	"k8s.io/client-go/rest"
    	"k8s.io/apimachinery/pkg/watch"
    )
    
    func main() {
    	// 클러스터 내에서 실행되는 경우 InClusterConfig 사용
    	config, err := rest.InClusterConfig()
    	if err != nil {
    		log.Fatalf("Error getting cluster config: %v", err)
    	}
    
    	// Kubernetes API 클라이언트 생성
    	clientset, err := kubernetes.NewForConfig(config)
    	if err != nil {
    		log.Fatalf("Error creating clientset: %v", err)
    	}
    
    	// Watcher 실행
    	watcher, err := clientset.AppsV1().Deployments("").Watch(context.TODO(), metav1.ListOptions{})
    	if err != nil {
    		log.Fatalf("Error watching Deployments: %v", err)
    	}
    	defer watcher.Stop()
    
    	fmt.Println("📡 Watching for Deployment changes...")
    
    	// 이벤트 감지 루프
    	for event := range watcher.ResultChan() {
    		switch event.Type {
    		case watch.Added:
    			deployment := event.Object.(*v1.Deployment)
    			fmt.Printf("➕ Deployment 추가됨: %s\n", deployment.Name)
    		case watch.Modified:
    			deployment := event.Object.(*v1.Deployment)
    			fmt.Printf("🔄 Deployment 변경됨: %s\n", deployment.Name)
    		case watch.Deleted:
    			deployment := event.Object.(*v1.Deployment)
    			fmt.Printf("❌ Deployment 삭제됨: %s\n", deployment.Name)
    		default:
    			fmt.Printf("⚠️ 알 수 없는 이벤트: %v\n", event.Type)
    		}
    	}
    }

     

     

    결론

    Watcher는 실시간 이벤트 감지에 적합하지만, 장기 실행이 필요한 Kubernetes Operator에서는 Informer를 사용하는 것이 더 효율적임
    일반적인 Operator 개발에서는 Informer를 활용하는 것이 권장

    728x90
Designed by Tistory.