AWS Graviton 프로세서는 컨테이너 기반 워크로드에 이상적입니다.
컨테이너 호스트로서 Graviton 기반 인스턴스의 이점을 활용하는 첫 번째 단계는 모든 소프트웨어 그리고 종속성이 arm64 아키텍처를 지원하도록 하는 것입니다. x86_64 호스트를 위해 작성된 이미지는 arm64 호스트에서 실행할 수 없고 그 반대도 마찬가지입니다.
대부분의 컨테이너 에코시스템은 두 아키텍처를 모두 지원하며, 호스트 아키텍처에 맞는 올바른 이미지가 자동으로 배포되는 멀티 아키텍처 이미지를 통해 투명하게 지원하는 경우가 많습니다.
Dockerhub, Quay, 그리고 Amazon Elastic Container Registry (ECR) 등의 대부분 컨테이너 이미지 레포지토리들은 모두 멀티 아키텍처 이미지를 지원합니다.
대부분의 이미지는 이미 멀티 아키텍처(즉, arm64 및 x86_64/amd64)를 지원하지만, 필요한 경우 개발자가 멀티 아키텍처 이미지를 직접 만들 수 있는 몇 가지 방법을 설명하겠습니다.
- Docker Buildx
- Amazon CodePipeline과 같은 CI/CD 빌드 파이프라인을 사용하여 네이티브 빌드 및 매니페스트 생성을 관리합니다.
대부분의 컨테이너 오케스트레이션 플랫폼은 arm64 및 x86_64 호스트를 모두 지원합니다.
Amazon Elastic Container Service(ECS) 및 Amazon Elastic Kubernetes Service(EKS)는 모두 Graviton-powered 인스턴스를 지원합니다.
arm64를 명시적으로 지원하는 컨테이너 생태계 내에서 인기 있는 소프트웨어 목록을 아래에 작성하였습니다:
소프트웨어가 위에 나열되지 않았다고 해서 작동하지 않는 것은 아닙니다!
많은 제품들이 arm64에서 작동하지만 arm64 바이너리를 (아직) 명시적으로 배포하거나 멀티 아키텍처 이미지를 빌드하지는 않습니다. AWS, Arm 및 커뮤니티의 많은 개발자들은 완전한 바이너리와 멀티 아키텍처 지원을 가능하게 하기 위해 메인테이너와 협력하고 전문 지식과 코드를 제공하고 있습니다.
쿠버네티스 (및 EKS)는 arm64를 지원하므로 Graviton 인스턴스를 지원합니다. 컨테이너형 워크로드가 모두 arm64를 지원하는 경우 Graviton 노드를 사용하여 클러스터를 단독으로 실행할 수 있습니다. 그러나 amd64(x86) 인스턴스에서만 실행할 수 있는 워크로드가 있거나 동일한 클러스터에서 amd64(x86) 및 arm64 노드를 모두 실행하려는 경우 다음과 같은 몇 가지 방법을 사용할 수 있습니다:
클러스터의 모든 컨테이너에 대해 멀티 아키텍처 이미지(위 참조)를 사용할 수 있는 경우 추가 작업 없이 amd64 및 arm64 노드의 혼합을 실행할 수 있습니다. 멀티아키텍처 이미지 매니페스트는 지정된 노드의 아키텍처에 대해 올바른 이미지 레이어를 Pull 할 수 있도록 합니다.
kubernetes.io/arch
레이블에 따라 노드에 파드를 스케줄링할 수 있습니다. 이 레이블은 쿠버네티스에 의해 노드에 자동으로 추가되며, 다음과 같은 [노드 셀렉터](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodes selector)를 사용하여 포드을 적절하게 스케줄링할 수 있습니다:
nodeSelector:
kubernetes.io/arch: amd64
테인트(Taints)는 특히 amd64 전용(x86 전용) 컨테이너가 대부분인 기존 클러스터에 Graviton 노드를 추가할 때 유용합니다. 빌트인 kubernetes.io/arch
레이블을 사용하려면 노드 셀렉터를 사용하여 올바른 인스턴스에 arm64 전용 컨테이너를 배치해야 하지만 Graviton 인스턴스를 테인트를 추가하면 기존 구성을 변경할 필요 없이 호환되지 않는 컨테이너는 예약이 안되도록 만들 수 있습니다. 예를 들어 eksctl을 사용하여 관리 노드 그룹에서 이 작업을 수행하려면 --kubelet-extra-args '--register-with-taints=arm=true:NoSchedule'
을 kubelet 시작 인수에 문서와 같이 추가하면 됩니다. arm64 인스턴스만 테인트를 추가하고 노드 셀렉터를 지정하지 않으면 Graviton 인스턴스에 대해 빌드하는 이미지가 x86 인스턴스 유형에서도 실행할 수 있는 멀티 아키텍처 이미지인지 확인해야 합니다. 또는 arm64 전용 이미지를 빌드하고 노드 셀렉터를 사용하여 arm64 노드에만 스케줄링 되도록 할 수 있습니다.
x86 기반 및 Graviton 인스턴스 유형을 모두 가진 클러스터에서 쿠버네티스 Cluster Autoscaler를 사용하는 경우 문서에 따라 각 오토 스케일링 그룹에 k8s.io/cluster-autoscaler/node-template/label/*
또는 k8s.io/cluster-autoscaler/node-template/taint/*
태그를 지정해서 오토 스케일러가 어떤 ASG에 어떤 포드를 배치할 수 있는지 알 수 있게 해야합니다. (이것은 실제로 노드에 레이블이나 테인트를 적용하지 않고 클러스터 오토 스케일러에 스케줄링 힌트를 제공하는 역할만 합니다.)