Windows Server 멀티 아키텍처 이미지 빌드


이 튜토리얼에서는 여러 Windows Server 버전을 대상으로 하는 이미지 빌드의 버전 관리 복잡성을 관리하는 방법을 보여줍니다. Windows Server 컨테이너에는 컨테이너가 Windows Server 호스트 버전 두 개 이상에서 실행되지 못하도록 하는 버전 호환성 요구사항이 있습니다. 하지만 Windows Server의 Docker는 여러 Windows Server 버전에서 실행될 수 있는 멀티 아키텍처(또는 멀티 플랫폼) 컨테이너 이미지를 지원합니다.

멀티 아키텍처 이미지를 사용하면 이미지를 다시 빌드하고 포드 사양을 변경하지 않고도 Google Kubernetes Engine(GKE) Windows Server 노드 풀을 원하는 Windows Server 버전으로 업그레이드할 수 있습니다. 예를 들면 다음과 같습니다.

  • GKE 버전 1.15는 Windows Server 1809를 지원합니다.
  • GKE 버전 1.16은 Windows Server 1909를 지원합니다.

특정 GKE 버전을 최신 버전으로 자동으로 업그레이드하려면 Windows 워크로드에 대한 멀티 아키텍처 이미지를 빌드해야 합니다. 멀티 아키텍처 이미지를 빌드하려면 각 Windows Server 버전 이미지를 빌드한 다음 각 Windows Server 버전의 해당 이미지를 참조하는 매니페스트를 빌드해야 합니다. 이미지 생성 및 빌드 프로세스를 완전히 제어하려면 이미지를 수동으로 빌드할 수 있습니다. 또는 Cloud Build를 사용하여 Windows Server 멀티 아키텍처 이미지를 자동으로 빌드할 수 있습니다.

목표

이 튜토리얼에서는 수동으로 또는 Cloud Build를 사용하여 Windows Server 멀티 아키텍처 이미지를 만드는 방법을 알아봅니다.

  • 이미지를 수동으로 빌드합니다.

    • 다양한 버전 또는 유형의 Windows Server를 사용하여 Docker 이미지 2개(예: 장기 서비스 채널[LTSC] 및 반기 채널[SAC])를 만듭니다.
    • Windows Server VM을 만듭니다.
    • 매니페스트를 만들어 레지스트리에 푸시합니다.
  • Cloud Build를 사용하여 이미지를 빌드합니다.

    • 프로젝트를 만들고, API를 사용 설정하고, 권한을 부여하여 환경을 준비합니다.
    • 애플리케이션, Dockerfile, 빌드 파일을 만듭니다.
    • 명령어를 실행하여 이미지를 빌드합니다.

비용

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

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

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

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  1. Google Cloud CLI를 설치하여 gcloud 명령어를 실행합니다.
  2. Docker를 설치하여 컨테이너를 빌드합니다.
  3. Go를 설치하여 Windows Server 바이너리를 빌드합니다.
  4. 이 튜토리얼에서는 Artifact Registry를 저장소로 사용합니다. Docker 저장소를 만들었는지 확인합니다.

수동으로 멀티 아키텍처 이미지 빌드

멀티 아키텍처 이미지를 수동으로 빌드하면 필요한 모든 Windows Server 버전이 포함된 이미지를 유연하게 빌드할 수 있습니다. 멀티 아키텍처 이미지 매니페스트를 빌드하려면 다음 안내를 따르세요.

  1. LTSC 2019 Docker 단일 아키텍처 이미지를 만듭니다. Windows Server 애플리케이션 배포에서 Docker 이미지 만들기에 대한 세부정보를 참조하세요. 예를 들면 us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2019입니다.
  2. LTSC 2022 Docker 단일 아키텍처 이미지를 만듭니다. 예를 들면 us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2022입니다.
  3. SAC 20H2 Docker 단일 아키텍처 이미지를 만듭니다. 예를 들면 us-docker.pkg.dev/my-project/docker-repo/foo:1.0-20h2입니다.
  4. Windows Server VM을 만듭니다(예: 버전 20H2). 빠른 시작: Windows Server VM 사용을 참조하세요.
  5. RDP를 사용하여 VM에 연결합니다.
  6. PowerShell 창을 열어 다음 단계에서 명령어를 실행합니다.
  7. docker manifest 실험용 기능을 사용 설정합니다. Docker 매니페스트는 레지스트리에 푸시할 이미지 목록입니다.

    PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
    
  8. 멀티 아키텍처 매니페스트를 만듭니다.

    docker manifest create `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2019 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2022 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-20h2
    
  9. 새로 만든 멀티 아키텍처 이미지 매니페스트를 Artifact Registry 저장소에 푸시합니다.

     docker manifest push `
       REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
    
  10. 멀티 아키텍처 이미지가 올바르게 빌드되고 푸시되도록 하려면 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo로 이동하여 해당 이미지를 클릭합니다. 내부에 3개의 이미지가 표시됩니다.

    • foo:1.0-2019
    • foo:1.0-2022
    • foo:1.0-20h2
    • foo:1.0

