본문 바로가기

Container/Kubernetes

[K8S] Node Label & Selector

Label & Selector

Kubernetes에서 리소스를 그룹화하고 필터링하는 데 사용되는 주요 메커니즘

Label은 리소스에 부여된 정보이며, Selector는 특정 Label을 가진 리소스를 선택한다.

특정 리소스에 대해 원하는 작업(트래픽 전달, 로깅, 모니터링 등)을 효율적으로 수행

 

Label

  • Kubernetes 리소스에 추가할 수 있는 키-값 쌍으로, 리소스에 대한 메타데이터를 제공
  • 각 리소스에 여러 개의 라벨을 지정 가능
  • 노드를 선택해서 파드를 배치할 수 있다. 👉nodeSelector 사용
$ kubectl label nodes <node-name> <label-key>=<label-value>
$ kubectl label nodes node01 size=Large

 

# node01이 가진 label 확인하기
$ kubectl describe node node01
Name:               node01
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=node01
                    kubernetes.io/os=linux

GCP 자동으로 설치된 label 확인 가능

Selector:

  • Label을 사용하여 특정 리소스를 선택(필터링)하는 데 사용
  • Service, ReplicaSet, Deployment 등에서 Selector를 사용하여 대상 리소스를 지정

Selector

--selector를 이용한 Pod filtering

root@master:~#  kubectl get pods --selector env=dev
NAME          READY   STATUS    RESTARTS   AGE
app-1-84gr9   1/1     Running   0          2m35s
app-1-jmfn6   1/1     Running   0          2m35s
app-1-pq66q   1/1     Running   0          2m35s
db-1-6l44z    1/1     Running   0          2m35s
db-1-d9hmf    1/1     Running   0          2m35s
db-1-hkxvt    1/1     Running   0          2m35s
db-1-s4j8h    1/1     Running   0          2m35s

# 갯수 파악
root@master:~# kubectl get pods --selector env=dev --no-headers | wc -l
7

 

Selector 종류

  • Equality-based (동등 비교)
    • 특정 Label의 키-값 쌍을 비교하여 리소스를 선택
selector:
  matchLabels:
    app: my-app
  • Set-based (집합 비교)
    • 라벨의 값이 특정 집합(Set)에 포함되는지 확인

Label과 Selector의 사용 사례

(1) Service와 Pod 연결

Service는 Selector를 사용하여 특정 Label을 가진 Pod을 선택하여 트래픽 전달

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - port: 80
      targetPort: 8080

 

 

(2) ReplicaSet 관리

ReplicaSet은 Selector를 사용해 관리할 Pod을 선택

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: nginx
          image: nginx

 

Node Selector

Node Selector는 Pod이 특정 노드에 스케줄링되도록 설정하는 메커니즘

Pod에 특정 노드(Label을 기반으로)에서만 실행될 수 있는 제약 조건을 추가한다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  nodeSelector:
    disktype: ssd   # disktype=ssd 라벨이 붙은 노드에서만 Pod이 실행
  containers:
    - name: nginx
      image: nginx

 

# 내 bare-metal 기본 설정 Label
root@master:~# kubectl get nodes --show-labels
NAME                 STATUS   ROLES           AGE    VERSION   LABELS
master.example.com   Ready    control-plane   141m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.example.com,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
node1.example.com    Ready    <none>          133m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1.example.com,kubernetes.io/os=linux
node2.example.com    Ready    <none>          133m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2.example.com,kubernetes.io/os=linux

root@master:~# kubectl label nodes node1.example.com gpu=true disk=ssd
node/node1.example.com labeled
root@master:~# kubectl label nodes node2.example.com gpu=true
node/node2.example.com labeled
# 또는
root@master:~/Getting-Start-Kubernetes/12# kubectl label node node{1,2}.example.com gpu=true

root@master:~# kubectl get nodes --show-labels
NAME                 STATUS   ROLES           AGE    VERSION   LABELS
master.example.com   Ready    control-plane   143m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.example.com,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
node1.example.com    Ready    <none>          135m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,gpu=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1.example.com,kubernetes.io/os=linux
node2.example.com    Ready    <none>          135m   v1.29.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2.example.com,kubernetes.io/os=linux

# 원하는 정보만 보고 싶을 때 '-L' 옵션
root@master:~# kubectl get nodes -L disk,gpu
NAME                 STATUS   ROLES           AGE    VERSION   DISK   GPU
master.example.com   Ready    control-plane   143m   v1.29.3
node1.example.com    Ready    <none>          136m   v1.29.3   ssd    true
node2.example.com    Ready    <none>          135m   v1.29.3          true

root@master:~/Getting-Start-Kubernetes/12# kubectl get node -L gpu
NAME                 STATUS   ROLES           AGE   VERSION   GPU
master.example.com   Ready    control-plane   8d    v1.29.3
node1.example.com    Ready    <none>          8d    v1.29.3   true
node2.example.com    Ready    <none>          8d    v1.29.3   true


# node1에 해당하는 Pod 생성
root@master:~# cat nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector
spec:
  nodeSelector:
    gpu: "true"
    disk: ssd
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80

root@master:~# kubectl create -f nodeselector.yaml
pod/pod-nodeselector created

# 당연히 node1에 할당되는 것 확인
# 해당하는 노드가 없으면 Pending 상태로 남는다.
root@master:~# kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS   AGE    IP          NODE                NOMINATED NODE   READINESS GATES
pod-nodeselector   1/1     Running   0          101s   10.44.0.1   node1.example.com   <none>           <none>

 

 

Node Selector는 간단하지만 단순 조건만 지원하는 한계가 있다.

 

  • Key-Value 형태의 정확한 매칭만 지원.
  • 복잡한 조건(예: OR, NOT)을 사용할 수 없음.

이에 따라 더 유연한 노드 스케줄링 조건을 제공하는 Node Affinity, Taints와 Tolerations 와 같은 대안이 나왔다.

 

 

Selector와 Node Selector의 차이점

특징 Selector Node Selector
적용 대상 Service, ReplicaSet, Deployment 등 Pod의 스케줄링
주요 목적 리소스 그룹화 및 필터링 특정 노드에 Pod을 제한적으로 스케줄링
기반 데이터 리소스의 Label 노드의 Label
주요 사용 사례 - Service와 Pod 연결
- 리소스 관리
- 특정 노드 전용 워크로드
- 하드웨어 제약 조건
유연성 다양한 조건(Eq, In, Exists 등) 지원 단순한 Key-Value 매칭

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Canary Deployment  (0) 2024.03.20
[K8S] Annotation  (0) 2024.03.17
[K8S] 쿠버네티스 레이블  (0) 2024.03.17
[K8S] Ingress Controller  (0) 2024.03.07
[K8S] Service  (0) 2024.03.05