파드간 affinity 사용(podAntiAffinity)
- affinity는 Pod를 특정 Node에 배포되도록 하는 정책이다
1. Hard affinity
- 규칙이 만족되는 경우만 파드가 기동된다.
#requiredDuringSchedulingIgnoredDuringExecution:
규칙이 만족되지 않으면 스케줄러가 파드를 스케줄링할 수 없다.
이 기능은 nodeSelector와 유사하지만, 좀 더 표현적인 문법을 제공한다.
ex) 만약 node가 4개 인데 pod replicas가 5개면 pod 4개는 running이지만
pod 1개는 affinity 정책에 걸려 pending 상태로 남아있다.
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {pod_name}
topologyKey: kubernetes.io/hostname
2. Soft affinity
- 최대한 규칙이 만족되는 경우를 찾으려고 노력하고 해당 규칙이 없어도 파드를 기동한다.
#preferredDuringSchedulingIgnoredDuringExecution:
스케줄러는 조건을 만족하는 노드를 찾으려고 노력한다.
해당되는 노드가 없더라도, 스케줄러는 여전히 파드를 스케줄링한다.
ex) node가 4개일때 pod를 5개 만들면 적당히(?) pod를 분배해서 기동시킨다.
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {pod_name}
topologyKey: kubernetes.io/hostname
weight: 1
weight 필드를 이용해서 선호도 조절이 가능하다.
weight의 값이 높은 node를 우선으로 고려하여 스케쥴링 한다.
예를 들어 아래처럼 weight를 2개 설정해두면
둘다 조건에 해당되는 경우 weight값이 높은 20에 pod가 스케쥴링 된다.
preferredDuringSchedulingIgnoredDuringExecution: # Preferred Node Affinity로 설정
- weight: 10
preference:
matchExpressions:
- key: app
values: {pod_name}
operator: In
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
matchExpressions:
- key: app2
values: {pod_name}
operator: In
참고로 위 예제에서 사용하는 pod 구분 요소 값은
- key: app
operator: In
values:
- {pod_name}
기동되고 있는 pod를 kubectl get pod {pod_name} -o yaml로 봤을때
labels 부분에 app이라는 key와 그의 values 값인 pod_name으로 구분하는 걸 뜻한다.
'Kubernetes' 카테고리의 다른 글
kubespray kubernetes 설치하기 (4) | 2023.10.17 |
---|---|
kubernetes pod 기동 시 오류(networkPlugin cni failed to teardown pod) (0) | 2023.08.16 |
Command probe 적용하기 (0) | 2023.05.31 |
Pod Lifecycle(readiness,liveness Probe) (0) | 2023.05.30 |
Pod Resource 관리(cpu, mem limits) (0) | 2023.05.22 |