IoT 기기용 다중 아키텍처 컨테이너 이미지 빌드


이 튜토리얼은 Google Cloud에서 다중 아키텍처 컨테이너 이미지를 빌드하기 위해 자동화된 지속적 통합(CI) 파이프라인을 빌드하는 방법을 설명하는 시리즈의 두 번째 파트입니다.

이 튜토리얼에서는 Cloud BuildContainer Registry를 사용하여 다중 아키텍처 컨테이너 이미지를 빌드하기 위한 파이프 라인을 구현합니다. 이 튜토리얼에서는 이 시리즈의 1부에서 다중 아키텍처 컨테이너 이미지 빌드 파이프라인 구현 섹션에 설명된 다중 아키텍처 빌드 전략을 보여줍니다.

예를 들어 사물 인터넷(IoT) 기기를 유지한다고 가정해 보겠습니다. IoT 솔루션에 대한 새로운 요구사항이 나타나면 새로운 하드웨어 기기가 필요합니다. 새 기기의 하드웨어 아키텍처가 기존 아키텍처와 다른 경우 새 아키텍처를 지원하도록 빌드 파이프라인을 수정해야 합니다.

이 튜토리얼은 컨테이너 이미지를 빌드하기 위해 복잡한 파이프라인을 단순화 및 간소화하거나 이러한 파이프라인을 확장하여 다중 아키텍처 이미지를 빌드하려는 IT 전문가를 대상으로 합니다.

이 튜토리얼에서는 다음과 같은 기본적인 지식이 있다고 가정합니다.

  • Google Cloud에서 인프라를 생성하기 위한 Terraform
  • Google Cloud에서 플랫폼 작업을 수행하기 위한 Google Cloud CLI
  • 이 가이드에서 명령어를 실행하기 위한 Cloud Shell 이 튜토리얼에서 사용되는 모든 도구는 Cloud Shell에 사전 설치되어 있습니다.
  • CI 파이프라인을 설정하기 위한 Cloud Build
  • 컨테이너 관리 플랫폼인 Docker
  • 빌드 프로세스가 생성하는 컨테이너 이미지를 저장하기 위한 Container Registry

이 튜토리얼에서는 Terraform을 사용하여 컨테이너 이미지 빌드를 위한 파이프라인을 프로비저닝하고 구성하는 데 필요한 리소스를 설정합니다.

아키텍처

다음 다이어그램은 컨테이너 이미지 빌드를 위해 이 튜토리얼에서 만든 파이프라인의 워크플로를 보여줍니다.

코드 저장소, Cloud Build, Container Registry로 구성된 파이프라인

컨테이너 이미지의 소스 코드가 변경되면 Cloud Build가 트리거되어 다중 아키텍처 컨테이너 이미지를 빌드합니다. 빌드가 완료되면 다중 아키텍처 컨테이너 이미지가 Container Registry에 저장됩니다.

목표

  • Terraform을 사용하여 Google Cloud에서 컨테이너 이미지를 빌드하는 파이프라인을 프로비저닝합니다.
  • 컨테이너 이미지의 소스 코드를 수정하여 새 빌드를 트리거합니다.
  • Container Registry에 저장된 컨테이너 이미지를 검사합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

환경 준비

이 튜토리얼에서는 Cloud Shell에서 모든 명령어를 실행합니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. 샘플 코드 저장소를 클론합니다.

    cd "$HOME"
    git clone \
    https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
    
  3. 애플리케이션 기본 사용자 인증 정보를 생성합니다.

    gcloud auth application-default login --quiet
    

    출력은 다음과 비슷합니다.

    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?code_challenge=...
    Enter verification code:
    
  4. 브라우저 창에서 애플리케이션 기본 사용자 인증 정보 생성 (이전 단계)의 출력에 표시되는 URL을 엽니다.

  5. 계속하려면 허용을 선택합니다.

  6. 화면의 코드를 복사하여 Cloud Shell에 입력합니다.

    출력은 다음과 비슷합니다.

    /tmp/tmp.xxxxxxxxxx/application_default_credentials.json
    

    application_default_credentials.json 파일의 경로를 확인합니다. 다음 섹션에서 이 경로를 사용하여 환경 변수를 설정합니다.

환경 변수 설정

