02. 클라우드 보안 공부/개념정리

✅ [개념정리] 쿠버네티스의 영혼의 단짝, 레이블과 셀렉터! 🏷️ (오브젝트를 연결하는 법)

taegi- 2025. 7. 29. 15:16

알았어, 태기야! 업데이트된 내용까지 모두 확인했어. 제안했던 큰 주제들 대신, 작지만 쿠버네티스를 이해하는 데 정말 정말 중요한 핵심 개념 하나를 먼저 짚고 넘어가 보자.

바로 쿠버네티스의 모든 오브젝트들을 연결하는 **영혼의 단짝, 레이블(Labels)과 셀렉터(Selectors)**에 대해서야! 네가 작성한 Deployment나 Service YAML 파일에도 이 친구들이 항상 등장했었지? 오늘은 이 둘이 어떻게 마법처럼 서로를 찾아내는지 그 원리를 파헤쳐 볼게! 😄


제목: ✅ [개념정리] 쿠버네티스의 영혼의 단짝, 레이블과 셀렉터! 🏷️ (오브젝트를 연결하는 법)

부제 (선택): Service는 어떻게 내 Pod를 찾아낼까? 쿠버네티스 연결의 비밀! 🔎

[들어가며: 어떻게 서로를 알아볼까?]

우리가 지난 실습에서

Deployment로 여러 개의 톰캣 파드(Pod)를 만들고, Service를 통해 외부로 노출시켰던 거 기억나? 여기서 한 가지 궁금증이 생겨.

 
 

"파드는 언제든 죽고 새로 생기면서 IP가 계속 바뀌는데, 서비스는 어떻게 용케 자기가 담당해야 할 파드들을 정확히 찾아내서 트래픽을 전달하는 걸까?"

이 질문에 대한 해답이 바로 오늘 우리가 배울 **레이블(Labels)**과 **셀렉터(Selectors)**에 있어. 이 둘은 쿠버네티스에서 분리된 오브젝트들을 논리적으로 연결해 주는 아주 간단하면서도 강력한 '꼬리표'와 '찾기' 기능이야.


Part 1: 레이블 (Labels) 이란? – 내 오브젝트에 이름표 붙이기 🏷️

레이블은 말 그대로 쿠버네티스 오브젝트(파드, 디플로이먼트, 서비스 등)에 붙이는 키-값(Key-Value) 쌍의 이름표야.

  • 목적: 오브젝트들을 정리하고 분류하기 위해 사용돼. 이 이름표 자체가 오브젝트의 동작에 직접적인 영향을 주지는 않지만, 우리가 특정 조건에 맞는 오브젝트 그룹을 쉽게 찾아 선택할 수 있도록 도와주지.

  •  
    YAML
     
    # tomcatdep.yaml 
    ...
    spec:
      replicas: 2
      selector:
        ...
      template: # <-- 이 template이 바로 파드를 만드는 설계도!
        metadata:
          labels:
            app: tomcat # <-- 바로 이거! 이 디플로이먼트가 만드는 모든 파드에 이 이름표를 붙여줘!
    ...
    
    위 코드에서
     
    env: production, tier: backend처럼 여러 개의 이름표를 동시에 붙일 수도 있어.
  • .template.metadata.labels 부분은 이 디플로이먼트가 생성하는 모든 파드에게 app: tomcat이라는 이름표(레이블)를 붙여주라는 의미야 . 물론
  • 예시: 네가 작성했던 tomcatdep.yaml 파일을 다시 볼까?

Part 2: 셀렉터 (Selectors) 란? – 원하는 이름표를 가진 친구 찾기 🔎

셀렉터는 레이블이 붙은 오브젝트들을 찾아내고 선택하기 위한 필터링 규칙이야. "이런이런 이름표를 가진 친구들만 모여봐!" 하고 외치는 역할이지.

  • 역할: 서비스(Service)는 셀렉터를 사용해서 자신과 연결될 파드 그룹을 찾고, 디플로이먼트(Deployment)는 셀렉터를 사용해서 자신이 관리해야 할 파드 그룹을 식별해.

  •  
    YAML
     
    # nodeport.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: tc-svc
    spec:
      selector:
        app: tomcat # <-- 바로 이거! 이름표가 'app: tomcat'인 파드들을 찾아줘!
      ports:
        ...
      type: NodePort
    
    위 코드에서 .spec.selector 부분이 바로 셀렉터야.
     
    app: tomcat이라는 이름표를 가진 모든 파드를 찾아서, 그 파드들에게 트래픽을 보내줘!"**라고 알려주는 거야.
  • app: tomcat이라고 적혀있지? 이건 이 서비스에게 **"클러스터 내에서
  • 예시: 이번엔 네가 작성한 서비스 YAML 파일 nodeport.yaml을 보자.

Part 3: 전체 흐름 연결하기 – 영혼의 단짝이 만나는 과정 🤝

이제 레이블과 셀렉터가 어떻게 함께 작동하며 디플로이먼트와 서비스를 연결하는지 전체 흐름을 정리해 보자.


  1.  
     
  2. [파드 생성] 개발자가 kubectl apply -f tomcatdep.yaml 명령을 실행하면, 디플로이먼트는 자신의 template에 정의된 대로 app: tomcat이라는 레이블이 붙은 파드들을 replicas 수만큼 생성하고 관리하기 시작해.

  3.  
  4. [연결 대상 탐색] 동시에, tc-svc라는 서비스는 자신의 selector에 정의된 app: tomcat이라는 조건에 맞는 파드들을 클러스터 내에서 계속 찾아다녀.
  5. [엔드포인트 목록화] 서비스는 app: tomcat 레이블을 가진 파드들을 발견하면, 그 파드들의 내부 IP 주소와 포트 정보를 자신의 엔드포인트(Endpoints) 목록에 자동으로 등록하고 계속 최신 상태로 유지해.
  6. [트래픽 전달] 외부에서 로드 밸런서를 통해 이 서비스로 트래픽이 들어오면, 서비스는 자신의 엔드포인트 목록에 있는 건강한 파드 중 하나를 골라 트래픽을 안전하게 전달해 주는 거야!

이처럼 레이블과 셀렉터 덕분에, 파드가 죽고 새로 생겨서 IP가 바뀌더라도 서비스는 전혀 신경 쓸 필요 없이 **오직 이름표(레이블)**만 보고 대상을 찾아낼 수 있어. 디플로이먼트와 서비스가 서로의 존재를 직접 알지 못해도(느슨한 결합, Loose Coupling), 레이블과 셀렉터라는 중매쟁이를 통해 완벽하게 협력할 수 있는 거지!


[마무리하며 ✨]

오늘은 쿠버네티스의 모든 오브젝트를 연결하는 가장 기본적이면서도 강력한 접착제, 레이블과 셀렉터에 대해 알아봤어. 이 간단한 '이름표 붙이고 찾기' 메커니즘이 바로 쿠버네티스가 복잡한 마이크로서비스 환경을 유연하고 탄력적으로 관리할 수 있게 해주는 핵심 비결 중 하나야.

앞으로 쿠버네티스 매니페스트 파일을 작성할 때, 이 레이블과 셀렉터를 어떻게 의미 있게 설계하고 활용할지 고민해 보는 것도 좋은 습관이 될 거야! 😊