Kubernetes - Affinity & NodeSelector 사용하기
클러스터를 운영하다 보면 노드의 부하, Zombie Pod 이슈등 많은 이유로 인해 노드가 뻗을 수 있습니다.
이때, 뻗은 노드에 어떤 서비스들이 올라가 있는지 파악되지 않아 대처에 오토스케일링만을 기다리다가는 트러블 슈팅의 시간이 너무 오래걸릴 수 도 있으며, 리소스를 너무 많이 잡아먹거나 특별하게 따로 관리해야 하는 서비스인 경우 노드를 선택하여 파드를 띄울 필요성이 있습니다.
이러한 부분을 해결하기 위한 것이 NodeSelector와 Affinity입니다.
NodeSelector는 차후 사용되지 않을 예정이기 때문에, Affinity를 사용하여 진행해 주셔야합니다.
쿠버네티스 Docs는 상당히 정리가 잘 되어있기 때문에, Docs링크를 먼저 공유드립니다.
kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
자, EKS에서 세팅을 해보도록 하겠습니다.
먼저 클러스터의 노드를 아래와 같이 구성해주도록 하겠습니다.
kubernetes label을 아래와 같이 노드그룹 생성 시 붙여주시면 됩니다.
혹은 아래 명령어를 통해서도 붙이실 수 있습니다.
kubectl label nodes <your-node-name> node-group-type=FRONTEND
그렇게 아래와 같이 Frontend, Backend, Manage 노드를 분리하여 사용해 보도록 하겠습니다.
(너무 많은 라벨이 있어 편집을 조금 거친 스샷입니다.)
보시다 시피 대역을
Frontend - x.x.157.x
Backend - x.x.158.x
Manage - x.x.159.x로 서브네팅을 구성하였습니다.
이제 Affinity의 예시를 보도록 하겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: phh-fo
namespace: phh-test-fo
spec:
selector:
matchLabels:
app: phh-fo
replicas: 1
template:
metadata:
labels:
app: phh-fo
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodegroup-type
operator: In
values:
- FRONTEND
terminationGracePeriodSeconds: 30
containers:
- image: {{ ECR Repository }}
imagePullPolicy: Always
name: phh-fo
ports:
- containerPort: 9000
Affinity에서 설정값을 줄 수 있는 부분은
requiredDuringSchedulingIgnoredDuringExecution와 preferredDuringSchedulingIgnoredDuringExecution입니다.
requiredDuringSchedulingIgnoredDuringExecution는 기존 NodeSelector와 동일하게 해당 조건을 만족하는 노드에만 파드를 띄우는 것이며, preferredDuringSchedulingIgnoredDuringExecution는 말 그대로 그러한 조건을 만족하는 노드를 선호하여 띄운다는 것입니다.
따라서 무조건 해당 노드에 띄워야 할 경우 requiredDuringSchedulingIgnoredDuringExecution을 사용하여 띄워주시면 됩니다.
파드를 띄운 후 어떠한 노드에 할당되었는지 체크해 보시면 위와같이 157 대역의 노드에 잘 할당된 것을 확인할 수 있습니다.
원하는 노드에 파드를 띄우는 방법에 대해서 알아봤습니다.