노드 풀 만들기 및 맞춤설정

이 페이지에서는 AWS용 GKE에서 노드 풀을 만드는 방법과 구성 파일을 사용하여 노드 구성을 맞춤설정하는 방법을 보여줍니다.

노드 풀을 만들려면 다음 리소스를 제공해야 합니다.

노드에 SSH로 액세스하려면 EC2 키 쌍 만들기를 수행하면 됩니다.

이 페이지는 클라우드 인프라를 설정, 모니터링, 관리하려는 IT 관리자와 운영자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.

표준 노드 풀 만들기

이러한 리소스를 사용할 수 있게 되면 다음 명령어로 노드 풀을 만들 수 있습니다.

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀에 대해 선택한 이름
  • CLUSTER_NAME: 노드 풀을 연결할 클러스터의 이름
  • INSTANCE_TYPE: 이 노드 풀에 원하는 AWS 머신 인스턴스 유형(예: m5.large)
  • ROOT_VOLUME_SIZE: 각 노드의 루트 볼륨에 원하는 크기(Gb)
  • NODEPOOL_PROFILE: 노드 풀 VM의 IAM 인스턴스 프로필 IAM 인스턴스 프로필 업데이트 방법에 대한 자세한 내용은 AWS IAM 인스턴스 프로필 업데이트를 참조하세요.
  • NODE_VERSION: 노드 풀의 각 노드에 설치할 Kubernetes 버전(예: "1.31.6-gke.200")
  • MIN_NODES: 노드 풀에 포함할 수 있는 최소 노드 수
  • MAX_NODES: 노드 풀에 포함할 수 있는 최대 노드 수
  • MAX_PODS_PER_NODE: 풀의 단일 노드에 생성할 수 있는 최대 포드 수
  • GOOGLE_CLOUD_LOCATION: 이 노드 풀이 관리될 Google Cloud위치의 이름
  • NODEPOOL_SUBNET: 노드 풀이 실행될 서브넷의 ID입니다.
    • 클러스터의 포드/서비스 IP 범위와 노드 풀 서브넷 네트워크 간에는 겹치지 않아야 합니다. 클러스터의 포드 및 서비스 IP 범위 선택에 대한 자세한 내용은 클러스터의 CIDR 범위 선택을 참조하세요.
    • 이 서브넷이 VPC 기본 CIDR 블록 외부에 있으면 몇 가지 추가 단계가 필요합니다. 자세한 내용은 보안 그룹을 참조하세요.
  • SSH_KEY_PAIR_NAME: SSH 액세스를 위해 생성된 AWS SSH 키 쌍의 이름입니다(선택사항).
  • CONFIG_KMS_KEY_ARN: 사용자 데이터를 암호화하는 AWS KMS 키의 Amazon 리소스 이름(ARN)입니다.

있으면 --tags 파라미터는 노드 풀에 있는 모든 노드에 지정된 태그를 적용합니다. 이 예시에서는 풀의 모든 노드에 노드가 속한 노드 클러스터와 풀의 이름으로 태그를 지정합니다.

노드 시스템 구성 맞춤설정

다양한 방법을 사용해서 노드 구성을 맞춤설정할 수 있습니다. 예를 들어 노드 풀을 만들 때 포드의 CPU 한도와 같은 파라미터를 지정할 수 있습니다.

노드 시스템 구성을 사용하여 Kubernetes 노드 에이전트(kubelet) 및 노드 풀의 하위 수준 Linux 커널 구성(sysctl)에 대한 커스텀 설정을 지정할 수 있습니다.

kubelet 에이전트 구성

kubelet을 사용하여 노드 구성을 맞춤설정하려면 Google Cloud CLI 또는 Terraform을 사용합니다.

gcloud

노드 풀을 만들 때 Kubernetes 노드 에이전트(kubelet)의 커스텀 설정을 지정할 수 있습니다. 예를 들어 kubelet에서 정적 CPU 관리 정책을 사용하도록 구성하려면 다음 명령어를 실행합니다.

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

다음을 바꿉니다.

  • POOL_NAME: 노드 풀 이름입니다.
  • CLUSTER_NAME: 노드 풀을 추가하려는 클러스터의 이름입니다.
  • LOCATION: 클러스터의 컴퓨팅 영역 또는 리전입니다.

위 명령어에 추가할 수 있는 필드의 전체 목록은 Kubelet 구성 옵션을 참조하세요.

Terraform

