2-7. NodeGroup이란 무엇인가?

황인권·2025년 2월 10일

Kubernetes

목록 보기
14/37

노드 그룹이란?

  • 노드 그룹이란 같은 역할을 하기 위해 모인 여러 개의 노드를 묶어서 부르는 용어
    • 노드 그룹은 쿠버네티스의 오브젝트가 아니고, 편의를 위해 만든 개념
  • 쿠버네티스 클러스터 안에는 실제로 다양한 사양의 노드가 존재할 수 있다.
    • 이런 여러 노드를 용도별로 분류해 놓아 관리의 편의성을 높인다.
  • 실제 대규모 환경에서는 노드의 개수도 매우 많기 때문에 이를 그룹화하여 노드 그룹으로 관리하는 경우가 대부분이다.

    그림에서 1번 노드 그룹은 메모리 집약적인 Pod를 실행하기에 최적화된 노드들이 모여있다.

새로운 노드 그룹 만들기

AWS 사용

  1. EKS 클러스터 상세 화면에 진입하여, 컴퓨팅 탭에 있는 노드 그룹 추가를 클릭

  1. 새로 만들 노드 그룹의 이름을 입력하고, IAM 역할은 기존에 생성했던 것을 선택

  2. 다음 화면에서 노드 그룹 컴퓨팅 구성의 인스턴스 유형을 'm5a.large'로 선택

  • m5a.large 유형의 노드는 CPU 코어 개수에 비해 메모리 용량이 많아, 메모리를 많이 필요로 하는 Pod를 실행하는데 적합한 유형이다.

  1. 나머지 옵션들은 별다른 설정 없이 노드 그룹을 생성

  2. 새로운 노드 그룹이 생성되고 있는 화면을 볼 수 있다.

  3. 잠시 후 노드 그룹이 활성 상태로 변경되고, 노드 탭에도 새로운 노드 그룹에 있는 노드의 목록이 보여진다.

  4. kubectl get nodes를 입력해서 쿠버네티스 클러스터가 새로운 노드를 잘 인식하고 있는지도 확인할 수 있다.

GCP 사용

GKE에서는 '노드 그룹'이라는 말 대신 '노드 풀'이라는 용어를 사용한다.

  1. 클러스터 상세 화면에서 '노드 풀 추가'버튼을 클릭

  2. 새로 만들 노드 풀의 이름을 입력

  3. 노드 풀 내의 노드 수를 설정.

  • 클러스터 자동 확장 처리 사용 설정을 체크하면 노드 오토스케일링이 적용
  1. 좌측에서 '노드'를 클릭하여 노드 상세 설정 화면에 진입

  2. 머신 구성 항목에서 'N1'을 선택하고, 머신 유형에서 '고성능 메모리' -> 'n1-highmem-2'를 선택

  • AWS의 m5a 노드와 비슷하게, CPU 코어에 비해 상대적으로 많은 양의 메모리를 가지고 있는 노드 유형인것을 확인 가능

  1. 보조 부팅 디스크를 20GB로 설정하고 노드 풀 생성을 완료

  2. 노드 풀이 추가되는 모습을 확인 할 수 있다.
    생성이 완료된 이후에 kubectl get nodes 명령어를 통해 노드가 제대로 인식되고 있는지 확인!


원하는 노드 그룹에 Pod 배치하기

AWS 사용

  • 특정 노드 그룹에 속한 노드에 같은 Label을 달아서, 이를 이용해 특정 Pod가 원하는 노드 그룹에서 실행되도록 할 수 있다.
  • AWS의 노드 그룹 설정에 들어가면, Label을 설정할 수 있는 항목이 있는데 여기서 레이블을 설정하면 해당 노드 그룹 안에 있는 모든 노드들에 설정한 Label이 붙게 된다.
  1. Label을 설정 할 노드 그룹을 클릭해 노드 그룹의 상세 화면에 진입

  2. 노드 그룹 상세 화면에서 '편집' 버튼을 클릭해 노드 그룹 설정 화면으로 진입

  3. Kubernetes 레이블 항목에서 새로운 Label을 추가해 원하는 내용을 입력

  1. 그대로 변경 사항 저장하면 끝

