ARM 워크로드를 위한 멀티 아키텍처 이미지 빌드


이 페이지에서는 멀티 아키텍처 이미지에 대해 소개하고 노드와 컨테이너 이미지의 아키텍처가 중요한 이유와 멀티 아키텍처 이미지를 사용하면 GKE 클러스터에 워크로드를 쉽게 배포할 수 있는 이유를 설명합니다. 또한 이 페이지에서는 ARM에서 워크로드를 실행할 준비가 되었는지 확인하고 멀티 아키텍처 이미지를 빌드하는 방법에 대한 안내도 제공합니다.

멀티 아키텍처 이미지를 사용하여 아키텍처에 배포하는 방법에 대한 튜토리얼은 Am을 사용하여 GKE의 x86 애플리케이션을 멀티 아키텍처로 마이그레이션을 참조하세요.

멀티 아키텍처 이미지란 무엇인가요?

멀티 아키텍처 이미지는 아키텍처 여러 개를 지원할 수 있는 이미지입니다. 단일 태그가 있는 단일 이미지처럼 보이지만 매니페스트 목록으로 구성된 아키텍처 여러 개를 타겟팅하는 이미지 목록입니다. 멀티 아키텍처 이미지는 Docker 이미지 매니페스트 V2 스킴 2 또는 OCI 이미지 색인 사양과 호환됩니다. 클러스터에 멀티 아키텍처 이미지를 배포할 때 GKE는 배포 중인 노드 아키텍처와 호환되는 올바른 이미지를 자동으로 선택합니다. 워크로드의 멀티 아키텍처 이미지가 있으면 여러 아키텍처 전반에서 이 워크로드를 원활하게 배포할 수 있습니다.

멀티 아키텍처 이미지는 아키텍처에서 같은 워크로드를 사용하려는 경우에 매우 유용합니다. 또는 모든 유형의 GKE 노드를 사용하는 단일 아키텍처에서 컨테이너 이미지를 사용할 수 있습니다. 아키텍처 하나에서만 워크로드를 사용하고 있고 호환되는 이미지가 이미 있으면 멀티 아키텍처 이미지를 빌드할 필요가 없습니다.

ARM과 호환되는 단일 아키텍처 이미지나 멀티 아키텍처 이미지를 사용하고 있고 ARM 노드에 배포하려면 안내에 따라 GKE에서 예상대로 워크로드를 예약할 수 있도록 필수 필드를 포함시켜야 합니다. 자세한 내용은 배포를 위한 ARM 워크로드 준비를 참조하세요. 워크로드가 x86 기반 노드로만 예약되려는 경우 워크로드를 예약하는 데 이러한 필드를 추가할 필요가 없습니다.

GKE 노드 아키텍처가 워크로드에 중요한 이유는 무엇인가요?

GKE 노드는 대신 GKE에서 만들고 관리하는 개별 Compute Engine VM 인스턴스입니다. 각 노드는 x86(Intel 또는 AMD) 또는 ARM 프로세서를 사용하는 표준 머신 유형(예: t2a-standard-1)입니다. 자세한 내용은 CPU 플랫폼을 참조하세요.

워크로드를 실행하려는 노드의 아키텍처와 호환되는 컨테이너 이미지를 사용해야 합니다. 예를 들어 arm64 아키텍처를 사용하여 컨테이너 이미지를 실행하려는 경우 Tau T2A 머신 시리즈t2a-standard-1과 같은 ARM 워크로드를 지원하는 머신 유형이어야 합니다. GKE 클러스터 하나에서 여러 아키텍처 유형으로 노드를 사용할 수 있습니다. 여러 아키텍처 유형에서 워크로드 하나를 사용하려면 아키텍처별 이미지의 모든 컨테이너 이미지와 배포 파일을 구성해야 합니다. 멀티 아키텍처 이미지를 사용하면 아키텍처 유형에서 배포 프로세스를 간소화할 수 있습니다.

x86 및 ARM 노드에 배포할 멀티 아키텍처 이미지 빌드

다음 안내는 아래의 항목을 이미 확보한 앱 개발자를 대상으로 합니다.

  • 다운로드한 컨테이너 도구(예: Docker)를 갖춘 빌드 환경
  • 기존 컨테이너 이미지

다음 명령어는 Docker를 사용하지만 다른 컨테이너 도구를 사용해 동일한 태스크를 수행할 수도 있습니다.

워크로드를 ARM에서 사용할 준비가 되었나요?

기존 컨테이너 이미지가 있는 경우 이 워크로드를 ARM 노드에서 실행할 준비가 되었는지 확인할 수 있습니다. 다음 섹션에서는 docker run을 사용해 ARM 아키텍처에서 컨테이너를 실행하여 이를 확인하는 방법을 설명합니다.

컨테이너 이미지 확인을 위한 x86 환경의 Docker 준비

x86 환경에서 Docker를 실행하는 경우 arm64 컨테이너 이미지를 실행하려면 추가 패키지를 다운로드해야 합니다. 이 안내에서는 패키지 관리에 apt를 사용하지만 환경의 패키지 관리자를 사용하여 필요한 패키지를 다운로드할 수 있습니다.

