EKS 시작하기 시리즈는 K8S에 대한 상세 설명을 다루지 않습니다. K8S가 아닌 'AWS 관리형 K8S'에 초점을 맞춥니다.
틀린 내용이 있을 수 있습니다. 지적은 언제나 환영입니다.
이 글에서는 AWS EKS의 워커 노드로 사용할 수 있는 컴퓨팅 엔진에 대해 다룬다.
해당 글에서 다루는 모든 메뉴는 현 시점(2024.01.06.)의 AWS Console 기준이다.
사용자는 AWS Console의 EKS 노드 관리 메뉴에 접속해있다고 가정한다.
해당 메뉴는 AWS Console - EKS - 클러스터 - (설정할 클러스터) - 컴퓨팅 으로 접속하면 확인할 수 있다.
AWS에서 지원하는 EKS의 관리형 워커 노드로 사용할 수 있는 컴퓨팅 엔진은 다음 두 가지이다.
EC2 노드 그룹은 EKS의 워커 노드로 EC2와 ASG(Auto Scaling Group)을 사용한다.
EC2와 ASG는 Fargate에 비해 자주 접해볼 수 있는 리소스이기에 Fargate Profile보다 먼저 살펴본다.
EC2 노드 그룹은 AWS Console의 '노드 그룹 생성' 버튼을 통해 생성할 수 있다.
노드 그룹의 설정은 EC2 ASG 설정과 거의 동일하며, K8S에 특화된 설정(Taint, Label)을 지원한다.
노드 그룹을 생성하는 절차는 4단계로 나뉜다.
'노드 그룹 구성' 단계에서는 노드 그룹의 이름, 해당 그룹의 노드들에게 할당할 IAM Role, Kubernetes Taint 및 Label, AWS 리소스 태그를 설정할 수 있다.
Kubernetes에 특화된 설정인 Taint와 Label에 대한 설명은 이 문서의 범위를 넘어가므로 다루지 않는다.
노드 그룹 컴퓨팅 구성
노드 그룹 컴퓨팅 구성 섹션에서는 노드 그룹 내의 노드, 즉 EC2 인스턴스의 AMI, 용량 유형 및 인스턴스 유형, 디스크 크기를 설정한다.
AWS에서는 노드 그룹을 위한 EKS 최적화 AMI(워커 노드 설정 및 컨테이너 엔진, IAM 인증 설정 등이 포함됨)을 제공한다.
노드 그룹 조정 구성
노드 그룹 조정 구성 섹션에서는 EC2 노드 그룹의 크기를 설정하는데, 이 설정은 ASG의 설정과 동일하다.
노드 그룹의 최대/최소 크기를 설정하고, 최대/최소 크기 사이에서 최초로 생성될 노드 그룹의 크기를 지정한다.
노드 그룹 업데이트 구성
노드 그룹 내의 노드들이 사용할 수 있는 새로운 버전의 AMI가 생겼을 때 업데이트를 수행하게 되면 기본적으로 노드를 하나씩 업데이트 하게 된다.
만약 이 노드 그룹은 노드 하나 이상의 중단을 허용한다면 수 혹은 백분율 설정으로 한 번에 업데이트 될 노드의 수를 지정할 수 있다.
이 설정의 값을 올리게 되면 설정한 수 만큼 병렬적으로 AMI 업데이트를 수행하므로 업데이트에 필요한 시간을 줄일 수 있다.
'네트워킹 지정' 단계에서는 노드 그룹 내의 노드에게 적용되는 네트워킹 설정을 제어할 수 있다.
노드가 배포될 서브넷을 지정하고, 노드에 대한 원격 액세스(SSH) 허용 여부를 설정한다.
당연하게도 private subnet에 노드 그룹을 배포한 경우 노드에 대한 원격 액세스를 허용한 경우라도 Bastion혹은 VPN을 통하지 않고서는 원격으로 액세스 할 수 없다.
원격 액세스를 허용하는 경우 원격 액세스 시 필요한 키페어와 노드 보안 그룹 설정이 필요하다.
이 설정은 노드 그룹 생성 단계에서만 제어할 수 있고, 생성 후에는 설정을 변경할 수 없으므로 주의하자.
'검토 및 생성' 단계에서는 위 3단계를 걸처 설정한 구성을 검토한다.
구성에 문제가 없다면 노드 그룹을 생성하고, 그렇지 않다면 이전 단계로 돌아가 설정을 변경한다.
이 글의 주제가 Fargate가 아닌 만큼 자세히 다루지는 않고 간단하게 살펴본다.
Fargate는 EC2 노드 그룹 처럼 노드 그룹의 크기 및 인스턴스 유형 등을 정해두지 않고 애플리케이션이 사용할 리소스만 설정해놓으면 요구사항에 따라 자동으로 확장/축소되는 서버리스 컴퓨팅 엔진이다.
이 페이지에서 요금과 인스턴스 구성을 확인할 수 있다. 지원하는 인스턴스 구성에 맞춰 리소스 사용량을 설정하는 것을 추천한다.
아래에서 EKS에 Fargate Profile을 생성하는 단계에 대해 설명한다.
이 단계에서는 프로파일 이름(EC2 노드 그룹의 그룹 이름과 같은 역할이다.)과 Fargate 리소스의 실행 권한, K8S Pod가 실행될 서브넷, 그리고 태그를 설정한다.
Fargate Profile을 만드는 단계에서 가장 핵심이라고 할 수 있는 단계이다.
여기서는 어떤 네임스페이스의 pod가 생성할 Fargate Profile에 배포될지 설정한다.
추가로 설정된 네임스페이스 내의 Pod 중 특정 label이 설정된 pod만 배포할 수 있도록 설정할 수 있다.
EC2 노드그룹에서는 Label + Node Selector 혹은 Taint를 사용하여 pod가 배포될 노드를 제한하지만 Fargate Profile은 간단한 설정만으로 Pod가 배포될 노드를 제한할 수 있다.
마지막으로 위 2단계에서 설정한 구성을 검토하고 생성한다.
여기까지만 보면 무조건 Fargate Profile을 사용하는 것이 좋아 보일 수 있다.
Fargate Profile은 리소스가 필요한 만큼 자동으로 배포되어 리소스 낭비가 적고, EC2 노드 그룹에 비해 AWS에서 관리해주는 부분이 더 많기 때문에 관리 오버헤드를 줄일 수 있는것은 사실이나, 리소스 크기를 잘못 설정하면 리소스 낭비가 오히려 심해질 수 있으며, 가격 또한 EC2 노드 그룹에 비해 저렴하지 않다(리소스 낭비가 없다는 가정 하).
또, Fargate Profile이 가지는 또 다른 특성이 있는데, K8S의 DeamonSet 리소스의 배포가 불가능 하다는 점이다.
만약 애플리케이션의 메트릭/로그 수집 등을 위해 DeamonSet의 배포가 필요한 경우 사이드카 패턴 등의 사용을 고려해야 할 것이다. (이 경우 학습/관리 포인트가 늘어남을 항상 고려하자.)
둘 중 하나가 무조건 좋다기 보다는 사용 용도를 고려하여 선택해야 할 것이다.