AWS 환경의 Terraform에 대한 자세한 내용은 Terraform 노드 풀 참조를 확인하세요.

  1. variables.tf 파일에 다음 블록을 포함하여 Terraform 변수를 설정합니다.

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. Terraform 구성에 다음 블록을 추가합니다.

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    다음을 바꿉니다.

    • NODE_POOL_RESOURCE_NAME: Terraform 템플릿의 노드 풀 리소스 이름입니다.
    • CLUSTER_NAME: 기존 클러스터의 이름입니다.
    • POOL_NAME: 맞춤설정할 노드 풀의 이름입니다.
    • SUBNET_ID: 노드 풀에 할당된 서브넷입니다.
    • CLUSTER_VERSION: AWS용 GKE 클러스터 컨트롤 플레인과 노드의 버전입니다.
    • CLUSTER_LOCATION: 클러스터의 Compute Engine 리전 또는 영역입니다.

sysctl 유틸리티 구성

sysctl을 사용하여 노드 시스템 구성을 맞춤설정하려면 awsClusters.awsNodePools.create 메서드에 POST 요청을 보냅니다. 이 POST 요청은 지정된 맞춤설정을 사용하여 노드 풀을 만듭니다. 다음 예시에서는 busy_pollbusy_read 파라미터가 각각 5,000마이크로초로 구성되어 있습니다.

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

다음을 바꿉니다.

  • ENDPOINT: Google Cloud 서비스 엔드포인트입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • GOOGLE_CLOUD_LOCATION: 클러스터의 Google Cloud 위치입니다.
  • CLUSTER_NAME: 노드 풀을 추가하려는 클러스터의 이름입니다.
  • NODE_POOL_NAME: 노드 풀 이름입니다.
  • CLUSTER_VERSION: 클러스터 버전 번호입니다(예: 1.31.0-gke.500).

위 JSON 요청에 추가할 수 있는 키-값 쌍의 전체 목록은 Sysctl 구성 옵션을 참조하세요.

kubelet 에이전트 구성 옵션

다음 표에서는 수정할 수 있는 kubelet 옵션을 보여줍니다.

Kubelet 구성 설정 제한사항 기본 설정 설명
kubelet_config_cpu_manager_policy 값은 none 또는 static이어야 합니다. "none" 이 설정은 kubelet의 CPU 관리자 정책을 제어합니다. 기본값은 OS 스케줄러가 자동으로 수행하는 것 이상의 어피니티를 제공하지 않는 기본 CPU 어피니티 스키마인 none입니다.

이 값을 static으로 설정하면 보장 QoS 클래스에서 정수 CPU 요청을 사용하는 포드에 단독 CPU 사용을 지정할 수 있습니다.
kubelet_config_cpu_cfs_quota 값은 true 또는 false이어야 합니다. true 이 설정은 포드의 CPU 한도를 적용합니다. 이 값을 false로 설정하면 포드의 CPU 한도가 무시됩니다.

포드가 CPU 한도에 민감한 경우 특정 경우에 CPU 한도를 무시하는 것이 좋습니다. cpuCFSQuota를 사용 중지할 경우 악의적인 포드가 의도한 것보다 더 많은 CPU 리소스를 사용할 수 있습니다.
kubelet_config_cpu_cfs_quota_period 값은 기간이어야 합니다. "100ms" 이 설정은 CPU CFS 할당량 기간 값인 cpu.cfs_period_us를 설정합니다. 이 값은 CPU 리소스에 대한 cgroup의 액세스를 다시 할당해야 하는 빈도에 대한 기간을 지정합니다. 이 옵션을 사용하면 CPU 제한 동작을 조정할 수 있습니다.
kubelet_config_pod_pids_limit 값은 1024에서 4194304 사이여야 합니다. -1 이 설정은 각 포드가 사용할 수 있는 최대 프로세스 ID(PID) 수를 설정합니다. 기본값으로 설정하면 PID 한도가 기본 머신 크기에 따라 자동으로 조정됩니다.

sysctl 유틸리티 구성 옵션

시스템 성능을 조정하려면 다음 속성을 수정하면 됩니다.

Spot 인스턴스 노드 풀

AWS용 GKE는 프리뷰 기능으로 AWS Spot 인스턴스 노드 풀을 지원합니다. Spot 인스턴스 노드 풀은 AWS에서 더 저렴한 비용으로 제공되는 Amazon EC2 Spot 인스턴스의 풀입니다.

