소개
Kubernetes에서 노드 어피니티(Node Affinity)는 특정 조건을 충족하는 노드에 파드를 스케줄링할 때 사용됩니다. 이를 통해 파드가 특정 유형의 노드에 배치되도록 보장하거나, 노드 간의 작업 부하를 분산할 수 있습니다. 이번 실습에서는 노드 어피니티를 사용하여 특정 노드에 파드를 스케줄링하는 방법을 배웁니다.
Minikube 클러스터 시작하기
리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube는 로컬 머신에서 실행되는 경량 Kubernetes 환경입니다.
작업 디렉토리로 이동:
터미널을 열고 기본 프로젝트 폴더로 이동합니다:
cd /home/labex/projectMinikube 시작:
Minikube를 시작하여 Kubernetes 클러스터를 초기화합니다:
minikube start- 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
- 시스템 성능에 따라 Minikube가 시작되는 데 몇 분 정도 걸릴 수 있습니다.
Minikube 실행 확인:
Minikube 클러스터의 상태를 확인합니다:
minikube statuskubelet및apiserver와 같은 구성 요소가Running상태인지 확인합니다.- 클러스터가 실행 중이 아니라면
minikube start를 다시 실행하세요.
Minikube 시작 중 문제가 발생하면 minikube delete를 사용하여 환경을 초기화할 수 있습니다.
이 실습의 나머지 단계는 YAML 파일이 동일한 작업 디렉토리에 유지되도록 /home/labex/project에서 실행하세요.
레이블이 있는 노드 생성하기
이 단계에서는 파드 스케줄링에 사용할 레이블이 지정된 노드를 생성합니다.
/home/labex/project디렉토리에node-with-label.yaml파일을 생성하고 다음 내용을 입력합니다:
apiVersion: v1
kind: Node
metadata:
name: minikube
labels:
type: web
- 변경 사항을 적용합니다:
kubectl apply -f node-with-label.yaml
- 노드가 생성되고 레이블이 지정되었는지 확인합니다:
kubectl get nodes --show-labels
노드 어피니티를 사용하는 파드 생성하기
이 단계에서는 특정 레이블이 있는 노드에 파드가 스케줄링되도록 보장하는 노드 어피니티 규칙을 가진 파드를 생성합니다.
/home/labex/project디렉토리에pod-with-node-affinity.yaml파일을 생성하고 다음 내용을 입력합니다:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- web
- 변경 사항을 적용합니다:
kubectl apply -f pod-with-node-affinity.yaml
- 파드가
type=web레이블이 있는 노드에 스케줄링되었는지 확인합니다:
kubectl get pod pod-with-node-affinity -o wide
노드 안티 어피니티(Node Anti-Affinity)를 사용하는 파드 생성하기
이 단계에서는 특정 레이블이 있는 노드에 파드가 스케줄링되지 않도록 보장하는 노드 안티 어피니티 규칙을 가진 파드를 생성합니다.
/home/labex/project디렉토리에pod-with-node-anti-affinity.yaml파일을 생성하고 다음 내용을 입력합니다:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-anti-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: NotIn
values:
- web
- 변경 사항을 적용합니다:
kubectl apply -f pod-with-node-anti-affinity.yaml
- 파드가
type=db레이블이 있는 노드에 스케줄링되지 않았는지 확인합니다:
kubectl get pod pod-with-node-anti-affinity -o wide
노드 어피니티와 노드 셀렉터를 사용하는 파드 생성하기
이 단계에서는 노드 어피니티 규칙과 노드 셀렉터를 모두 사용하여 특정 레이블이 있는 노드에 파드가 스케줄링되도록 보장하는 파드를 생성합니다.
/home/labex/project디렉토리에pod-with-node-affinity-and-selector.yaml파일을 생성하고 다음 내용을 입력합니다:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-affinity-and-selector
spec:
containers:
- name: nginx
image: nginx:latest
nodeSelector:
type: web
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- db
- 변경 사항을 적용합니다:
kubectl apply -f pod-with-node-affinity-and-selector.yaml
- 파드가
type=web레이블이 있는 노드에 스케줄링되지 않았는지 확인합니다:
kubectl get pod pod-with-node-affinity-and-selector -o wide
다중 노드 어피니티 규칙을 사용하는 파드 생성하기
이 단계에서는 여러 노드 어피니티 규칙을 사용하여 모든 규칙을 충족하는 레이블이 있는 노드에 파드가 스케줄링되도록 보장하는 파드를 생성합니다.
/home/labex/project디렉토리에pod-with-multiple-node-affinity.yaml파일을 생성하고 다음 내용을 입력합니다:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-multiple-node-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- web
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
- 변경 사항을 적용합니다:
kubectl apply -f pod-with-multiple-node-affinity.yaml
- 파드가
type=web및disktype=ssd레이블이 있는 노드에 스케줄링되었는지 확인합니다:
kubectl get pod pod-with-multiple-node-affinity -o wide
요약
이번 실습에서는 노드 어피니티를 사용하여 특정 노드에 파드를 스케줄링하는 방법을 배웠습니다. 레이블이 지정된 노드를 생성하고, 노드 어피니티 규칙을 사용하여 특정 레이블이 있는 노드에 파드가 배치되도록 설정했습니다. 또한, 노드 안티 어피니티 규칙을 통해 특정 노드에 파드가 배치되지 않도록 제한하는 방법과, 여러 노드 어피니티 규칙을 조합하여 복잡한 스케줄링 요구사항을 충족하는 방법도 살펴보았습니다.


