-
Kubernetes Operator 구현에 Watcher 사용Kubernetes 2025. 3. 2. 10:39728x90
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'Kubernetes' 카테고리의 다른 글
client-go library의 Reflector, Informer, Indexer 역할 (0) 2025.03.02 Kubernete CRD를 사용하여 새로운 K8S API가 추가되는 과정 (0) 2025.03.02 Kubernetes Operator 작성 시 Watcher 또는 Informer 사용? (0) 2025.03.02 Kubernetes의 Informer와 Watcher 차이점 (0) 2025.03.02 Kubernetes에서 Controller와 Operator의 차이 (0) 2025.03.02