-
Informer을 하게 되면 reflector는 자동으로 생성되는가?Kubernetes 2025. 3. 2. 11:30728x90
Informer를 생성하면 내부적으로 Reflector가 자동으로 생성됩니다.
1️⃣ Informer와 Reflector의 관계
client-go 라이브러리에서 Informer는 Reflector를 포함하는 구조로 동작합니다.
즉, Informer를 사용하면 Reflector가 자동으로 생성되며, 이를 통해 Kubernetes API 서버의 변경 사항을 감지합니다.📌 구조적으로 보면 다음과 같은 관계를 가집니다:
Informer → Reflector → ListWatcher → API 서버- Informer: Reflector를 사용하여 API 서버와 동기화하며, 변경 이벤트를 캐시 및 핸들러에 전달.
- Reflector: ListWatcher를 이용해 API 서버의 데이터를 가져오고 Store(캐시)에 저장.
- ListWatcher: API 서버의 특정 리소스를 감시하는 인터페이스.
📌 즉, Informer를 생성하면 Reflector가 내부적으로 함께 생성되어 자동으로 API 서버와 동기화됩니다.
2️⃣ Informer 내부에서 Reflector가 자동으로 생성되는 코드 분석
Informer 내부적으로 Reflector를 생성하는 부분은 client-go 라이브러리의 cache.NewSharedInformer 함수에서 확인할 수 있습니다.
📌 Go 코드 분석 (client-go/tools/cache/shared_informer.go)
func NewSharedInformer( lw ListerWatcher, objType runtime.Object, resyncPeriod time.Duration, ) SharedInformer { return NewSharedIndexInformer(lw, objType, resyncPeriod, cache.Indexers{}) }- ListerWatcher (ListWatchFromClient)를 사용하여 Kubernetes API 서버에서 데이터를 가져옴.
- 내부적으로 Reflector를 사용하여 List와 Watch를 수행함.
📌 Reflector가 자동으로 생성되는 코드 (client-go/tools/cache/reflector.go)
func NewReflector( lw ListerWatcher, expectedType runtime.Object, store Store, resyncPeriod time.Duration, ) *Reflector { return &Reflector{ store: store, listerWatcher: lw, resyncPeriod: resyncPeriod, } }- Reflector는 ListerWatcher를 통해 API 서버에서 데이터를 가져오고, 자동으로 Informer의 캐시에 저장함.
- 즉, Informer가 생성될 때 Reflector도 자동으로 생성되며, 이를 통해 API 서버의 변경 사항을 감시함.
3️⃣ 예제 코드: Informer를 생성하면 Reflector가 자동으로 동작하는지 확인
✅ Informer 코드 실행
package main import ( "fmt" "time" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func main() { // Kubernetes 클라이언트 생성 config, _ := rest.InClusterConfig() clientset, _ := kubernetes.NewForConfig(config) // Shared Informer Factory 생성 factory := informers.NewSharedInformerFactory(clientset, 30*time.Second) podInformer := factory.Core().V1().Pods().Informer() // 이벤트 핸들러 등록 podInformer.AddEventHandler( cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { fmt.Println("Pod 추가됨:", obj) }, UpdateFunc: func(oldObj, newObj interface{}) { fmt.Println("Pod 업데이트됨:", newObj) }, DeleteFunc: func(obj interface{}) { fmt.Println("Pod 삭제됨:", obj) }, }, ) // Informer 실행 stopCh := make(chan struct{}) go podInformer.Run(stopCh) // 실행 지속 wait.NeverStop() }✅ Reflector가 자동 생성되는지 확인
Informer를 실행하면 내부적으로 Reflector가 자동으로 생성됩니다.
이를 확인하려면, Kubernetes API 서버를 감시하면 Informer가 List & Watch 요청을 보냄을 확인할 수 있습니다.kubectl get events --watch또는 kubectl proxy를 실행한 후 다음과 같이 API 서버의 요청을 확인할 수도 있습니다.
curl http://127.0.0.1:8001/apis/v1/pods?watch=true🔹 이 요청이 실행 중이라면 Reflector가 Informer에 의해 자동으로 실행되고 있다는 의미! 🚀
728x90'Kubernetes' 카테고리의 다른 글
client-go의 Reflector와 Watcher의 차이? (0) 2025.03.02 go-client Informer 사용시 Indexer는 선택적으로 사용되는건가? (0) 2025.03.02 client-go library의 Reflector, Informer, Indexer 역할 (0) 2025.03.02 Kubernete CRD를 사용하여 새로운 K8S API가 추가되는 과정 (0) 2025.03.02 Kubernetes Operator 구현에 Watcher 사용 (0) 2025.03.02