이 페이지에서는 GKE Standard 클러스터의 ARM 노드에서 예약되도록 워크로드를 준비하는 방법을 설명합니다. Autopilot으로 ARM 워크로드를 예약하는 방법에 대한 자세한 내용은 ARM 아키텍처에 Autopilot 워크로드 배포를 참조하세요.
워크로드를 ARM 노드에 성공적으로 예약하려면 다음 항목을 확보해야 합니다.
- ARM 호환 컨테이너 이미지. 이를 확인하는 방법은 워크로드를 ARM에서 사용할 준비가 되었나요?를 참조하세요.
- ARM 호환 워크로드를 예약할 수 있는 ARM 노드: 필요한 리소스를 만들려면 ARM 노드를 사용하여 클러스터 및 노드 풀 만들기를 참조하세요.
- 사용 가능한 Arm 가상 머신(VM)이 있는 Google Cloud 리전 또는 영역의 클러스터입니다. 필터링 가능한 머신 유형 및 플랫폼 표는 사용 가능한 리전 및 영역을 참조하세요.
개요
AMD 이 taint는 x86 호환 워크로드가 실수로 ARM 노드에 예약되지 않도록 방지합니다. 해당 톨러레이션(toleration)이 없어도 x86 호환 워크로드를 ARM 노드에 예약하려면 이 기본 taint를 선택적으로 삭제할 수 있습니다. 자세한 내용은 기본 ARM 아키텍처 taint 구성을 참조하세요.
기본 taint가 있는 ARM 노드에 워크로드를 배포하려면 이 문서에 설명된 필드를 사용하여 스케줄러가 요청된 노드 유형으로 워크로드를 보내도록 안내합니다.
다음 필드 중 하나를 사용합니다.
노드 선택기 또는 노드 어피니티 규칙을 사용하는 경우 워크로드의 컨테이너 이미지를 노드 아키텍처에서 실행할 수 있도록 선언한 경우에만 GKE에서 ARM 호환 워크로드를 예약합니다.
다음 섹션에 설명된 대로 노드 선택기를 사용하거나 노드 어피니티 규칙을 사용하여 Arm 호환 워크로드를 예약할 경우 포드가 Arm 노드에서 실행될 수 있도록 GKE가 워크로드 구성에 톨러레이션(toleration) 을 자동으로 추가합니다.
워크로드에 추가된 이러한 톨러레이션(toleration)은 Arm 노드에서 워크로드를 예약할 수 있도록 기본적으로 모든 Arm 노드에 추가된 taint(kubernetes.io/arch=arm64:NoSchedule)와 일치합니다.
일부 상황에서는 모든 노드에서 실행될 수 있는 멀티 아키텍처 이미지가 있는 경우와 같이 이 톨러레이션(toleration)을 워크로드 구성에 수동으로 추가해야 할 수 있습니다. 자세한 내용은 톨러레이션(toleration)을 사용해 멀티 아키텍처 워크로드를 모든 아키텍처에 예약을 참조하세요.
노드 선택기를 사용한 ARM 워크로드 예약
사양에 다음 노드 선택기를 추가합니다.
nodeSelector:
kubernetes.io/arch: arm64
노드 선택기에서 GKE 클러스터의 모든 ARM 노드에 있는 arm64 라벨이 있는 노드에만 이 워크로드를 예약하도록 지정합니다.
이 노드 선택기가 워크로드 구성에 포함된 경우 Arm 노드에서 워크로드를 예약할 수 있게 taint와 일치하도록 GKE가 톨러레이션(toleration)을 추가합니다.
노드 어피니티 규칙을 사용한 ARM 워크로드 예약
노드 어피니티를 사용해도 워크로드를 예약할 수 있습니다.
단일 아키텍처에 워크로드 예약
사양에 다음 노드 어피니티를 추가합니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
노드 어피니티 규칙에서 GKE 클러스터의 모든 ARM 노드에 있는 arm64 라벨이 있는 노드에만 워크로드가 예약되도록 지정합니다.
이 어피니티 규칙이 워크로드 구성에 포함되었으면 Arm 노드에서 워크로드를 예약할 수 있게 taint와 일치하도록 GKE가 톨러레이션(toleration)을 추가합니다.
x86 및 Arm 아키텍처로 워크로드 예약
x86 (Intel 및 AMD 프로세서) 및 Arm 아키텍처 모두 워크로드를 예약하고 Arm 노드 풀에서 기본 taint 동작을 사용하는 경우 이를 다른 방식으로 지정할 수 있습니다. 다음 안내에서는 Arm 노드 풀에서 기본 taint를 사용한다고 가정합니다.
톨러레이션(toleration)을 사용해 멀티 아키텍처 워크로드를 모든 아키텍처에 예약
표준 클러스터에서 사용 가능한 아키텍처 유형에 멀티 아키텍처 이미지를 예약하려는 경우 워크로드 사양에 톨러레이션(toleration)만 추가하면 됩니다. 모든 아키텍처 유형으로 워크로드를 예약할 수 있으므로 이 페이지에 설명된 노드 선택기 또는 노드 어피니티 규칙이 필요하지 않습니다.
톨러레이션(toleration)을 추가합니다.
tolerations:
- key: kubernetes.io/arch
operator: Equal
value: arm64
effect: NoSchedule
이 톨러레이션(toleration)을 사용하면 GKE에서 모든 아키텍처 유형의 노드에 워크로드를 예약할 수 있습니다.
예를 들어 다음 노드 풀이 있는 클러스터의 경우 다음과 같습니다.
- my-c4a-node-pool, c4a-standard-16 VM 사용(
arm64) - my-c2-node-pool, c2-standard-8 VM 사용(
amd64) - my-t2d-node-pool, t2-standard-48 VM 사용(
amd64)
이 클러스터에 멀티 아키텍처 이미지 및 워크로드 구성의 arm64 톨러레이션(toleration)을 사용하는 워크로드를 배포할 경우 GKE가 모든 노드 풀에서 워크로드를 예약할 수 있습니다.
모든 아키텍처에 대해 멀티 아키텍처 워크로드를 예약하기 위해 노드 어피니티 규칙 사용
x86 및 Arm을 포함하여 아키텍처 유형 간 노드에 워크로드를 예약하려는 경우 노드 어피니티 규칙을 사용할 수도 있습니다.e. 노드 어피니티 규칙을 사용하면 워크로드를 예약할 아키텍처 유형을 정확히 지정할 수 있습니다. 이 방법은 Autopilot 클러스터에 워크로드를 예약하는 데 권장됩니다. 자세한 내용은 Arm 아키텍처에 Autopilot 워크로드 배포를 참조하세요.
x86 기반 워크로드의 경우 워크로드를 예약하기 위해 이러한 노드 선택기, 노드 어피니티 규칙, 톨러레이션(toleration)이 필요하지 않습니다. 이미지를 x86 기반 노드에만 예약할 때는 이러한 필드를 사용할 필요가 없습니다.
아키텍처 유형에 워크로드를 예약하려면 노드 어피니티 필드의 values 섹션에 arm64 및 amd64를 모두 나열합니다. amd64에는 x86 프로세서를 사용하는 모든 노드가 포함됩니다.
다음 예시는 Arm 프로세서 또는 x86 프로세서를 사용하는 노드에 이 워크로드를 예약할 수 있도록 지정합니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
- amd64
각 아키텍처 유형의 라벨은 다음과 같습니다.
arm64: Arm 프로세서를 사용하는 노드(예: C4A)amd64: AMD 프로세서를 사용하는 노드(예: Tau T2D) 또는 Intel 프로세서를 사용하는 노드(예: C2)
예를 들어 다음 노드 풀과 지정된 노드 어피니티 규칙이 있는 클러스터의 경우 다음과 같습니다.
- my-c4a-node-pool, c4a-standard-16 VM 사용(
arm64) - my-c2-node-pool, c2-standard-8 VM 사용(
amd64) - my-t2d-node-pool, t2-standard-48 VM 사용(
amd64)
`values` 목록에 `arm64`가 포함된 노드 어피니티 및 멀티 아키텍처 이미지를 사용하는 워크로드를 이 클러스터에 배포할 경우 GKE
워크로드 구성에 톨러레이션(toleration)을 추가하고 모든 노드 풀에서 워크로드를 예약할 수 있습니다.
기본 ARM 아키텍처 taint 구성
기본적으로 GKE는 모든 Arm 노드를 kubernetes.io/arch=arm64:NoSchedule taint로 taint합니다. 이 taint는 Arm 아키텍처가 아닌 x86 아키텍처와만 호환되는 워크로드가 Arm 노드에 예약되지 않도록 방지합니다. x86 및 Arm과 모두 호환되는 워크로드가 있는 경우 이 taint를 사용 중지하여 GKE가 taint에 해당하는 톨러레이션(toleration) 없이 Arm 노드에서 이러한 워크로드를 예약하도록 할 수 있습니다.
컨트롤 플레인이 버전 1.35.0-gke.2141000 이상을 실행하는 GKE 클러스터의 표준 노드 풀 또는 커스텀 ComputeClass용으로 생성된 노드에서만 기본 동작을 업데이트할 수 있습니다. 자세한 내용은 기본 ARM 아키텍처 taint 구성을 참조하세요. taint 동작을 업데이트해도 Autopilot으로 Arm 워크로드를 배포하는 데는 적용되지 않습니다. 자세한 내용은 Autopilot 워크로드를 Arm 아키텍처에 배포를 참조하세요.
표준 노드 풀을 사용하여 다음 상황에서 이 동작을 구성할 수 있습니다.
- 클러스터 생성 중 기본 표준 노드 풀의 경우
- 표준 노드 풀을 만들거나 업데이트할 때
클러스터에서 Arm과 호환되지 않는 워크로드가 실행 중인 경우 기본 taint를 삭제하지 마세요. 호환되지 않는 워크로드가 taint되지 않은 Arm 노드에 예약될 수 있기 때문입니다.
Arm 노드의 기본 노드 taint를 구성하려면 다음 옵션 중 하나를 선택합니다.
gcloud CLI
gcloud CLI로 taint 동작을 설정하려면 다음 작업 중 하나를 수행할 때 --node-architecture-taint-behavior 플래그를 사용합니다.
`
gcloud container cluster create` 명령어를 사용하여 기본 노드 풀의 특정 taint 동작으로 표준 클러스터를 만듭니다.gcloud container cluster create CLUSTER_NAME --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIORgcloud container node-pools create명령어를 사용하여 표준 노드 풀을 만듭니다.gcloud container node-pools create POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIORgcloud container node-pools update명령어를 사용하여 표준 노드 풀을 업데이트합니다.gcloud container node-pools update POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-architecture-taint-behavior=BEHAVIOR
이러한 명령어의 경우 다음을 바꿉니다.
CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 Compute Engine 위치. 리전 클러스터의 경우 리전 또는 영역 클러스터의 경우 영역을 제공합니다.POOL_NAME: 노드 풀의 이름입니다.BEHAVIOR: 다음 설정 중 하나입니다.none: GKE는kubernetes.io/arch=arm64:NoSchedule의 기본 taint를 생략합니다.arm: Arm 노드 풀의 모든 노드에kubernetes.io/arch=arm64:NoScheduletaint를 추가하는 기본 동작을 명시적으로 설정합니다.
표준 노드 풀의 노드 아키텍처 taint 동작을 수정하면 GKE는 노드를 다시 만들 필요 없이 taint를 즉시 업데이트합니다.
Terraform
node_config에서 다음 taint_config 블록을 추가하여 아키텍처 taint 동작을 구성합니다.
taint_config {
architecture_taint_behavior = "BEHAVIOR"
}
BEHAVIOR를 다음 설정 중 하나로 바꿉니다.
NONE: GKE는kubernetes.io/arch=arm64:NoSchedule의 기본 taint를 생략합니다.ARM: Arm 노드 풀의 모든 노드에kubernetes.io/arch=arm64:NoScheduletaint를 추가하는 기본 동작을 명시적으로 설정합니다.
이 블록을 포함하는 표준 노드 풀의 전체 node_config는 다음과 같습니다.
resource "google_container_node_pool" "primary_preemptible_nodes" {
name = "NODE_POOL_NAME"
location = "NODE_POOL_LOCATION"
cluster = google_container_cluster.primary.name
node_count = 1
node_config {
preemptible = true
machine_type = "ARM_MACHINE_TYPE"
# Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
service_account = google_service_account.default.email
oauth_scopes = [
"https://www.googleapis.com/auth/cloud-platform"
]
taint_config {
architecture_taint_behavior = "BEHAVIOR"
}
}
}
이 예시에서 NODE_POOL_NAME은 노드 풀의 이름을 나타내고 NODE_POOL_LOCATION은 클러스터 컨트롤 플레인의 위치를 나타냅니다.
워크로드 배포
이제 ARM 호환 워크로드를 예약할 위치를 지정했으므로 워크로드를 배포할 수 있습니다.
GKE 클러스터에 워크로드를 배포할 때의 지침은 아키텍처 유형 간에 동일합니다. 사전에 필요한 단계를 완료하는 한 다른 워크로드를 배포할 때와 같이 Arm 호환 워크로드를 배포할 수 있습니다. 워크로드 배포 예시를 보려면 다음 페이지를 참조하세요.
문제 해결
일반적인 오류 및 문제 해결 정보는 ARM 워크로드 문제 해결을 참조하세요.