metadata.labels vs. spec.selector.matchLabels vs. containers.name
쿠버네티스를 쓰다 보면 matchLabels와 metadata.labels가 자주 등장하는데, 혼동되기 쉽습니다. 이 둘은 용도와 위치가 다릅니다.
matchLabels와 metadata.labels
항목 | metadata.labels |
spec.selector.matchLabels |
---|---|---|
역할 | 오브젝트에 레이블을 부여 | 오브젝트를 선택(Selector) 하기 위한 조건 |
주 사용 위치 | 모든 오브젝트의 metadata.labels (ex. Pod, Service, Deployment 등) |
Deployment , Service , ReplicaSet 의 selector 안 |
의미 | 이 리소스는 어떤 "속성"을 갖는다 | 이 리소스를 어떤 기준으로 "선택"할지 정의 |
예시 | labels: app: myapp → "이것은 myapp이다" |
matchLabels: app: myapp → "app이 myapp인 pod만 선택" |
예제
아래는 3개의 myapp 이라는 것이 나온다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
app: myapp # 이 deployment 자체의 label
spec:
selector:
matchLabels:
app: myapp # 어떤 Pod를 관리할지 고르는 기준 (Selector)
template:
metadata:
labels:
app: myapp # 생성되는 Pod에 이 label이 부여됨
spec:
containers:
- name: nginx
image: nginx
metadata.name vs metadata.labels
항목 | metadata.name |
metadata.labels |
---|---|---|
역할 | 오브젝트의 고유한 이름(식별자) | 오브젝트에 붙이는 분류 태그 |
유일성 | 클러스터 내에서 고유해야 함 | 여러 리소스가 같은 label 공유 가능 |
목적 | 해당 오브젝트를 명시적으로 지칭하기 위해 | 리소스를 선택하거나 그룹짓기 위해 사용 |
예시 명령 | kubectl get deployment my-deploy |
kubectl get pods -l app=myapp |