King of Stock
[Kubernetes] StatefulSet podAntiAffinity 본문
StatefulSet pod anti affinity 옵션 적용시 주의사항
- 일반적으로 애플리케이션에 볼륨이 할당되고 계속 유지되며 동작해야 하는 애플리케이션들이 있다. 예를 들면 Elasticsearch 같은 오픈소스가 대표적인 예이다.
- 볼륨(상태)을 할당한 애플리케이션 Pod을 적용할때는 주로 StatefulSet을 사용한다.
- StatefulSet은 애플리케이션 Pod을 쿠버네티스 클러스터 환경에 적용시 PersistentVolume 리소스를 강하게 참조하는 특징이 있다.
고가용성을 위한 StatefulSet 적용
고가용성을 유지하기 위해서 클러스터 환경에 애플리케이션의 Pod을 적용시 Affinity and anti-affinity에서 언급하는 형태로 적용을 많이 한다.(물론 수평확장을 하지 않는다면 DaemonSet 리소스를 통해서 Pod을 적용하면 간단하다)
AWS, GCP 같은 클라우드 프로바이더에서 제공하는 StorageClass는 PersistentVolumeClaim 리소스의 요구사항을 사용해서 클라우드 프로바이더에서 제공하는 볼륨을 동적으로 Pod에 할당할수 있다.
공식 문서 등에 나온 기본적인 샘플 형태의 StorageClass yaml 내용을 그대로 사용하는 상태에서 StatefulSet 리소스 yaml에 Pod간에 서로 같은 노드에 설치가 되지 않도록 하는 anti-affinity 처리를 하면 아마도 오류가 발생할 것이다.
필자의 경우에는 아래와 같은 형태의 문제를 겪었었다.
# ... 중략 ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 3m16s (x6 over 3m21s) default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 3 times)
Warning FailedScheduling 23s (x13 over 3m16s) default-scheduler 0/3 nodes are available: 1 node(s) didn't match pod affinity/anti-affinity, 1 node(s) didn't satisfy existing pods anti-affinity rules, 2 node(s) had volume node affinity conflict.
Pod을 적용하는 스케줄러가 anti-affinity 처리를 하려고 했지만 볼륨 노드가 충돌이 있다고 한다. 이 경우에는 StorageClass yaml 정의에 바인드 모드를 변경하여 다시 적용하면 되는데 다음과 같다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
labels:
app.kubernetes.io/name: wait-aws-ebs
app.kubernetes.io/instance: wait-aws-ebs
app.kubernetes.io/version: 1.0.0
app.kubernetes.io/component: wait-storageclass
app.kubernetes.io/part-of: team
name: wait-storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
mountOptions:
- debug
volumeBindingMode: WaitForFirstConsumer
volumeBindingMode: WaitForFirstConsumer
사용한다. 샘플에 있는 Immediate
모드를 그대로 사용하면 즉시 할당해버려서 노드가 겹치는 볼륨을 할당해버리는 문제가 발생한다.
'IT 기술' 카테고리의 다른 글
[DNS] ubuntu server 18.04 DNS 서버 구성해보기 (0) | 2019.12.21 |
---|---|
[shell] if문에서 문자열 비교가 안될때 (0) | 2019.12.05 |
[test] TestRestTemplate (0) | 2019.07.07 |
[swagger2] Whitelabel Error Page (0) | 2019.07.06 |
JPA Auditing (0) | 2019.06.23 |
Comments