ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • client-go under the hood
    Kubernetes 2025. 3. 2. 11:48
    728x90

    아래 내용에 대한 한글 버전:

    https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md

     

     

    client-go 라이브러리는 커스텀 컨트롤러(Custom Controller)를 개발할 때 사용할 수 있는 다양한 메커니즘을 제공합니다.
    이러한 메커니즘은 client-go 라이브러리의 tools/cache 패키지 내에서 정의되어 있습니다.

    아래 그림은 client-go 라이브러리의 다양한 구성 요소들이 어떻게 동작하는지, 그리고 우리가 작성하는 커스텀 컨트롤러 코드와 어떻게 상호 작용하는지를 나타냅니다.

     

     

    🔹 client-go 주요 구성 요소

    1️⃣ Reflector

    • cache 패키지 내의 Reflector 타입으로 정의됨.
    • Kubernetes API에서 특정 리소스 타입(Kind)을 감시(watch)하는 역할.
    • ListAndWatch 함수에서 API 서버의 리소스를 감시.
    • 감시할 리소스는 Kubernetes 기본 리소스(Pod, Deployment 등)일 수도 있고, CRD(Custom Resource)일 수도 있음.
    • 새로운 리소스가 생성되거나 변경되었을 때, Reflector는 해당 객체를 list API를 사용하여 가져오고, Delta FIFO Queue에 추가.

    2️⃣ Informer

    • cache 패키지 내의 베이스 컨트롤러(Base Controller)에 정의됨.
    • Reflector가 Delta FIFO Queue에 저장한 객체를 꺼내와 처리.
    • processLoop 함수에서 큐에 있는 객체를 처리.
    • 주요 역할:
      • 객체를 캐시에 저장하여 나중에 검색 가능하게 함.
      • 해당 객체를 컨트롤러에 전달하여 처리를 실행.

    3️⃣ Indexer

    • 객체를 인덱싱하여 빠르게 검색할 수 있도록 도와주는 기능.
    • cache 패키지 내의 Indexer 타입으로 정의됨.
    • 특정 기준(예: 오브젝트의 라벨(Label) 또는 네임스페이스)을 기반으로 인덱스를 생성할 수 있음.
    • 여러 개의 인덱싱 함수를 유지할 수 있음.
    • Thread-safe(멀티스레드 안전)한 데이터 저장소를 사용하여 객체를 저장.
    • 기본적으로 MetaNamespaceKeyFunc라는 함수가 있으며, 이는 <namespace>/<name> 형태의 키를 생성함.

     

    🔹 커스텀 컨트롤러 구성 요소

    1️⃣ Informer 참조 (Informer Reference)

    • 커스텀 리소스를 처리할 수 있는 Informer 인스턴스의 참조.
    • 커스텀 컨트롤러 코드에서 적절한 Informer를 생성해야 함.

    2️⃣ Indexer 참조 (Indexer Reference)

    • 커스텀 리소스를 다룰 수 있는 Indexer 인스턴스의 참조.
    • 컨트롤러 코드에서 직접 생성해야 함.
    • 생성된 Indexer를 사용하여 나중에 객체를 검색하고 처리.

    📌 컨트롤러에서 Informer와 Indexer를 생성하는 방법

    • client-go의 베이스 컨트롤러는 NewIndexerInformer 함수를 제공하며, 이를 사용하여 Informer 및 Indexer를 생성할 수 있음.
    • 개발자는 직접 NewIndexerInformer를 호출하거나, 팩토리 메서드(Factory Method)를 사용하여 Informer를 생성할 수 있음.

    3️⃣ 리소스 이벤트 핸들러 (Resource Event Handlers)

    • Informer가 객체를 컨트롤러로 전달할 때 호출하는 콜백 함수.
    • 일반적인 패턴:
      1. 객체의 키를 얻음 (<namespace>/<name> 형태).
      2. 해당 키를 작업 큐(Work Queue)에 추가하여 나중에 처리할 수 있도록 함.

    4️⃣ 작업 큐 (Work Queue)

    • 컨트롤러 코드에서 직접 생성하는 큐.
    • 객체의 전달과 실제 처리를 분리하기 위해 사용.
    • 리소스 이벤트 핸들러에서 객체의 키를 추출한 후, 이 키를 작업 큐에 추가.

    5️⃣ 아이템 처리 (Process Item)

    • 작업 큐에서 아이템을 가져와 실제로 처리하는 함수.
    • 하나 이상의 함수가 아이템을 처리할 수 있으며, Indexer 참조 또는 Listing Wrapper를 사용하여 해당 키에 대응하는 객체를 가져옴.

     

    🔥 정리

    💡 즉, Reflector는 Kubernetes API를 감시하고, Informer는 데이터를 캐싱하며, Indexer는 빠른 검색을 지원합니다. 커스텀 컨트롤러는 이 구조를 활용하여 효율적으로 Kubernetes 리소스를 관리할 수 있습니다! 🚀

     
     
    728x90
Designed by Tistory.