무중단 서비스를 유지하면서 EKS nodegorup의 spec을 변경해야 하는 경우 적용

사전작업

  • 서비스 이중화 : 서비스의 replicas를 2 이상 설정하여 가용성울 보장한다.
  • request 값 확인 : 변경하려는 node의 spec이 서비스들의 request에 부족하지 않은지 확인한다.
  • topologySpreadConstraints 확인 : hostName으로 최대한 노드 이름 기준으로 POD가 분산 되어 뜰 수 있도록 확인한다.

Node Spec 변경

신규 노드그룹 추가

테라폼 코드를 활용하거나, EKS console에서 Add node group 메뉴를 통해 원하는 스펙의 노드그룹을 추가한다.

 

기존 노드 taint 설정

기존 노드에 taint(NoSchedule)을 설정하여 이동하려는 POD가 기존 노드 그룹에 뜨는걸 방지한다.
node_name_1은 ip-xx-xx-xx-xx.ap-northeast-2.compute.internal 과 같은 형태이다.

$ kubectl taint nodes node_name_1  key=value:NoSchedule
$ kubectl taint nodes node_name_2  key=value:NoSchedule

 

기존 노드 Drain 설정

1번 노드에 drain 설정하여 POD를 신규 노드 그룹으로 이동시킨다.

$  kubectl drain node_name_1 –ignore-daemonsets

위와 같이 local storage를 사용하는 POD를 삭제할 수 없다는 메시지가 나오는 경우 아래와 같은 옵션을 추가하여 POD를 이동시킨다.
이때 이동하는 POD의 data는 전부 삭제되기 때문에 주의해야 한다.

$  kubectl drain node_name_1 –ignore-daemonsets –delete-emptydir-data


1번 노드에서 이동한 POD들이 정상적으로 뜬걸 확인 후 2번 노드도 동일하게 작업한다.

$  kubectl drain node_name_2 –ignore-daemonsets

 

기존 노드 그룹 삭제 처리

POD 들이 완전히 이동한 걸 확인 후 기존 노드 그룹은 삭제처리한다.

EKS console 혹은 테라폼 코드를 활용한다.

참고

https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-worker-node-actions/

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/migrate-stack.html

https://halfmoon95.tistory.com/entry/EKS-Pod-%EC%88%98-%EC%A0%9C%ED%95%9C