Kubernetes Affinity
Affinity란 간단하게 설명하자면 원하는 Node에 Pod를 배치해주는 기능이다.
Affinity외에도 taint&toleration, cordon과 같은 기능으로 노드에 스케쥴링하는 것을 컨트롤 할 수 있다.
Affinity는 원하는 노드에 설치하도록 하는 성향이 강하고,
taint&toleration은 일부 Node에 특정 Pod만 스케쥴링하는 성격,
cordon은 노드 점검과 같은 것이 필요할 때 전체 스케쥴링 제외를 하는 것으로 보면 된다.
https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
해당 페이지를 참고하여 직접 적용했던 Affinity를 정리해봤다.
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
worker0 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker0
worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1
worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2
해당 페이지에서는 노드마다 label을 추가하여 적용을 했는데, 나는 hostname으로 affinity를 적용하였다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker1
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
앞서 확인한 label을 기준으로 Pod 명세를 찾아 spec하위의 내용을 수정해주면 된다.
이렇게 하면 worker1로 pod가 다시 스케줄링되는 것을 볼 수 있다.
나는 deployments, statefulset과 같은 것들을 통해 명세를 관리해서 해당 내용을 수정해서 바로 pod가 옮겨갔었다.
내가 사용한 requiredDuringSchedulingIgnoredDuringExecution 외에도,
preferredDuringSchedulingIgnoredDuringExecution 와 같은 설정도 가능하다.
required: 조건이 필수적으로 부합해야하며, 조건에 맞는 노드가 없다면 Pod가 pending상태로 유지
preferred: 조건에 맞지않아도 스케쥴링 가능, weight설정을 통해 스케쥴링 점수 조정 가능
이런식으로 차이를 보면 된다.
추가적으로 여러 노드(multi node)에 대해서 affinity를 설정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker1
- worker2
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
이런식으로 설정하게 되면 worker1, worker2중 선택되어 pod가 스케쥴링 되는 것을 확인할 수 있다.
'개발 > 개발공부' 카테고리의 다른 글
Kubernetes Pod Lifecycle / container, pod, 수명주기, 관리 (0) | 2023.01.22 |
---|---|
Kubernetes 클러스터 접근 구성하기 / kubeconfig, User Account, Service Account (0) | 2023.01.21 |
Kubernetes Init Container / Pattern, 초기화 컨테이너, 이닛 컨테이너, 패턴 (0) | 2023.01.18 |
Network 용어 정리 / Mac, IP, LAN, FDB table, ARP table, Flooding (0) | 2023.01.17 |
Kubernetes Cronjob / 쿠버네티스, 크론잡, container, k8s, 반복, 크론잡 (0) | 2023.01.16 |
댓글