쿠버네티스는 기본적으로 pod가 분할되어 배치된다.
2개의 워커 노드로 구성된 클러스터를 사용중에
인그레스를 이용해 서비스를 운영하려고한다.
인그레스 컨트롤러 파드는 각 노드에 한 개 이상의 파드가 동작하고 있어야 한다.
인그레스 컨트롤러의 replicas=2로 조정하면 각 노드로 파드가 분할되지만, 그렇지 않을 경우도 간혹 생겨 중요한 서비스를 운영중이라면 파드를 여러 노드로 분할해 배포하는 방식을 알아야 한다.
An
spec:
affinity:
#podAntiAffinity:
#podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/component
operator: In
values:
- controller
#topologyKey: kubernetes.io/hostname
#topologyKey: topology.kubernetes.io/zone
#topologyKey: topology.kubernetes.io/region
podAffinity는 조건과 부합하는 영역에 배포
podAntiAffinity는 반대 의미이다
requiredDuringSchedulingIgnoredDuringExecution
는 조건이 필수조건을 뜻한다.
아래 조건으로 선호 기준을 선택할 수 있다.(선호 하지 않으면 그 외 것들에 기회가 주어진다.)
preferredDuringSchedulingIgnoredDuringExecution
즉 조건을 requiredDuringSchedulingIgnoredDuringExecution
일 경우 충족하지 못하면 정상적으로 배포되지 않는다.
topologyKey: kubernetes.io/hostname
: 노드 기준
topologyKey: topology.kubernetes.io/zone
: 가용 영역 기준(AZ)
topologyKey: topology.kubernetes.io/region
: 리전 기준
으로 선택 가능하다.
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: kubernetes.io/hostname
이런 식으로 구성한다면, 라벨 셀렉터에 해당하는 파드가 동작중인 노드 기준으로 그 외 노드에 파드를 배치한다.
두 개의 노드가 동작중일 경우, replicas=2를 넣어주면 파드가 각 노드에 겹치는 경우를 대비할 수 있다.
실제 내가 작성한 것이 맞는지 podAffinity를 활용해 검증해보았다.
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: kubernetes.io/hostname
worker node : 2개
replicas : 5
검증 성공