1. nodeSelector
nodeSelector는 가장 단순한 형태의 스케줄링 제약 조건이다. 특정 label을 가진 노드에만 Pod를 배치하고자 할 때 사용한다.
예시
Node에 다음과 같은 label을 붙였다면:
kubectl label nodes node1 disktype=ssd
Pod 정의에서 다음과 같이 사용한다:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd
nodeSelector는 단일 조건만 처리할 수 있으며 복잡한 제약 조건에는 affinity를 사용한다.
2. affinity / anti-affinity
affinity는 노드나 Pod에 대한 보다 유연한 스케줄링 제어를 가능하게 한다. nodeAffinity와 podAffinity, podAntiAffinity 세 가지 유형이 있다.
nodeAffinity 예시
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
podAntiAffinity 예시
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: "kubernetes.io/hostname"
위 예시는 같은 Node에 같은 label(app=nginx)을 가진 Pod가 스케줄링되지 않도록 한다.
3. Taints & Tolerations
Node에 taint를 설정하면, 해당 taint를 tolerate하지 않는 Pod는 그 노드에 스케줄링될 수 없다. 특정 노드에 제한적인 Pod만 배치하고자 할 때 유용하다.
Taint 설정 예시
kubectl taint nodes node1 key=value:NoSchedule
Toleration 설정 예시
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
Toleration을 지정하면 해당 taint를 가진 노드에도 스케줄링될 수 있다.
4. Resource Requests & Limits 설정
Pod의 자원 요구량과 제한을 설정하면, 클러스터 자원을 효율적으로 분배할 수 있으며 스케줄러가 이를 기준으로 노드를 선택한다.
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- requests: 최소 보장 자원
- limits: 최대 사용 가능 자원
스케줄러는 requests 값을 기준으로 스케줄링하며, limits는 컨테이너가 초과할 수 없는 최대치로 동작한다.
5. Static Pod 구성
Static Pod는 kubelet이 직접 관리하는 Pod로, kube-apiserver에 의해 관리되지 않는다. Master 노드에서 중요한 시스템 컴포넌트를 실행할 때 사용된다.
구성 방법
- kubelet 실행 시 --pod-manifest-path 옵션으로 static pod 디렉토리를 지정한다.
- 해당 디렉토리에 Pod YAML 파일을 생성하면 kubelet이 자동으로 실행한다.
# /etc/kubernetes/manifests/static-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-nginx
labels:
role: static
spec:
containers:
- name: nginx
image: nginx
해당 파일을 지정된 디렉토리에 두면 kubelet이 이를 자동 감지하여 실행한다. 로그나 상태는 kube-apiserver를 통해 조회 가능하지만, 컨트롤러에 의해 관리되지는 않는다.
마무리
이번 포스트에서는 Kubernetes에서의 스케줄링 제어와 노드 제약 조건 설정에 대해 학습하였다. CKA 시험에서는 이러한 개념을 실제 YAML 파일 작성과 함께 빠르게 적용할 수 있어야 하므로, 실습을 통해 익숙해지는 것이 중요하다.
'Cloud > Kubernetes' 카테고리의 다른 글
| [CKA - 5] 스토리지 관리 (0) | 2025.08.20 |
|---|---|
| [CKA - 4] 네트워킹 & 서비스 (0) | 2025.08.19 |
| [CKA - 2] Pod 및 Workload 관리 (1) | 2025.08.07 |
| [CKA - 1] Kubernetes 클러스터 구성 및 관리 (1) | 2025.08.06 |
| [CKA] 환경구성 없이 2025 CKA 합격 (1) | 2025.08.05 |