ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Informer을 하게 되면 reflector는 자동으로 생성되는가?
    Kubernetes 2025. 3. 2. 11:30
    728x90

    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
Designed by Tistory.