Kubernetes를 사용할 때 파드(Pod)를 특정 노드(Node)에 배치하는 것은 중요한 문제입니다. 특히 대규모 데이터 처리 작업이나 특정 하드웨어 요구사항을 만족해야 하는 경우에는 더욱 그렇습니다. 이번 포스팅에서는 이러한 요구를 충족시키기 위한 Kubernetes의 노드 어피니티(Node Affinity) 기능에 대해 알아보겠습니다.
노드 어피니티는 Kubernetes 스케줄링의 중요한 기능 중 하나로, 파드를 특정 노드에 배치하도록 지시하는 규칙을 정의할 수 있게 해줍니다. 이전에는 노드 선택기(Node Selector)를 사용하여 간단한 키-값 쌍으로 노드를 선택했지만, 이는 고급 표현(예: OR, NOT)을 사용할 수 없다는 제한이 있었습니다. 노드 어피니티는 이러한 한계를 극복하며, 더 세밀한 제어를 가능하게 합니다.
노드 어피니티 규칙은 파드의 스펙(spec) 아래에 정의됩니다. 일반적으로 "스케줄링 중 필요(required during scheduling), 실행 중 무시(ignored during execution)"와 같은 속성으로 표현됩니다. 이는 파드가 특정 노드에 배치되도록 하는 기본 규칙을 정의하지만, 노드가 변경되더라도 실행 중인 파드에는 영향을 미치지 않습니다.
Operator | Behavior |
---|---|
In | 제공된 문자열 집합에 레이블 값이 존재하면 파드를 배치 |
NotIn | 제공된 문자열 집합에 레이블 값이 포함되지 않으면 파드를 배치 |
Exists | 객체에 이 키를 가진 레이블이 존재하면 파드를 배치 |
DoesNotExist | 객체에 이 키를 가진 레이블이 존재하지 않으면 파드를 배치 |
현재 Kubernetes에서 사용 가능한 노드 어피니티 유형은 두 가지입니다.
또한, "스케줄링 중 필요, 실행 중 필요"와 "스케줄링 중 선호, 실행 중 필요"라는 두 가지 새로운 유형이 도입될 예정입니다. 이 새로운 유형에서는 노드 변경 시에도 어피니티 규칙을 계속해서 강제 적용할 수 있습니다. 이는 특정 하드웨어 요구사항이 있는 파드가 반드시 필요한 경우 매우 유용합니다.
예를 들어, 대형 노드에 대규모 데이터 처리 파드를 배치하고자 하는 경우, 다음과 같이 노드 어피니티를 정의할 수 있습니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- large
이 규칙은 "large" 레이블을 가진 노드에만 파드를 배치하게 하며, 이후 노드 레이블이 변경되더라도 파드는 그대로 유지됩니다.
노드 어피니티는 Kubernetes에서 파드 배치에 대한 고급 제어를 제공하는 강력한 도구입니다. 이를 통해 사용자는 특정 워크로드에 적합한 노드에 파드를 배치할 수 있으며, 스케줄링 전략을 보다 세밀하게 조정할 수 있습니다.