이 튜토리얼에 필요한 인프라를 프로비저닝하려면 먼저 다음 환경 변수를 초기화하고 내보내야 합니다.

  1. Cloud Shell에서 Terraform이 리소스를 프로비저닝하는 데 사용하는 Google Cloud 서비스 계정 이름을 저장하는 환경 변수를 만듭니다.

    export TF_SERVICE_ACCOUNT_NAME=tf-service-account
    
  2. Terraform에서 상태를 저장하는 데 사용하는 Google Cloud 프로젝트 ID를 저장하는 환경 변수를 만듭니다.

    export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
    
  3. Terraform에서 상태 파일을 저장하는 데 사용하는 Cloud Storage 버킷을 저장할 환경 변수를 만듭니다.

    export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
    
  4. 컨테이너 이미지 빌드 파이프라인의 리소스가 포함된 Google Cloud 프로젝트 ID를 저장할 환경 변수를 만듭니다.

    export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
    
  5. 이전 섹션에서 기록한 값인 기본 Google Cloud 애플리케이션 기본 사용자 인증 정보에 경로를 저장하는 환경 변수를 만듭니다.

    export GOOGLE_APPLICATION_CREDENTIALS=PATH
    

    다음을 바꿉니다.

    • PATH: application_default_credentials.json 파일의 경로

환경 프로비저닝

Terraform 원격 상태에 대한 정보를 저장하려면 Terraform 백엔드 구성, 필요한 Google Cloud 서비스 계정, Cloud Storage 버킷을 생성하는 generate-tf-backend.sh 셸 스크립트를 실행해야 합니다.

  • Cloud Shell에서 빌드 환경을 프로비저닝합니다.

    cd $HOME/solutions-build-multi-architecture-images-tutorial/
    
    ./generate-tf-backend.sh
    

    스크립트는 멱등성을 갖고 여러 번 안전하게 실행됩니다.

    스크립트를 처음 실행한 후에는 출력이 다음과 비슷합니다.

    Generating the descriptor to hold backend data in terraform/backend.tf
    terraform {
       backend "gcs" {
           bucket  = "tf-state-bucket-project-id"
           prefix  = "terraform/state"
       }
    }
    

빌드 파이프라인 만들기

Terraform 템플릿 파일 terraform/main.tf는 이 튜토리얼용으로 생성된 리소스를 정의합니다. 해당 설명자와 함께 Terraform을 실행하여 다음 Google Cloud 리소스를 만듭니다.

  • 컨테이너 이미지 설명자Cloud Build 빌드 구성 파일을 저장할 Cloud Source Repositories 코드 저장소
  • Cloud Build가 각 소스 코드 변경사항에 메시지를 게시하는 Pub/Sub 주제
  • 다중 아키텍처 컨테이너 이미지를 빌드하는 Cloud Build 빌드
  • 컨테이너 이미지를 저장할 Container Registry 저장소

Cloud Shell에서 다음을 수행합니다.

  1. Terraform 작업 디렉터리를 초기화하려면 terraform init 명령어를 실행합니다.

    cd terraform
    terraform init
    
  2. (선택사항) Terraform이 적용할 변경사항을 검토하려면 terraform plan 명령어를 실행합니다.

    terraform plan
    

    출력은 Terraform이 Google Cloud 환경에서 리소스를 프로비저닝하기 위해 수행해야 하는 모든 작업의 목록입니다. 모든 작업의 요약은 다음과 비슷합니다.

    Plan: 8 to add, 0 to change, 0 to destroy.
    

    총 추가 작업 수는 8개이며 변경사항 및 삭제는 없습니다.

  3. terraform apply 명령어를 실행하여 Google Cloud 프로젝트에서 리소스를 만듭니다.

    terraform apply
    
  4. 명령어를 계속 실행하려면 yes을 입력합니다.

Cloud Source Repositories로 소스 파일 푸시

빌드 파이프라인이 빌드를 실행하려면 Dockerfile 및 Cloud Build 구성 파일을 Cloud Source Repositories 소스 코드 저장소에 저장해야 합니다.

  1. Cloud Shell에서 소스 저장소를 클론합니다.

    cd $HOME
    gcloud source repos clone cross-build
    
  2. Dockerfile 및 Cloud Build 구성 파일을 소스 코드 저장소에 복사합니다.

    cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
    
  3. 소스 코드 저장소에 파일을 커밋하고 푸시합니다.

    cd "$HOME"/cross-build
    git add .
    git commit -m "Initial commit"
    git push
    

결과 검사

Cloud Build 작업이 실행 중이고 완료된 후에는 Cloud Build 빌드 기록 페이지에서 각 빌드 단계의 실행을 검사할 수 있습니다.

Cloud Build 빌드 기록 페이지의 빌드 목록

Cloud Build 빌드

다음 그림과 같이 빌드 기록 페이지에서 빌드 단계의 개요와 각 단계를 실행하는 데 소요된 시간을 확인할 수 있습니다.

Cloud Build 기록의 빌드 단계

빌드 단계를 열면 해당 단계의 출력이 표시됩니다. 예를 들어 앞의 다이어그램에서 buildx check 단계의 빌드 세부정보는 플랫폼이 지원하는 다양한 타겟 플랫폼 아키텍처를 보여줍니다.

12 Name:      mybuilder0
13 Endpoint:  unix:///var/run/docker.sock
14 Status:    running
15 Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

네 번째 단계의 빌드 세부정보에는 각 타겟 아키텍처의 빌드 출력이 표시됩니다.

