🏷 Kubernetes Deployment에서 Label로 엮이는 구조 이해하기

2026. 2. 21. 19:42k8s

다음 Deployment 예제를 보자.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.18.0
        name: nginx
        ports:
        - containerPort: 80

이 YAML에는 label이 3군데 등장한다.

이 3개의 역할은 모두 다르다.


📌 1️⃣ metadata.labels (Deployment 자체의 라벨)

metadata:
  labels:
    app: nginx

이 라벨은:

Deployment 리소스 자체에 붙는 라벨이다.

이 라벨은 주로:

  • Deployment 조회 필터링
  • 관리 도구에서 그룹핑

용도로 사용된다.

예:

kubectl get deploy -l app=nginx

📌 2️⃣ spec.selector.matchLabels (가장 중요한 부분)

selector:
  matchLabels:
    app: nginx

이건 핵심이다.

이 의미는:

"app=nginx 라벨을 가진 Pod를 내가 관리하겠다"

즉, Deployment가 관리할 대상 Pod를 지정하는 조건이다.

⚠ 매우 중요:

  • 이 값은 생성 후 변경 불가 (immutable)
  • Pod template의 label과 반드시 일치해야 한다

📌 3️⃣ spec.template.metadata.labels (Pod에 붙는 라벨)

template:
  metadata:
    labels:
      app: nginx

이 부분은:

실제 생성될 Pod에 붙는 라벨이다.

즉:

1️⃣ Deployment 생성
2️⃣ ReplicaSet 생성
3️⃣ Pod 생성
4️⃣ Pod에 app=nginx 라벨 부착


🔎 전체 연결 구조 그림으로 이해하기

Deployment
   │
   │ selector: app=nginx
   ▼
ReplicaSet
   │
   │ manages Pods with label app=nginx
   ▼
Pod (label: app=nginx)

즉,

selector와 template.labels가 연결고리다.


📌 왜 selector와 template.labels가 같아야 할까?

만약 이렇게 하면?

selector:
  matchLabels:
    app: nginx
template:
  metadata:
    labels:
      app: web

👉 Deployment가 생성되지 않거나
👉 Pod를 관리하지 못한다.

왜냐하면:

selector는 nginx를 찾는데
생성된 Pod는 web이기 때문


📌 Service와도 연결된다

만약 Service가 이렇게 있다면:

selector:
  app: nginx

이 Service는:

app=nginx 라벨을 가진 Pod로 트래픽을 보낸다.

즉, label은 단순 태그가 아니라
리소스를 연결하는 핵심 기준이다.


📊 역할 정리 표

위치 역할
metadata.labels Deployment 자체 식별
spec.selector 어떤 Pod를 관리할지 정의
template.metadata.labels 생성될 Pod의 실제 라벨

🎯 한 줄 정리

Deployment에서 label은:

  • 리소스 식별용
  • 관리 대상 선택용
  • Pod 연결용

이 세 가지 역할을 한다.

selector와 template.labels가 정확히 일치해야
Deployment가 정상 동작한다.