이제 포드 사양에서 멀티 아키텍처 이미지 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0을 참조할 수 있습니다. 그러면 GKE Windows 노드 풀의 자동 업그레이드를 안전하게 사용할 수 있습니다.

Cloud Build gke-windows-builder를 사용하여 멀티 아키텍처 이미지 빌드

수동 빌드 단계를 용이하게 하려면 OSS gke-windows-builder를 기반으로 gke-windows-builder를 사용하면 됩니다. gke-windows-builder를 Cloud Build와 함께 사용하여 Windows Server 멀티 아키텍처 이미지를 자동으로 빌드할 수 있습니다. GKE는 지원되는 Windows SAC 및 LTSC 버전이 새로 출시되었을 때 이를 포함하도록 빌더를 업데이트합니다. 빌더를 사용하는 또 다른 이점은 이미지를 빌드하기 위해 Powershell로 자체 Windows VM을 만들 필요가 없다는 것입니다. Windows VM은 Cloud Build 내에서 명령어를 실행하는 Docker 컨테이너로 대체됩니다.

빌더의 작동 방식을 이해하기 위해 이 예시를 따라 'hello world' 멀티 아키텍처 이미지를 빌드합니다. 이 단계는 Linux 또는 Windows 서버에서 수행할 수 있습니다.

환경 준비

환경을 준비하려면 다음 단계를 완료하세요.

  1. 작업 머신에 작업공간 디렉터리(예: ~/gke-windows-builder/hello-world)를 만듭니다.
  2. 이 튜토리얼의 프로젝트를 만들거나 선택합니다.
  3. 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.
  4. 프로젝트에 대해 Compute Engine, Cloud Build, Artifact Registry API를 사용 설정합니다. gke-windows-builder가 Cloud Build를 사용해서 호출되고, 결과 멀티 아키텍처 컨테이너 이미지는 Artifact Registry에 푸시됩니다. 빌더가 Windows Server VM을 만들고 관리할 수 있으려면 Compute Engine이 필요합니다.

    gcloud services enable compute.googleapis.com cloudbuild.googleapis.com \
      artifactregistry.googleapis.com cloudbuild.googleapis.com
    
  5. Google Cloud CLI를 사용하여 Cloud Build 서비스 계정에 다음 Identity and Access Management(IAM) 역할을 부여합니다.

    1. 변수 설정:

      export PROJECT=$(gcloud info --format='value(config.project)')
      export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
      
    2. 역할을 지정합니다. 이러한 역할은 빌더가 Windows Server VM을 만들고, 작업공간을 Cloud Storage 버킷에 복사하고, Docker 이미지를 빌드하는 네트워크를 구성하고, 결과 이미지를 Artifact Registry에 푸시하는 데 필요합니다.

      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/artifactregistry.writer'
      
  6. WinRM이 Windows Server VM에 연결하여 Docker 빌드를 실행할 수 있도록 allow-winrm-ingress라는 방화벽 규칙을 추가합니다.

    gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
    
  7. 프로젝트의 Artifact Registry에서 Docker 저장소를 만듭니다. 이전에 Artifact Registry에서 Docker 저장소를 사용한 적이 없으면 먼저 Docker 빠른 시작을 완료하세요. 다음 명령어를 실행하여 저장소를 만듭니다.

    gcloud artifacts repositories create REPOSITORY \
      --repository-format=docker --location=REGISTRY_REGION \
      --description="Docker repository"
    

    다음을 바꿉니다.

작업공간에서 hello.exe 바이너리 만들기

이 튜토리얼에서는 Go로 작성된 간단한 'hello world' 애플리케이션을 만듭니다. 샘플 앱의 코드는 GitHub에 있습니다.

  1. 다음 명령어를 사용하여 이 튜토리얼의 샘플 코드가 포함된 저장소를 로컬 머신에 클론합니다.

     git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
     cd kubernetes-engine-samples/windows/windows-multi-arch
    
  2. hello.go 파일이 'Hello World'라는 단어를 출력합니다.

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hello World!")
    }
    
  3. hello.exe 바이너리를 생성합니다.

    GOOS=windows go build hello.go
    

작업공간에 hello.exe 바이너리가 표시됩니다.

작업공간에서 Dockerfile 및 빌드 파일 만들기

