사용자 클러스터 확장

GKE on AWS에서 워크로드를 확장하려면 AWSNodePools를 자동으로 확장하도록 구성하거나 수동으로 AWSNodePool을 만들고 삭제하여 확장 또는 축소할 수 있습니다.

클러스터 자동 확장 처리

GKE on AWS는 Kubernetes 클러스터 자동 확장 처리를 구현합니다. 노드 수요가 높으면 클러스터 자동 확장 처리가 노드 풀에 노드를 추가합니다. 노드 수요가 낮으면 클러스터 자동 확장 처리가 지정된 최소 크기로 축소 조정합니다. 이를 통해 필요한 경우 워크로드의 가용성을 높이고 비용을 관리할 수 있습니다.

개요

클러스터 자동 확장 처리는 워크로드 수요를 기준으로 지정된 노드 풀에서 노드 수 크기를 자동으로 조정합니다. 수동으로 노드를 추가, 제거하거나 노드 풀을 과도하게 프로비저닝할 필요가 없습니다. 대신 노드 풀의 최소 및 최대 크기를 지정하면 클러스터는 자동으로 확장됩니다.

클러스터를 자동 확장하는 동안 리소스가 삭제되거나 이동되면 워크로드가 일시적으로 중단될 수 있습니다. 예를 들어 워크로드가 단일 복제본으로 구성되었으면, 현재 노드가 삭제된 경우 해당 복제본의 포드를 다른 노드에서 다시 예약할 수 있습니다. AWSNodePool에서 클러스터 자동 확장 처리를 사용 설정하기 전에 워크로드가 잠재적인 중단을 견디도록 설계하거나 중요한 포드가 중단되지 않는지 확인합니다.

클러스터 자동 확장 처리 작동 방식

클러스터 자동 확장 처리는 노드당 풀 기준으로 작동합니다. 노드 풀을 만들 때는 AWSNodePool Kubernetes 리소스에서 노드 풀에 대해 최소 및 최대 크기를 지정합니다.

spec.minNodeCount를 AWSNodePool의 동일한 spec.maxNodeCount로 설정하여 클러스터 자동 확장 처리를 사용 중지할 수 있습니다.

클러스터 자동 확장 처리는 실제 리소스 사용률 대신 노드 풀의 노드에서 실행되는 포드의 리소스 요청에 따라 자동으로 노드 풀의 크기를 늘리거나 줄입니다. 주기적으로 포드 및 노드의 상태를 확인하고 작업을 수행합니다.

노드 풀에 노드가 충분하지 않아 포드를 예약할 수 없는 경우 클러스터 자동 확장 처리가 노드 풀의 최대 크기까지 노드를 추가합니다. 노드의 사용률이 적고 노드 풀에 있는 노드 수가 적은 상태에서도 모든 포드를 예약할 수 있는 경우 클러스터 자동 확장 처리는 노드를 제거하고 노드 풀의 최소 크기까지 축소합니다. 노드가 제한 시간(10분) 후에 정상적으로 유출되지 않으면 노드가 강제로 종료됩니다. 유예 기간은 구성할 수 없습니다.

포드가 너무 적은 리소스를 요청한 경우(예: 기본값이 부족한 경우) 클러스터 자동 확장 처리는 이러한 상황을 해결하지 않습니다. 모든 워크로드에 적절한 리소스 요청을 만들어서 클러스터 자동 확장 처리가 가능한 한 정확하게 작동하도록 보장할 수 있습니다.

작동 조건

클러스터 자동 확장 처리는 노드 풀 크기를 조절할 때 다음 가정을 따릅니다.

  • 복제된 모든 포드를 다른 일부 노드에서 다시 시작할 수 있으며, 결과적으로 일시적인 중단이 발생할 수 있습니다. 서비스에 중단이 허용되지 않는 경우에는 클러스터 자동 확장 처리를 사용하지 않는 것이 좋습니다.

  • 단일 노드 풀의 모든 노드에 동일한 라벨 집합이 포함됩니다.

  • 다른 인스턴스 유형의 AWSNodePool이 있는 경우, 클러스터 자동 확장 처리는 새 노드 실행에 대한 상대적 비용을 고려하고 비용이 가장 적은 노드 풀을 확장하려고 시도합니다.

  • 최초 클러스터 또는 노드 풀 생성 이후 수동으로 추가된 라벨은 추적되지 않습니다. 클러스터 자동 확장 처리로 생성되는 노드에는 노드 풀 생성 시 --node-labels로 지정된 라벨이 할당됩니다.

노드 풀 크기 조정

AWSNodePool에는 minNodeCountmaxNodeCount 필드가 포함됩니다. 이러한 필드는 풀에서 워커 노드의 최소 및 최대 개수를 선언합니다. 이러한 값은 AWSNodePool을 만들기 전이나 후에 수정할 수 있습니다.

시작하기 전에

사용자 클러스터 만들기의 안내에 따라 클러스터를 프로비저닝합니다. 클러스터를 만드는 YAML 파일(예: cluster-0.yaml)을 준비합니다.

자동 노드 풀 확장 사용 설정

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 클러스터 자동 확장 처리를 사용 설정하려면 AWSNodePool에 대해 매니페스트를 수정합니다. cluster-0.yaml 파일을 수정하고 AWSNodePool 섹션을 찾습니다. spec.minNodeCountspec.maxNodeCount의 값을 변경합니다.

    아래 예시에서는 이 노드 풀의 최소 크기를 3 노드로 유지하지만, 클러스터 자동 확장 처리가 크기를 10 노드로 늘릴 수 있도록 사용 설정합니다.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.25.5-gke.2100
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. 그런 후 노드 풀 크기 조정을 위해 YAML을 적용합니다.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. AWSNodePool 리소스가 Resizing 상태로 전환됩니다. AWSNodePool 확장이 완료되면 Provisioned 상태로 이동됩니다.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    출력에는 AWSNodePool이 Resizing으로 표시됩니다. 크기 조정 작업은 완료하는 데 몇 분 정도 걸립니다.

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.25.5-gke.2100
    

수동으로 새 AWSNodePool 만들기

또한 새 AWSNodePool을 만들어서 클러스터를 확장할 수도 있습니다. 새 AWSNodePool을 만들 때 인스턴스 크기를 확장하거나 축소할 수도 있습니다.

  1. kubectl get으로 기존 AWSNodePool의 구성 매니페스트를 검색할 수 있습니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. new_nodepool.yaml을 수정하고 다음 예시에 없는 섹션을 삭제합니다. 파일을 저장합니다.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    
  3. 새 AWSNodePool을 만들려면 매니페스트를 관리 클러스터에 적용합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

다음 단계

인그레스로 지원되는 서비스를 배포합니다.

추가 옵션을 보려면 AWSNodePool에 대한 참조 문서를 읽어보세요.