PodDisruptionBudget로 애플리케이션 보호
Kubernetes를 사용할 때 아주 중요한 설정이 있습니다. Karpenter와 같은 오토스케일러와 맞물리면 더욱 빛을 보게 되는 설정인데 바로 PodDisruptionBudget(PDB) 입니다. 오토스케일러를 Karpenter로 예를 들어 설명해 보겠습니다. consolidation으로 노드가 제거될 수도 있고 spot을 이용 중이라면 spot 종료 이벤트를 받을 수도 있습니다. 이때 해당 노드에 서비스되는 모든 pod가 한순간에 모두 종료 돼버린다면 자칫 서비스에 다운타임이 발생할 수도 있습니다. 이때 필요한 게 PDB입니다.
PDB를 쉽게 설명하자면 무슨 일이 있어도 지정된 개수의 pods는 유지를 해달라는 설정입니다(이외에 다른 조건도 설정할 수 있습니다). 배포를 위해 Deployments를 rollout 하든, 노드가 죽든, 일단 지정된 pods 개수를 유지하라는 설정인데 결국은 노드를 terminate 시킬 거면 새로운 노드를 먼저 띄우고 기존 노드를 종료해야 하는 상황이 만들어집니다. 이때 최소 노드 개수를 유지하기 위해 새로운 노드에 pods을 먼저 배치할 수 있게 되는 거죠. NTH와 함께 사용한다면 Graceful Shutdown을 위한 시간을 보장받기 때문에 우아한 종료가 가능해집니다.
아래와 같이 간단하게 설정이 가능합니다.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
위에 yaml로 PDB를 배포하면 app: zookeeper에 대해 PDB가 설정되어 최소 2개의 pod이 유지될 겁니다. 아래와 같이 확인할 수 있습니다. ( 샘플입니다 )
$ kubectl get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
zk-pdb 2 N/A 4 12d
MAX UNAVAILABLE은 설정하지 않았고, ALLOWED DISRUPTIONS의 4는 zookeeper가 6개의 pods로 운영중이라 최소 2개를 유지하려면 4개를 종료할 수 있다는 의미입니다.
PDB는 deployments 단위로 설정해주면 좋습니다. 물론 굳이 가용성을 챙기지 않아도 되는 애플리케이션의 경우에는 사용하지 않아도 됩니다. 분명 다운타임이 잠깐 있어도 되는 내부 서비스라던지, 이벤트 기반의 서비스 등은 필요 없을수도 있겠죠. 그 외의 경우라면 아주 간단한 설정으로 서비스 전체의 가용성을 책임질 수 있으니 설정하지 않았다면 꼭 살펴보시고 사용하시길 바랍니다.