GCP 사용

  1. 클러스터 상세 화면에서 '노드' 탭으로 진입하여 설정할 노드 풀을 클릭

  2. 노드 풀 상세 화면에서 '수정' 버튼을 클릭하여 설정 화면으로 진입

  3. Kubernetes 라벨 항목에서 라벨 추가 버튼을 클릭 후, 설정할 Label 내용을 입력

  4. 그대로 저장

  • Pod에 nodeSelector라는 옵션을 추가하여, 해당 Label이 붙어있는 Node에서만 해당 Pod가 실행되도록 설정할 수 있다.

    ReplicaSet에 nodeSelector를 적용하는 모습을 보여주지만, ReplicaSet 내에서 Pod의 스펙을 정의하는 것이기 때문에, Pod 오브젝트만을 따로 정의 할 떄에도 nodeSelector 옵션을 동일하게 사용 가능!

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.27.0
    ports:
    - containerPort: 80
  nodeSelector:
    optimized_type: memory

  • cpu라는 이름으로 바꿔서 실행해보면 Pending 상태로 계속 있게 되는 것을 확인 가능

클러스터 오토스케일러(CA)

GCP의 GKE는 별다른 설정 없이도, 노트 풀에서 '클러스터 자동 확장 처리 사용 설정' 기능을 활성화하면 자동으로 노드 오토 스케일링이 작동한다.

  • 많은 Pod가 필요한 경우 현재 존재하는 노드가 부족할 수 있는데, 이럴 때 클라우드 서비스의 오토스케일링 기능을 이용하면 부족한 만큼 노드가 알아서 증가되게 할 수 있다.
    • 이렇게 노드가 부족할 때 알아서 필요한 만큼 노드를 증설(Scale-out)하고, 노드가 너무 과하게 많은 경우 노드를 감설(Scale-in)하는 역할을 하는 기능을 '클러스터 오토스케일러'라고 한다.
    • 주의! 이건 쿠버네티스의 기능이 아니라 AWS나 GCP와 같은 클라우드 서비스가 제공하는 기능이다.

AWS 사용

AWS에서 클러스터 오토스케일링 기능을 사용하는 방법은 쿠버네티스 개발자들이 친절하게 정리하여 https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/cloudprovider/aws 에 공유되어있다.

  1. 쿠버네티스 클러스터에 '액세스' 메뉴로 이동하여 노드 그룹의 액세스 항목 상세 화면에 진입

  2. 노드 그룹의 액세스 정책 상세 화면에서 'IAM에서 보기' 버튼을 클릭하여 IAM 서비스로 이동

  3. 권한 정책 항목에서 '권한 추가' -> '인라인 정책 생성' 버튼을 클릭하여 정책 추가 화면으로 진입

  4. 정책 편집기를 JSON 모드로 변경

  5. https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md
    가이드에 따라, 정책 내용을 입력.

  6. 다음으로 이동하여, 정책 이름을 입력하고 정책 생성을 완료

  7. https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml 파일의 내용을 복사하여 쿠버네티스에 apply 시킬 yaml 파일을 만든다.

  8. 파일 내용 마지막 부분쯤에 있는 < YOUR CLUSTER NAME > 부분을 내 EKS 클러스터 이름으로 수정


  1. 해당 yaml 파일을 apply 하면 설정 완료

  2. 이제부터 노드 그룹에 설정된대로 오토스케일링 기능이 동작

  • 원하는 크기 : 지금 실제 적용할 노드의 개수
  • 최소 크기 : Scale-in의 최소치
  • 최대 크기 : Scale-out의 최대치

GCP 사용

GCP의 GKE는 별다른 설정 없이도, 노트 풀에서 '클러스터 자동 확장 처리 사용 설정' 기능을 활성화하면 자동으로 노드 오토 스케일링이 작동한다.

  • 현재 노드의 상태는 현재 2개의 노드가 있고 최대 크기가 4인 상태이다.

  • Request와 Limit을 설정하여 노드 개수가 늘어나는지 확인

처음 실행시 노드는 2개이고 실행된 Pod는 6개 나머지 4개는 Pending 상태이다.

  • 시간이 지난후 노드가 4개로 증가, Pod는 10개 실행된 모습을 볼 수 있다.

profile
inkwon Hwang

0개의 댓글