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
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 |