이 섹션에서는 Dockerfile을 사용하여 각 단일 아키텍처 Windows Server 이미지를 빌드한 다음 빌드 파일을 사용하여 Cloud Build를 트리거합니다. 빌드는 단일 아키텍처 이미지를 멀티 아키텍처 이미지로 결합합니다.

  1. Dockerfile은 Docker로 이미지를 빌드하기 위한 안내가 포함된 텍스트 문서입니다. gke-windows-builder는 WINDOWS_VERSION을 이미지를 빌드할 특정 Windows Server 버전으로 바꿉니다. 예를 들어 빌더는 Windows Server 20H2에서 docker build -t multi-arch-helloworld:latest_20h2 --build-arg WINDOWS_VERSION=20H2 .를 실행합니다.

    ARG WINDOWS_VERSION=
    FROM mcr.microsoft.com/windows/servercore:${WINDOWS_VERSION}
    COPY hello.exe /hello.exe
    USER ContainerUser
    ENTRYPOINT ["hello.exe"]
  2. Dockerfile이 포함된 동일한 디렉터리에서 cloudbuild.yaml 파일은 빌드 구성 파일입니다. <REPOSITORY><REGISTRY_REGION>을 이전 단계에서 만든 Artifact Registry 저장소의 이름 및 리전으로 바꿉니다. 빌드 시 Cloud Build는 자동으로 $PROJECT_ID를 프로젝트 ID로 바꿉니다.

    timeout: 3600s
    steps:
    - name: 'us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest'
      args:
      - --container-image-name
      # Replace <REGISTRY_REGION> and <REPOSITORY>.
      - '<REGISTRY_REGION>-docker.pkg.dev/$PROJECT_ID/<REPOSITORY>/multiarch-helloworld:latest'
      # Specify specific variants of images to be built. Or, remove the following 2 lines to default to all available variants.
      - --versions
      - '20H2,ltsc2019'

이미지 빌드

이제 이미지를 빌드하고 로그를 보고 성공적인 빌드를 확인할 수 있습니다.

  1. 이미지를 빌드하려면 다음 명령어를 실행하세요.

    gcloud builds submit --config=cloudbuild.yaml .
    
  2. 다음 예시와 같은 로그가 표시됩니다. 로그의 마지막 행은 빌드가 성공했음을 보여줍니다.

    Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression.
    Uploading tarball of [.] to [gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz]
    Created [https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds/ec333452-1301-47e8-90e2-716aeb2f5650].
    Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665].
    ------------------------ REMOTE BUILD OUTPUT---------------------------------------
    ...
    ...
    
    Created manifest list REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest
    sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02
    2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully
    PUSH
    DONE
    -----------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                      IMAGES  STATUS
    ec333452-1301-47e8-90e2-716aeb2f5650  2020-09-14T11:21:43+00:00  12M43S    gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz  -                 SUCCESS
    

빌드 구성 파일을 사용하여 이미지를 빌드하고 이미지를 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest의 Artifact Registry에 푸시했습니다.

이미지 배포

멀티 아키텍처 Windows 이미지를 클러스터에 배포하려면 Windows Server 애플리케이션 배포를 참조하여 이미지를 배포하는 방법을 알아보세요.

고급 gke-windows-builder 사용

cloudbuild.yaml 빌드 구성 파일의 args 섹션에 플래그를 추가하여 gke-windows-builder 동작을 맞춤설정할 수 있습니다. 이 섹션에서는 일부 일반적인 동작의 플래그에 대해 설명하지만, 이것이 전체 목록이 아닙니다. gke-windows-builder에서 지원되는 전체 플래그 목록을 보려면 Linux 서버 또는 Cloud Shell에서 다음 명령어를 실행하세요.

docker run -it us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest --help

Windows 인스턴스용으로 더 큰 머신 유형을 사용하면 빌드 속도를 높일 수 있습니다.

  - --machineType
  - 'n1-standard-8'

GKE가 지원하는 모든 Windows 버전의 이미지를 빌드하는 대신 --versions 플래그를 사용하여 빌드할 특정 Windows Server 버전을 선택할 수 있습니다.

  - --versions
  - '20H2,ltsc2019'

작업공간에 파일이 여러 개 있는 경우 WinRM이 아닌 Cloud Storage를 통해 작업공간을 복사하도록 빌더를 구성하면 이미지 빌드가 더 안정적입니다. 프로젝트에 gs://{your project}_builder과 같은 버킷을 만들고 --workspace-bucket 플래그를 설정합니다.

  - --workspace-bucket
  - '{your project}_builder'

공유 VPC 서비스 프로젝트에서 Windows 빌더 인스턴스를 실행하려면 인스턴스의 네트워크 설정을 제어하는 다음 플래그를 사용합니다.

  - --subnetwork-project
  - 'shared-vpc-host-project'
  - --subnetwork
  - 'host-project-subnet-shared-with-service-project'

삭제

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

이미지 삭제

Artifact Registry에서 multiarch-helloworld 이미지를 삭제하려면 이미지 삭제를 참조하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

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

    리소스 관리로 이동

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

다음 단계