#8 0.268 I am running on linux/amd64, building for linux/amd64
#12 0.628 I am running on linux/amd64, building for linux/arm/v7
#10 0.279 I am running on linux/amd64, building for linux/arm/v6
#14 0.252 I am running on linux/amd64, building for linux/arm64

Container Registry의 이미지 매니페스트

빌드가 완료되면 다음 그림과 같이 Cloud 콘솔의 Container Registry 이미지 페이지에서 이미지 매니페스트를 검사할 수 있습니다.

Container Registry 이미지 페이지의 이미지 매니페스트

저장소 목록에서 테스트 저장소를 열면 다음 그림과 같이 테스트 저장소에 속한 모든 컨테이너 이미지 버전이 표시됩니다.

이미지 버전 목록입니다.

최신 태그가 지정된 이미지를 열어 다음 그림과 같이 다이제스트 세부정보 페이지를 열 수 있습니다.

이미지 다이제스트 세부정보

다이제스트 세부정보 페이지에서 매니페스트 섹션을 펼치고 다음 예시와 같이 빌드에서 만든 모든 대상 아키텍처가 파일에 표시되어 있는지 확인할 수 있습니다.

{
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "schemaVersion": 2,
  "manifests": [
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:839024acb1038509e3bc66f3744857840951d0d512be54fd6670ea1e8babdcb6",
        "size": 735,
        "platform": {
           "architecture": "amd64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:33489767c29efb805e446a61d91cc55e042d3cfadcd186d9a1c8698f2f12309d",
        "size": 735,
        "platform": {
           "architecture": "arm64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:f1958815778ca8c83d324bad3fc68a9e3e9d5ea48b5bb27a8aca7d8da20cf8d4",
        "size": 735,
        "platform": {
           "architecture": "arm",
           "os": "linux",
           "variant": "v7"
        }
     }
  ]
}

Cloud Shell에서 직접 이미지 매니페스트를 볼 수도 있습니다.

  • Cloud Shell에서 이미지 매니페스트를 표시합니다.

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/"${DEVSHELL_PROJECT_ID}"/test:latest
    

    출력은 다이제스트 세부정보 페이지에서 펼칠 수 있는 매니페스트 파일과 동일합니다.

빌드 파이프라인에서 지속적 배포 구성

새 하드웨어 아키텍처의 컨테이너 이미지를 빌드하려면 새 대상 아키텍처를 추가하여 빌드 구성 파일을 수정합니다. Cloud Source Repositories의 소스 저장소에 변경사항을 커밋하고 푸시하면 Cloud Build가 새 빌드를 시작합니다. 빌드는 새로 추가된 하드웨어 아키텍처에 대한 지원을 포함하여 새 버전의 다중 아키텍처 컨테이너 이미지를 생성합니다.

  1. Cloud Shell에서 빌드 구성 파일에 새 대상 플랫폼을 추가합니다.

    cd "$HOME"/cross-build
    sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
    
  2. 변경사항을 소스 코드 저장소에 커밋하고 푸시합니다.

    git add .
    git commit -m "add a new target platform"
    git push
    
  3. 최신 매니페스트를 확인하여 새 대상 플랫폼이 최신 컨테이너 이미지의 일부인지 확인합니다.

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
    
  4. 새로 추가된 대상 플랫폼이 다음 출력과 비슷한 매니페스트 파일에 있는지 확인합니다.

    {
      "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
      "schemaVersion": 2,
      "manifests": [
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:bc80d063fccb4c370df9b505cbf4f8a814a366d99644de09ebee98af2ef0ff63",
            "size": 735,
            "platform": {
               "architecture": "amd64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:be10e4f01f529149815ebad7eb09edaa84ebef5b7d70d51f7d1acb5ceb1f61cd",
            "size": 735,
            "platform": {
               "architecture": "arm64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:f6ba5d5d3bc1ea0177e669517ea15a0d4fb97c06c7eca338afa43734d87af779",
            "size": 735,
            "platform": {
               "architecture": "arm",
               "os": "linux",
               "variant": "v7"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:a3c34621cca10974026f8ad0782af78539cd7bb0ebfa0082a27b2c3ed4418ca0",
            "size": 735,
            "platform": {
               "architecture": "386",
               "os": "linux"
            }
         }
      ]
    }
    

삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 Google Cloud 프로젝트를 삭제하는 것입니다. 또는 개별 리소스를 삭제할 수 있습니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

이 튜토리얼에서 사용한 프로젝트를 유지하려는 경우 다음 단계를 수행하여 이 튜토리얼에서 만든 리소스를 삭제합니다.

  1. Cloud Shell에서 컨테이너 이미지를 삭제합니다.

    gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
    
  2. Terraform을 사용하여 프로비저닝한 리소스를 삭제합니다.

    cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform
    terraform destroy
    
  3. yes를 입력하여 삭제를 확인합니다.

다음 단계