ARM 환경에서 Docker를 실행하는 경우 이 섹션을 건너뛸 수 있습니다.

다음 명령어는 패키지를 다운로드하고 머신에서 지원하지 않는 아키텍처의 binfmt 인터프리터로 QEMU를 등록합니다.

sudo apt-get install qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

binfmt 인터프리터를 설정한 후 x86 환경에서 arm64 이미지를 실행할 수 있습니다.

워크로드의 ARM 준비 상태 확인

ARM 환경에서 Docker를 실행 중이거나 ARM 이미지를 실행하기 위한 x86 환경을 준비한 경우 다음 명령어를 실행합니다.

docker run --platform linux/arm64 IMAGE_NAME

IMAGE_NAME을 컨테이너 이미지 이름으로 바꿉니다.

다음 출력은 컨테이너 이미지가 GKE 클러스터를 사용하는 ARM 노드에서 실행될 준비가 되었음을 나타냅니다.

Hello from Docker!
This message shows that your installation appears to be working correctly.

워크로드를 ARM에서 실행할 준비가 되면 배포를 위한 ARM 워크로드 준비를 진행할 수 있습니다.

다음 출력은 ARM에서 이미지를 실행할 준비가 되지 않았음을 나타냅니다.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest
standard_init_linux.go:219: exec user process caused: exec format error

이 출력은 x86_64 또는 amd64 이미지임을 나타내며 arm64 이미지를 빌드해야 합니다. 다음 멀티 아키텍처 이미지 빌드 섹션으로 이동합니다. 여기에서 ARM과 호환되지 않는 컨테이너 이미지, Dockerfile을 사용하고 아키텍처 유형 전반에서 실행할 수 있는 멀티 아키텍처 이미지를 빌드합니다.

멀티 아키텍처 이미지 빌드

Dockerfile이 있는 경우 Dockerfile을 사용하여 다양한 아키텍처 유형의 노드에 배포할 수 있는 ARM 호환 및 x86 호환 멀티 아키텍처 이미지를 빌드할 수 있습니다.

다음 단계를 완료하려면 Docker Buildx를 다운로드해야 합니다. 기존 Dockerfile도 있어야 합니다.

x86 VM 및 ARM VM이 있는 경우 환경 준비

다음 명령어는 빌드 환경에 ARM 빌드 VM과 x86 빌드 VM이 모두 있고 x86 VM을 ARM VM에 루트로 SSH를 통해 연결할 수 있다고 가정합니다. 빌드 환경에 x86 VM만 있으면 다음 x86 VM만 있는 경우 환경 준비 섹션의 안내를 따르세요.

멀티 아키텍처 이미지를 빌드할 수 있도록 환경을 준비합니다.

  1. 로컬 소켓을 사용하여 x86 노드의 컨텍스트를 만들고 SSH를 사용하여 ARM 노드의 컨텍스트를 만듭니다.

     docker context create amd_node --docker "host=unix:///var/run/docker.sock"
     docker context create arm_node --docker "host=ssh://root@NODE_IP"
    

    NODE_IP를 ARM 노드의 IP 주소로 바꿉니다.

  2. x86 노드를 사용하여 빌더를 만듭니다.

    docker buildx create --use --name BUILDER_NAME --platform linux/amd64 amd_node
    docker buildx create --append --name BUILDER_NAME --platform linux/arm64 arm_node
    

    BUILDER_NAME을 Buildx 빌더에 선택한 이름으로 바꿉니다.

x86 VM만 있는 경우 환경 준비

빌드 환경에 x86 VM만 있으면 다음 단계를 수행하여 멀티 아키텍처 이미지를 빌드할 수 있도록 환경을 준비할 수 있습니다. 이 옵션을 사용하면 빌드 단계에 시간이 오래 걸릴 수 있습니다.

  1. QEMU 패키지를 설치합니다.

    docker run --rm --privileged multiarch/qemu-user-static
    
  2. 멀티 아키텍처 빌더를 만듭니다(기본 빌더는 멀티 아키텍처를 지원하지 않음).

    docker buildx create --name BUILDER_NAME --use
    

    BUILDER_NAME을 Buildx 빌더에 선택한 이름으로 바꿉니다.

이미지 빌드

환경이 준비되었으므로 다음 명령어를 실행하여 멀티 아키텍처 이미지를 빌드합니다.

docker buildx build . -t PATH_TO_REGISTRY  --platform linux/amd64,linux/arm64 --push

PATH_TO_REGISTRY를 컨테이너 이미지 이름 및 태그(예: gcr.io/myproject/myimage:latest)로 끝나는 레지스트리 경로로 바꿉니다.

이 단계에서 오류 메시지가 표시되면 Docker 가이드 및 관련 문서를 참조하여 문제를 해결합니다.

멀티 아키텍처 이미지를 빌드하면 워크로드를 ARM에서 실행할 수 있습니다. 배포를 위한 ARM 워크로드 준비를 진행합니다.

다음 단계