본문 바로가기
개발/개발공부

Kubernetes Affinity / 쿠버네티스, Affinity, Node, Pod, Scheduling, values list

by 치킨개발자 2023. 1. 21.
728x90

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/

 

Assign Pods to Nodes using Node Affinity

This page shows how to assign a Kubernetes Pod to a particular node using Node Affinity in a Kubernetes cluster. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster.

kubernetes.io

해당 페이지를 참고하여 직접 적용했던 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가 스케쥴링 되는 것을 확인할 수 있다.

반응형

댓글