Skip to main content

Affinity


nodeAffinity & nodeAntiAffinity

Pod가 스케줄링될 때 Node의 label을 기준으로 Pod을 스케줄링하거나 하지 않습니다.

spec:
affinity:
nodeAffinity:
# 필수적으로 만족해야하는 규칙입니다
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
# 여러개 선언하면 OR 조건이 적용됩니다
- matchExpressions:
# 여러개 선언하면 AND 조건이 적용됩니다
- key: <labelKey>
operator: In # In, NotIn, Exists, DoesNotExist, Gt, Lt
values:
- <labelValue>
# - matchLabels:
# <key>: <value>
# 선호하는 Node에 대한 규칙입니다
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 1 ~ 100, 만족하는 조건의 weight의 총합이 높은 Node를 선호합니다
preference:
matchExpressions:
- key: <labelKey>
operator: In # In, NotIn, Exists, DoesNotExist, Gt, Lt
values:
- <labelValue>

podAffinity & podAntiAffinity

Pod가 스케줄링될 때 topologyKey조건 내에서 label이 일치하는 Pod을 찾습니다. podAffinity의 경우 조건이 일치하는 토폴로지에 Pod를 배치하고, podAntiAffinity의 경우 조건이 일치하는 토폴로지를 피해서 Pod을 배치합니다.

spec:
affinity:
podAffinity:
# 필수적으로 만족해야하는 규칙입니다
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: <labelKey>
# namespaces가 null이거나 빈 배열이고 namespaceSelector가 null이면 Pod의 namespace를
# 기준으로 합니다.
# namespaces:
# - <namespace>
# namespaceSelector: {}인 경우 모든 namespace를 기준으로 합니다.
namespaceSelector:
matchExpressions:
- key: <labelKey>
operator: In # In, NotIn, Exists, DoesNotExist
values:
- <labelValue>
labelSelector:
matchExpressions:
- key: <labelKey>
operator: In # In, NotIn, Exists, DoesNotExist
values:
- <labelValue>

# 선호하는 Pod가 있는 Node에 대한 규칙입니다
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 1 ~ 100, 만족하는 조건의 weight의 총합이 높은 Node를 선호합니다
podAffinityTerm:
labelSelector:
matchExpressions:
- key: <labelKey>
operator: In # In, NotIn, Exists, DoesNotExist
values:
- <labelValue>
topologyKey: <labelKey>
  • topologyKey:Node의 label을 확인하여 <topologyKey>: <topologyValue>가 같은 Node를 기준으로 selector의 조건을 확인합니다
    • kubernetes.io/hostname: 한 Node 내에서 조건을 만족해야함
    • topology.kubernetes.io/zone: 같은 zone 내에서 조건을 만족해야함