자동 노드 복구

노드 자동 복구 기능은 노드 풀에 있는 각 노드의 상태를 지속적으로 모니터링합니다. 노드가 비정상이 되면 노드 자동 복구 기능이 자동으로 노드를 복구합니다. 이 기능은 클러스터 중단 및 성능 저하 가능성을 줄이고 클러스터의 수동 유지보수 필요성을 최소화합니다.

노드 풀을 만들거나 업데이트할 때 노드 자동 복구를 사용 설정할 수 있습니다. 개별 노드가 아닌 노드 풀에서 이 기능을 사용 설정하거나 중지하세요.

비정상 노드 조건

노드 자동 복구는 각 노드의 상태를 검사하여 복구가 필요한지 결정합니다. Ready 상태를 보고하면 노드가 정상으로 간주됩니다. 그렇지 않고 특정 기간 동안 비정상 상태를 연속적으로 보고하면 복구가 시작됩니다.

비정상 상태는 NotReady 상태에서 발생할 수 있으며 약 15분 동안의 연속 검사에서 감지됩니다. 또는 부팅 디스크 공간이 고갈되어 비정상 상태가 발생할 수 있으며 약 30분 동안 식별될 수 있습니다.

kubectl get nodes 명령어를 실행하면 언제든 노드의 상태 신호를 수동으로 검사할 수 있습니다.

노드 복구 전략

노드 자동 복구는 클러스터의 전반적인 상태와 복구 프로세스 중 애플리케이션 가용성을 모두 보장하는 특정 전략을 따릅니다. 이 섹션에서는 노드 자동 복구 기능이 PodDisruptionBudget 구성을 적용하고, Pod Termination Grace Period를 준수하고, 노드를 복구할 때 클러스터 중단을 최소화하는 기타 조치를 취하는 방법을 설명합니다.

30분 동안 PodDisruptionBudget 적용

노드를 복구해야 하는 경우 즉시 드레이닝되고 다시 생성되지 않습니다. 대신 노드 자동 복구 기능이 PodDisruptionBudget(PDB) 구성을 최대 30분 동안 적용합니다. 이후 노드의 모든 포드가 삭제됩니다. (PDB 구성은 특정 시점에서 사용 가능해야 하는 특정 포드의 최소 복제본 수를 정의합니다.)

약 30분 동안 PodDisruptionBudget을 준수하여 노드 자동 복구 기능은 포드를 안전하게 다시 예약하고 클러스터의 다른 정상 노드에 재배포할 수 있는 기회를 제공합니다. 이렇게 하면 복구 프로세스 중에 원하는 수준의 애플리케이션 가용성을 유지할 수 있습니다.

30분의 제한 시간이 지나면 PodDisruptionBudget을 위반하더라도 노드 자동 복구가 복구 프로세스를 진행합니다. 시간 제한이 없다면 PodDisruptionBudget 구성이 복구에 필요한 제거를 방지하는 경우 복구 프로세스가 무기한 정지될 수 있습니다.

포드 종료 유예 기간 적용

또한 노드 자동 복구 기능에는 약 30분의 포드 종료 유예 기간이 적용됩니다. 포드 종료 유예 기간은 종료 중 단계적 종료를 위한 기간을 포드에 제공합니다. 유예 기간 동안 노드의 kubelet은 삭제 태스크를 실행하고 해당 노드의 포드와 연결된 리소스를 해제합니다. 노드 자동 복구 기능은 kubelet이 삭제를 완료하도록 최대 30분을 허용합니다. 할당된 30분이 지나면 포드가 정상적으로 종료되었는지 여부에 관계없이 노드가 강제 종료됩니다.

추가 노드 복구 전략

노드 자동 복구는 또한 다음 전략을 구현합니다.

  • 여러 노드에 복구가 필요하면 클러스터 중단을 제한하고 워크로드를 보호하기 위해 한 번에 하나씩 복구됩니다.
  • 복구 프로세스 중 노드 자동 복구를 사용 중지하더라도 진행 중인 복구는 복구 작업이 성공 또는 실패할 때까지 계속됩니다.

자동 노드 복구 사용 설정 및 사용 중지 방법

