K8s 셀렉터

1 개요[ | ]

k8s Selector
k8s 셀렉터, 선택자
  • 조건에 맞는 오브젝트 집합을 선언적으로 지정하는 방법
  • 주로 레이블(Label)을 기준으로 리소스 목록을 필터링하거나, 컨트롤러가 관리할 대상 집합을 가리키는 데 사용된다.
  • 셀렉터는 오브젝트를 조회할 때(예: kubectl get pods -l app=web) 뿐 아니라, 리소스 스펙 내부(예: Deployment, Service, NetworkPolicy, TopologySpreadConstraints, NodeAffinity, ResourceClaims 등)에서도 널리 사용된다.

Kubernetes-basics public images module 04 labels.svg

2 유형[ | ]

유형 필드명/옵션 선택 기준 선택 대상 용도 등장 리소스/위치
Label Selector spec.selector Pod의 Label Pod Pod 집합 지정 (엔드포인트·관리 대상) Service, Deployment, StatefulSet
Label Selector podSelector Pod의 Label Pod 적용 대상 Pod 지정 NetworkPolicy, PodDisruptionBudget
Label Selector labelSelector Pod의 Label Pod Pod 분산 배치 조건 지정 TopologySpreadConstraints
Namespace Selector namespaceSelector Namespace의 Label Namespace 적용 네임스페이스 지정 NetworkPolicy
Node Selector spec.nodeSelector Node의 Label Node Pod를 배치할 노드를 지정 PodSpec, Deployment, StatefulSet
Field Selector --field-selector (kubectl 옵션) 리소스의 특정 필드 값
(spec.nodeName, status.phase 등)
리소스 리소스 조회/필터링 (kubectl 전용, 컨트롤러 스펙에서는 사용 불가) kubectl get / watch 등
CEL Selector selectors[].cel.expression 디바이스 속성·용량 (attributes, capacity) 디바이스 리소스 디바이스/리소스 조건 지정 (실험적, 일부 리소스 한정) ResourceClaimTemplate

3 Label Selector[ | ]

Label Selector는 가장 일반적인 셀렉터로, 리소스의 레이블 키/값 조합으로 집합을 지정한다.

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
  - port: 80

→ Service는 spec.selector로 엔드포인트가 될 Pod 집합을 선택한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web

→ Deployment는 spec.selector로 관리할 Pod 집합을 지정한다 (불변).

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend
spec:
  podSelector:
    matchLabels:
      app: web

→ NetworkPolicy는 podSelector로 적용 대상 Pod 집합을 지정한다.

topologySpreadConstraints:
- maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: ScheduleAnyway
  labelSelector:
    matchLabels:
      app: web

→ TopologySpreadConstraints는 labelSelector로 Pod를 zone·노드 단위로 고르게 분산 배치한다.

selector:
  matchExpressions:
  - key: app
    operator: In
    values: ["web", "api"]

→ matchExpressions를 사용하면 여러 값, 존재 여부, 불일치 등의 조건까지 지정할 수 있다.

4 Namespace Selector[ | ]

Namespace Selector는 네임스페이스에 부여된 레이블을 기준으로 집합을 지정한다.

ingress:
- from:
  - namespaceSelector:
      matchLabels:
        role: frontend

→ NetworkPolicy는 namespaceSelector로 허용할 네임스페이스 범위를 지정할 수 있다.

ingress:
- from:
  - namespaceSelector:
      matchLabels:
        team: frontend
    podSelector:
      matchLabels:
        role: api

→ namespaceSelector와 podSelector를 동시에 사용해 더 정밀한 조건을 지정할 수도 있다.

5 Field Selector[ | ]

Field Selector는 리소스의 특정 필드 값으로 조회를 필터링할 때 사용되며, kubectl 전용이다. 컨트롤러 스펙 내부에서는 사용할 수 없다.

kubectl get pods --field-selector spec.nodeName=worker-1
kubectl get pods --field-selector status.phase=Running

→ kubectl 조회 시 nodeName, phase 등 특정 필드를 기준으로 Pod를 필터링한다.

6 Node Selector[ | ]

Node Selector와 NodeAffinity는 Pod가 어떤 노드에 스케줄될지를 지정한다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - name: nginx
    image: nginx

→ Pod는 spec.nodeSelector로 "disktype=ssd" 라벨을 가진 노드에만 배치된다.

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values: ["ssd"]

→ NodeAffinity는 좀 더 세밀한 조건(연산자, 여러 조건 조합 등)을 지정할 수 있다.

7 CEL Selector[ | ]

CEL(Common Expression Language) Selector는 장치 속성·용량 조건을 수치적으로 비교할 수 있다. 주로 ResourceClaimTemplate에서 사용되며, 아직 일부 리소스에서만 제한적으로 지원되는 기능이다.

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: example-resource-claim-template
spec:
  spec:
    devices:
      requests:
      - name: gpu-claim
        exactly:
          deviceClassName: example-device-class
          selectors:
          - cel:
              expression: |-
                device.attributes["driver.example.com"].type == "gpu" &&
                device.capacity["driver.example.com"].memory == quantity("64Gi")

→ ResourceClaimTemplate는 CEL 표현식으로 GPU 타입과 메모리 용량 조건을 동시에 만족하는 디바이스만 선택한다.

8 같이 보기[ | ]

9 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}