← 아티클 목록

쿠버네티스 label selector 제대로 쓰기 — 입문 가이드

2028-03-27#kubernetes#label#selector

쿠버네티스를 보면 거의 모든 YAML에 labelsselector가 등장합니다. 그런데 둘이 뭐가 다른지, Service가 어떻게 내 Pod를 찾아내는지는 잘 설명되지 않고 넘어갑니다. 결론부터 말하면 레이블(label)은 리소스에 붙이는 이름표, 셀렉터(selector)는 그 이름표로 리소스를 골라내는 질의문입니다. 이 한 쌍이 쿠버네티스에서 리소스를 묶는 거의 모든 곳의 기본 원리입니다.

레이블과 셀렉터의 관계

레이블은 키-값 쌍입니다. Pod에 app: web, tier: frontend 같은 이름표를 붙입니다. 셀렉터는 "app=web인 것들 다 가져와"처럼 그 이름표를 조건으로 거는 쪽입니다.

구분역할붙는 곳
label리소스에 붙이는 식별 태그Pod, Deployment 등 거의 모든 리소스
selectorlabel로 대상을 골라내는 조건Service, Deployment, NetworkPolicy 등

Service가 Pod를 찾는 원리

Service는 IP가 아니라 셀렉터로 Pod를 찾습니다. 아래에서 Service의 selector.app: web은 "레이블이 app=web인 Pod로 트래픽을 보내라"는 뜻입니다.

YAML
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web        # 이 레이블을 가진 Pod를 찾는다
  ports:
    - port: 80
      targetPort: 8080

Pod 쪽에는 같은 레이블이 있어야 연결됩니다. 이름표(app: web)가 양쪽에서 일치해야 트래픽이 흐릅니다. Service가 분명 떠 있는데 연결이 안 되면 십중팔구 이 레이블 오타입니다.

Deployment의 matchLabels

Deployment도 셀렉터로 자기가 관리할 Pod를 식별합니다. spec.selector.matchLabelstemplate.metadata.labels가 반드시 일치해야 합니다.

YAML
spec:
  selector:
    matchLabels:
      app: web      # 이 두 값이
  template:
    metadata:
      labels:
        app: web    # 같아야 한다

명령형으로 골라내기

kubectl에서도 셀렉터를 바로 씁니다. 운영 중 특정 레이블만 골라 볼 때 유용합니다.

Kubernetes
# app=web 인 Pod만
kubectl get pods -l app=web

# tier가 frontend가 아닌 것
kubectl get pods -l 'tier!=frontend'

# 여러 조건 (AND)
kubectl get pods -l 'app=web,env=prod'

요점 정리

  • label = 이름표, selector = 그 이름표로 고르는 질의. 한 쌍으로 동작한다.
  • Service는 IP가 아니라 셀렉터로 Pod를 찾는다 — 양쪽 레이블이 일치해야 연결된다.
  • Deployment는 selector.matchLabelstemplate.labels가 같아야 한다.
  • kubectl get ... -l 로 운영 중 원하는 리소스만 골라 볼 수 있다.

레이블을 일부러 어긋나게 만들어 Service 연결이 끊기는 걸 직접 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.