노드 풀을 만들거나 업데이트할 때 노드 자동 복구를 사용 설정 또는 사용 중지할 수 있습니다. 개별 노드가 아닌 노드 풀에서는 이 기능을 사용 설정하거나 중지합니다.

새 노드 풀에 자동 복구 사용 설정

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" \
   --enable-autorepair

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀에 대해 선택한 이름 노드 풀 이름을 가져오려면 gcloud container aws node-pools list --cluster CLUSTER_NAME --location GOOGLE_CLOUD_LOCATION 명령어를 실행합니다.
  • CLUSTER_NAME: 노드 풀을 연결할 클러스터의 이름
  • INSTANCE_TYPE: 이 노드 풀에 원하는 AWS 머신 인스턴스 유형(예: m5.large)
  • ROOT_VOLUME_SIZE: 각 노드의 루트 볼륨에 원하는 크기(Gb)
  • NODEPOOL_PROFILE: 노드 풀 VM의 IAM 인스턴스 프로필
  • NODE_VERSION: 노드 풀의 각 노드에 설치할 Kubernetes 버전(예: "1.29.4-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)입니다.

기존 노드 풀에 자동 복구 사용 설정

기존 노드 풀에서 노드 자동 복구를 사용 설정하려면 다음 명령어를 실행합니다.

gcloud container aws node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --enable-autorepair

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀의 고유한 이름입니다(예: node-pool-1).
  • CLUSTER_NAME: 클러스터 이름입니다.
  • GOOGLE_CLOUD_LOCATION: 클러스터를 관리하는 Google Cloud 리전

기존 노드 풀에 자동 복구 사용 중지

gcloud container aws node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --no-enable-autorepair

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀의 고유한 이름입니다(예: node-pool-1).
  • CLUSTER_NAME: 클러스터 이름입니다.
  • GOOGLE_CLOUD_LOCATION: 클러스터를 관리하는 Google Cloud 리전

AWS용 GKE는 단계적 노드 자동 복구 사용 중지를 수행합니다. 기존 노드 풀에 대해 노드 자동 복구를 사용 중지하면 AWS용 GKE가 노드 풀 업데이트 작업을 시작합니다. 이 작업은 기존 노드 풀 복구가 완료될 때까지 기다린 후 수행됩니다.

노드 자동 복구가 사용 설정되었는지 확인

다음 명령어를 실행하여 노드 자동 복구가 사용 설정되었는지 확인합니다.

gcloud container aws node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀의 고유한 이름입니다(예: node-pool-1).
  • CLUSTER_NAME: 클러스터 이름입니다.
  • GOOGLE_CLOUD_LOCATION: 클러스터를 관리하는 Google Cloud 리전

노드 복구 내역

다음 명령어를 실행하여 노드 풀에서 수행된 복구 내역을 볼 수 있습니다.

gcloud container aws operations list \
   --location GOOGLE_CLOUD_LOCATION \
   --filter="metadata.verb=repair AND metadata.target=projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/awsClusters/CLUSTER_NAME/awsNodePools/NODEPOOL_NAME

다음을 바꿉니다.

  • GOOGLE_CLOUD_LOCATION: 클러스터를 관리하는 지원되는 Google Cloud 리전(예: us-west1)
  • PROJECT_ID: Google Cloud 프로젝트
  • CLUSTER_NAME: 클러스터 이름입니다.
  • NODE_POOL_NAME: 노드 풀의 고유한 이름입니다(예: node-pool-1).

노드 풀 상태 요약

노드 자동 복구를 사용 설정한 후 다음 명령어를 실행하여 노드 풀 상태 요약을 생성할 수 있습니다.

gcloud container aws node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

노드 풀 상태 요약은 다음 샘플과 비슷합니다.

{
  "name": "some-np-name",
  "version": "some-version",
  "state": "RUNNING",

  ...

  "errors": [
    {
      "message": "1 node(s) is/are identified as unhealthy among 2 total node(s) in the node pool. No node is under repair."
    }
  ],
}

노드 풀 상태 요약은 노드 풀의 현재 상태를 이해하는 데 도움이 됩니다. 이 예시에서 요약에는 노드 풀의 두 노드 중 하나가 비정상임을 나타내는 오류 메시지가 포함되어 있습니다. 또한 현재 복구 프로세스가 진행 중인 노드가 없다고 보고합니다.