스테이트리스(Stateless), 내결함성, 가변형 애플리케이션의 경우 Spot 인스턴스로 비용을 절감할 수 있습니다. 하지만 유연하지 않거나, 스테이트풀(Stateful)이거나, 내결함성이 없거나, 인스턴스 노드 간에 긴밀하게 결합된 워크로드에는 적합하지 않습니다. Spot 인스턴스는 EC2에서 용량이 다시 필요할 때 Amazon EC2에 의해 중단될 수 있으므로 Spot 시장의 변동성에 영향을 받습니다. 워크로드 용량을 보장해야 하고 간헐적인 사용 불가 기간을 감당할 수 없는 경우 Spot 인스턴스 노드 풀 대신 표준 노드 풀을 선택하세요.

AWS용 GKE는 용량 가용성이 가장 높은 Spot 인스턴스 풀을 선택하여 중단 위험을 최소화하는 데 집중하는 할당 전략을 사용합니다. 이 접근 방식은 이미지 및 미디어 렌더링이나 딥 러닝과 같이 중단 비용이 높은 워크로드에서 특히 유용합니다. 구체적으로, Spot 인스턴스 할당 전략의 설명과 같이 capacityOptimized 할당 전략이 구현되었습니다.

Spot 노드 풀 만들기

Spot 인스턴스 노드 풀을 만들려면 다음 명령어를 실행합니다.

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

다음을 바꿉니다.

  • NODE_POOL_NAME: 이 노드 풀에 할당하려는 이름입니다.
  • CLUSTER_NAME: 이 노드 풀을 연결하려는 클러스터의 이름입니다.
  • INSTANCE_TYPE_LIST: AWS EC2 인스턴스 유형의 쉼표로 구분된 목록입니다. 노드 풀은 이러한 인스턴스 유형으로 스팟 인스턴스를 프로비저닝합니다. 인스턴스 유형의 CPU 아키텍처, CPU 수, 메모리 양이 동일해야 합니다. 예: 'c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium'. Amazon EC2 인스턴스 선택기 도구를 사용하면 CPU 및 메모리 구성이 동일한 인스턴스 유형을 찾을 수 있습니다.
  • ROOT_VOLUME_SIZE: 각 노드의 루트 볼륨에 원하는 크기(Gb)
  • NODEPOOL_PROFILE: 노드 풀 VM의 IAM 인스턴스 프로필
  • NODE_VERSION: 노드 풀의 각 노드에 설치할 Kubernetes 버전(예: "1.31.6-gke.200")
  • MIN_NODES: 노드 풀에 포함할 수 있는 최소 노드 수
  • MAX_NODES: 노드 풀에 포함할 수 있는 최대 노드 수
  • MAX_PODS_PER_NODE: 풀의 단일 노드에 생성할 수 있는 최대 포드 수
  • GOOGLE_CLOUD_LOCATION: 이 노드 풀이 관리될 Google Cloud위치의 이름
  • NODEPOOL_SUBNET: 노드 풀이 실행될 서브넷의 ID입니다.
    • 클러스터의 포드/서비스 IP 범위와 노드 풀 서브넷 네트워크 간에는 겹치지 않아야 합니다. 클러스터의 포드 및 서비스 IP 범위 선택에 대한 자세한 내용은 클러스터의 CIDR 범위 선택을 참조하세요.
    • 이 서브넷이 VPC 기본 CIDR 블록 외부에 있으면 몇 가지 추가 단계가 필요합니다. 자세한 내용은 보안 그룹을 참조하세요.
  • SSH_KEY_PAIR_NAME: SSH 액세스를 위해 생성된 AWS SSH 키 쌍의 이름입니다(선택사항).
  • CONFIG_KMS_KEY_ARN: 사용자 데이터를 암호화하는 AWS KMS 키의 Amazon 리소스 이름(ARN)입니다.

INSTANCE_TYPE_LIST 필드에 여러 인스턴스 유형을 나열하는 것이 좋습니다. 이 권장사항이 중요한 이유는, 노드 풀이 단일 인스턴스 유형으로만 구성되면 원하는 가용성 영역에서 해당 인스턴스 유형을 사용할 수 없는 경우 노드 풀이 새 노드를 프로비저닝할 수 없기 때문입니다. 이로 인해 애플리케이션의 가용성이 저하되고 서비스 중단이 발생할 수 있습니다.

spot-instance-types 필드는 instance-type 필드와 상호 배타적입니다. 즉, 이러한 필드 중 하나만 제공할 수 있습니다.