Node Affinity
Node Affinity는 Kubernetes에서 Pod가 실행될 특정 노드를 선택하는 방법을 지정하는 기능입니다.
예를 들어서 현재 K8S 클러스터에는 controlplane, node01이라는 노드가 존재합니다.
controlplane이라는 노드에서는 k8s 클러스터를 운영하는데 중요한 컴포넌트만 존재합니다.
따라서 클러스터 운영과 관련 없는 컴포넌트들은 node01에만 스케줄링하고 싶습니다.
이때 사용할 수 있는 방법 중 하나가 Node Affinity입니다.
Pod가 스케줄 될 Node에 label 설정
Node Affinity를 사용하기 위해서는 pod가 스케줄링될 node를 선택하는데 기준이 될 label이 node에 필요합니다.
확인해 보니 node01에는 기존에 설정되어 있는 label들이 있습니다.
affinity 설정을 위해 해당 label들을 사용할 수 있지만, 새로운 label인 app=service를 추가해서 사용하겠습니다.
# kubectl label node {nodeName} {key}={value}
kubectl label node node01 app=service
node01의 labels를 확인해 보니 추가한 app=service가 존재하는 것을 볼 수 있습니다.
Pod에 Node Affinity 설정 추가
다음으로 할 일은 Pod에 node affinity를 설정하는 방법입니다.
우선 nginx 이미지를 사용하는 pod yaml 파일을 작성하겠습니다.
--dry-run=client -o yaml을 사용해서 설정 파일 템플릿을 쉽게 작성할 수 있습니다.
kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx.yaml
// 생성된 pod yaml 파일
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
node Affinity 설정은 spec의 바로 하위 레벨로 설정이 추가되면 되겠습니다.
추가할 설정은 다음과 같습니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 아래서 설명
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: In # 아래서 설명
values:
- service
requiredDuringSchedulingIgnoredDuringExecution라는 설정이 눈에 띕니다.
node affinity의 타입 중 하나로, 스케쥴링 대상에게는 동작하고 실행 중인 대상한테는 동작하지 않을 것처럼 보입니다.
* 설정할 수 있는 node affinity의 타입들은 다음과 같겠습니다.
- requiredDuringSchedulingIgnoredDuringExecution: Pod를 스케줄링할 때는 필수적으로 요구되지만, 실행 중인 Pod는 무시
- preferredDuringSchedulingIgnoredDuringExecution: Pod가 특정 노드에 스케줄링되길 원하지만, 강제하지 않음.
- requiredDuringSchedulingRequiredDuringExecution: Pod을 특정 노드에 스케줄링하도록 필수적으로 요구되고, 실행 중인 Pod도 해당 노드에서 실행되도록 함.
노드의 label을 select 할 것이기 때문에 nodeSelectorTerms을 사용했습니다.
matchExpressions는 node01의 label인 app=service를 이용할 것이기 때문에 key: app, values: service, operator는 In을 사용했습니다.
* operator에 설정할 수 있는 값으로는 In, NotIn, Exists, DoNotExist 등이 있습니다.
- In: Key에 대한 value가 주어진 values 중 하나와 일치하면 선택
- NotIn: Key에 대한 value가 주어진 values 중 하나와 일치하지 않는 경우 선택
- Exists: Key가 존재하면 선택
- DoNotExists: Key가 존재하지 않으면 선택
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: In
values:
- service
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
작성한 설정을 이용해 Pod를 띄우겠습니다.
의도한 대로 node01에 pod가 스케줄 된 것을 볼 수 있습니다.
정리
Node Affinity를 사용하면 특정 노드에 특정 유형의 Pod를 스케줄링할 수 있다.
Node Affinity는 Pod에 설정할 수 있고 Node의 label을 이용한다.
사용 사례
- 노드 별 하드웨어 차이에 따른 스케줄링: ex) hdd, ssd를 사용하는 노드가 존재할 때, 특성에 맞도록 Pod 스케줄링
- 데이터 로컬리티를 활용하기 위한 스케줄링: ex) 노드에 존재하는 캐시를 이용하거나 노드가 설치된 지역에 따라 Pod 스케줄링
- 노드 별 역할 분리에 따른 스케줄링: ex) batch 작업을 하는 노드, web service를 실행하는 노드로 역할을 나눠 Pod 스케줄링
참고
https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
노드 어피니티를 사용해 노드에 파드 할당
이 문서는 쿠버네티스 클러스터의 특정 노드에 노드 어피니티를 사용해 쿠버네티스 파드를 할당하는 방법을 설명한다. 시작하기 전에 쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이
kubernetes.io
본 글에서 확인할 수 없는 더욱 자세한 설명과 설정값은 공식 가이드 문서에서 확인할 수 있습니다.
'개발' 카테고리의 다른 글
[RabbitMQ] - 3. Spring boot로 Work Queue에 다수의 consumer를 등록하여 task 처리하기 (1) | 2024.01.14 |
---|---|
JPQL - Fetch join? with 테스트 코드 (0) | 2022.04.03 |
[RabbitMQ] - 2. Spring boot로 RabbitMQ 사용하기(hello world!) (3) | 2021.11.30 |
[RabbitMQ] - 1. Mac에서 RabbitMQ 설치하기 (3) | 2021.11.24 |
CentOS7 MySQL 포트 변경하며 생긴 이슈 (2) | 2021.05.07 |