Kubernetes) Affinity

개요

Affinity: 친밀감, 관련성, 친연성, 밀접한 관계 라는뜻의 명사

이 속성을 활용하면 Node나 Pod에 대해 선호하는 Node나 Pod 또는 그 반대의 상황을 구성할 수 있다.


Affinity와 Anti-affinity

Affinity

Affinity는 특정 Pod 들을 같은 위치에 배치하기 위해 사용하는 매커니즘임

서비스의 구성과 특성에 따라 연관성이 높은 위치에 구성하고 싶은 경우에 사용할 수 있음

  • 예) Redis cache 옆에 web server를 배치해서 네트워크의 지연을 최소화 하기 위해  동일한 위치에 Pod를 배포해보자
  • 예) 로그 수집기를 수집 대상 애플리케이션과 같은 Node에 배치해 지연을 최소화 해보자

Anti-affinity

Anti-affinity는 Affinity 매커니즘과 반대로 서로 떨어트려 배치하기 위한 매커니즘

고가용성, 재해복구, 안정화 등 여러목적을 위해서 Pod를 서로 떨어드려 배치하는데 사용할 수 있음

  • 예) 고가용성을 보장하기 위해 애플리케이션을 각기 다른 Node에 분산시켜 배포하자
  • 예) 같은 서비스의 Pod를 서로 다른 zone에 분산하여 재해 발생시 다른 한쪽에서 서비스를 유지할 수 있게 배포하자.

Required vs Preferred 의 구분

requiredDuringSchedulingIgnoreDuringExecution

Pod 배치시 선언되어 있는 조건을 완벽하게 만족해야함, 만약 조건에 부합하지 않는 경우 배치하지 않음

nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: disktype
        operator: In
        values:
        - ssd
  • 위와 같은 경우 disktype이 ssd가 아닌 경우 Pod를 배치하지 않음

preferredDuringSchedulingIgnoreDuringExecution

조건을 만족하면 좋지만, 그렇지 않더라도 배치는 함

가중치(weight)를 기반으로 배치되기 때문에 높은 가중치를 만족하는 조건에 배치함

nodeAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - weight: 100
    preference:
      matchExpressions:
      - key: disktype
        operator: In
        values:
        - ssd
  • disktype이 ssd로 선언되어 있으나, ssd가 존재하지 않는 경우 hdd 환경 등에도 배치가 진행됨

Affinity의 종류

Node Affinity

특정 Node에 Pod를 배치하기 위해 사용

nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: disktype
        operator: In
        values:
        - ssd
  • disktype이 ssd인 Node에만 Pod를 배치하도록 선언함
  • required로 선언했기 때문에 만약 ssd가 존재하지 않는 경우 Pending 상태로 유지됨

Pod Affinity

특정 Pod의 옆에 새로운 Pod를 배치함

podAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - weight: 100
    podAffinityTerm:
      labelSelector:
        matchLabels:
          app: redis
      topologyKey: kubernetes.io/hostname
  • Redis app에 위치한 Node에만 Pod를 위치시킴
  • 만약 Redis app이 없다면?
    • 위 구조에서는 preferred 이므로, redis가 없더라도 배치가 진행됨
    • 만약 required로 선언된 경우 pending 상태로 유지됨

Pod Anti-Affinity

특정 Pod가 위치한 Node에서 떨어져서 배치

PodAntiAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchLabels:
        app: web
    topologyKey: kubernetes.io/hostname
  • Web app이 위치한 Node가 아닌 다른 Node에 위치하도록 선언
    • web이라는 애플리케이션이 A라는 Node에 위치하는 경우 A Node가 아닌 다른 Node에 배치
    • preferred로 선언되었고 다른 Node가 없다면?
      • web 애플리케이션이 있지만 다른 Node가 없으므로 web이 위치한 Node에 배치함

'Infra > Kubernetes' 카테고리의 다른 글

Kubernetes) Health check  (0) 2025.12.01