-
Kubernetes Operator 작성 시 Watcher 또는 Informer 사용?Kubernetes 2025. 3. 2. 10:36728x90
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'Kubernetes' 카테고리의 다른 글
Kubernete CRD를 사용하여 새로운 K8S API가 추가되는 과정 (0) 2025.03.02 Kubernetes Operator 구현에 Watcher 사용 (0) 2025.03.02 Kubernetes의 Informer와 Watcher 차이점 (0) 2025.03.02 Kubernetes에서 Controller와 Operator의 차이 (0) 2025.03.02 Kubernetes Operator Pattern: 클러스터 운영 자동화 (0) 2025.03.02