노드 선택기 및 어피니티
노드 선택기와 더욱 세밀한 노드 및 파드 어피니티 규칙을 사용하여 파드가 배치될 위치를 제어하세요.
노드 선택기 및 어피니티은(는) CoddyKit의 무료 DevOps Bootcamp 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 DevOps Bootcamp 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. DevOps Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.
파드가 배치될 위치 제어
기본적으로 쿠버네티스는 사용 가능한 모든 노드에 파드를 스케줄링합니다. 하지만 더 세밀하게 제어해야 한다면 어떻게 해야 할까요?
때로는 파드를 특정 노드에서 실행해야 합니다. 해당 노드에 특수 하드웨어나 라이선스가 있거나, 특정 가용 영역에 있을 수 있습니다.
이 단원에서는 노드 선택기와 노드 어피니티를 사용해 쿠버네티스 스케줄러가 파드를 배치하도록 안내하는 방법을 살펴봅니다.
스케줄러를 안내해야 하는 이유
고성능 SSD가 있는 노드에서 실행해야 하는 데이터베이스 파드나, 특정 하드웨어가 필요한 GPU 중심 애플리케이션이 있다고 가정해 보세요.
내결함성을 위해 특정 파드들이 서로 떨어져 실행되도록 하거나, 특정 운영 체제가 설치된 노드에서 실행되도록 해야 할 수도 있습니다.
쿠버네티스는 이러한 스케줄링 선호 사항을 표현할 수 있는 도구를 제공합니다.
노드에는 레이블이 있습니다
파드를 어디로 보낼지 지정하려면 먼저 노드에 식별 정보가 있어야 합니다! 쿠버네티스는 노드의 특성에 따라 노드를 식별하기 위해 레이블을 사용합니다.
- 레이블은
disk=ssd또는gpu=true와 같은 키-값 쌍입니다. kubectl label nodes <node-name> <key>=<value>를 사용하여 노드에 사용자 지정 레이블을 추가할 수 있습니다.- 이러한 레이블을 사용해 파드를 배치할 특정 노드를 지정합니다.
노드 선택기: 간단한 일치
파드를 특정 노드 집합으로 제한하는 가장 간단한 방법은 nodeSelector를 사용하는 것입니다.
이는 파드 사양에 포함되는 필드로, 키-값 쌍의 맵을 받습니다. 파드는 해당 레이블을 모두 가진 노드에만 스케줄링됩니다.
즉, "정확히 이런 노드가 필요합니다"라고 지정하는 것과 같습니다.
노드 선택기 적용
disk=ssd 레이블이 있는 노드가 있다고 가정해 보겠습니다. 파드가 해당 노드에서만 실행되도록 만드는 방법은 다음과 같습니다.
apiVersion: v1
kind: Pod
metadata:
name: ssd-app
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disk: ssd노드 어피니티: 고급 일치
nodeSelector는 간단하지만 매우 엄격합니다. "선호하는" 노드나 더 복잡한 일치 규칙을 사용하려면 어떻게 해야 할까요?
노드 어피니티는 더 유연한 방법을 제공합니다. 이를 사용하면 특정 레이블이 있는 노드에 파드를 배치하기 위한 "소프트" 또는 "하드" 요구 사항을 표현할 수 있습니다.
In, NotIn, Exists, DoesNotExist, Gt, Lt와 같은 연산자를 사용하는 더 강력한 구문을 사용합니다.
필수 및 선호 어피니티
노드 어피니티에는 두 가지 주요 유형이 있습니다.
requiredDuringSchedulingIgnoredDuringExecution: 파드는 규칙에 일치하는 노드에 반드시 스케줄링되어야 합니다. 이러한 노드가 없으면 파드는 스케줄링되지 않습니다.preferredDuringSchedulingIgnoredDuringExecution: 스케줄러는 규칙에 일치하는 노드를 찾으려고 하지만, 사용할 수 있는 노드가 없으면 다른 노드에 파드를 스케줄링합니다. 즉, "최선의 노력" 방식입니다.
필수 노드 어피니티
env=production 레이블이 있는 노드를 요구하는 파드는 다음과 같습니다. 이러한 노드가 없으면 파드는 보류 상태로 남습니다.
apiVersion: v1
kind: Pod
metadata:
name: prod-app
spec:
containers:
- name: my-container
image: httpd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- production파드 어피니티: 다른 파드도 중요합니다
다른 파드가 실행 중인 위치를 기준으로 파드를 스케줄링하려면 어떻게 해야 할까요?
- 파드 어피니티: 특정 레이블이 있는 다른 파드가 이미 실행 중인 노드로 파드를 끌어옵니다. 자주 통신하는 서비스를 같은 위치에 배치할 때 유용합니다.
- 파드 안티 어피니티: 특정 레이블이 있는 다른 파드가 실행 중인 노드에서 파드를 멀어지게 합니다. 고가용성을 위해 복제본을 여러 노드에 분산할 때 유용합니다.
파드 안티 어피니티 적용
이 매니페스트는 app=my-web 레이블이 있는 두 파드가 같은 노드에 스케줄링되지 않도록 합니다. 이를 통해 내결함성이 향상됩니다.
topologyKey는 안티 어피니티가 적용되는 범위를 지정합니다(예: 노드, 영역).
apiVersion: v1
kind: Pod
metadata:
name: web-app-pod
labels:
app: my-web
spec:
containers:
- name: web-container
image: busybox
command: ["sh", "-c", "echo 'Hello from web-app'; sleep 3600"]
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my-web
topologyKey: "kubernetes.io/hostname"지식 확인
중요한 데이터베이스 파드가 zone=dev 레이블이 있는 노드에 절대 스케줄링되지 않도록 하려고 합니다. 노드 레이블을 기준으로 이러한 엄격한 제외를 적용하려면 어떤 유형의 스케줄링 규칙을 사용해야 할까요?
복습: 스케줄링 제어
잘하셨습니다! 파드가 실행될 위치를 제어하는 강력한 방법을 배웠습니다.
- 노드 레이블: 노드의 특성을 식별하는 키-값 쌍입니다.
- 노드 선택기: 특정 레이블이 있는 노드에 파드를 스케줄링하는 간단하고 엄격한 일치 방법입니다.
- 노드 어피니티: 연산자를 사용해 노드를 선택하는 더 유연한 규칙(필수 또는 선호)입니다.
- 파드 어피니티/안티 어피니티: 다른 파드의 위치를 기준으로 파드를 함께 배치하거나 분리합니다.
이러한 도구는 리소스 사용을 최적화하고, 내결함성을 보장하며, 특정 애플리케이션 요구 사항을 충족하는 데 매우 중요합니다.
자주 묻는 질문
“노드 선택기 및 어피니티” 강의는 무료인가요?
네 — “노드 선택기 및 어피니티” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 DevOps Bootcamp 강의 전체를 잠금 해제할 수 있습니다. DevOps Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.
“노드 선택기 및 어피니티”에서 뭘 배우나요?
노드 선택기와 더욱 세밀한 노드 및 파드 어피니티 규칙을 사용하여 파드가 배치될 위치를 제어하세요. 브라우저에서 직접 실행하는 실습 코드로 DevOps Bootcamp을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
DevOps Bootcamp을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 DevOps Bootcamp은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“노드 선택기 및 어피니티” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 DevOps Bootcamp 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 DevOps Bootcamp 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 리소스 요청 및 제한
- 노드 선택기 및 어피니티
- 테인트 및 톨러레이션
- 파드 우선순위와 선점